home · contact · privacy
By automatically setting .nick_wanted on .nickname, reduce special cases.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 21 Aug 2025 02:46:15 +0000 (04:46 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 21 Aug 2025 02:46:15 +0000 (04:46 +0200)
ircplom/client.py
ircplom/client_tui.py

index 291f596f7d07b821b3348dff70952fe3e10e8e1c..c32e75540d07cc709645235cda11b5c1130acc51 100644 (file)
@@ -43,19 +43,19 @@ _EXPECTATIONS: list[_MsgParseExpectation] = []
 _EXPECTATIONS += [
     _MsgParseExpectation(_MsgTok.SERVER,
                          '001',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '002',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '003',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '004',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY,
                           _MsgTok.ANY,
                           _MsgTok.ANY,
@@ -63,54 +63,54 @@ _EXPECTATIONS += [
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '250',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '251',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '252',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY,
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '253',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY,
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '254',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY,
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '255',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '265',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '265',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY,
                           _MsgTok.ANY,
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '266',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '266',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY,
                           _MsgTok.ANY,
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '375',  # RPL_MOTDSTART already implied by 1st 372
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
 ]
 
@@ -118,21 +118,21 @@ _EXPECTATIONS += [
 _EXPECTATIONS += [
     _MsgParseExpectation(_MsgTok.SERVER,
                          '005',  # RPL_ISUPPORT
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, ':isupports'),
                           _MsgTok.ANY),
                          idx_into_list=1),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '372',  # RPL_MOTD
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, ':line'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '376',  # RPL_ENDOFMOTD
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '396',  # RPL_VISIBLEHOST
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, ':host_maybe_w_user'),
                           _MsgTok.ANY)),
 ]
@@ -141,17 +141,17 @@ _EXPECTATIONS += [
 _EXPECTATIONS += [
     _MsgParseExpectation(_MsgTok.SERVER,
                          '900',  # RPL_LOGGEDIN
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.USER_ADDRESS, ':full_address'),
                           (_MsgTok.ANY, 'set_db_attr:sasl_account'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '903',  # RPL_SASLSUCCESS
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, 'set_db_attr:sasl_auth_state'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '904',  # ERR_SASLFAIL
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, 'set_db_attr:sasl_auth_state'))),
     _MsgParseExpectation(_MsgTok.NONE,
                          'AUTHENTICATE',
@@ -162,12 +162,12 @@ _EXPECTATIONS += [
 _EXPECTATIONS += [
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('NEW', ':subverb'),
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('DEL', ':subverb'),
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
@@ -177,7 +177,7 @@ _EXPECTATIONS += [
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('ACK', ':subverb'),
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
@@ -187,7 +187,7 @@ _EXPECTATIONS += [
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('NAK', ':subverb'),
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
@@ -203,12 +203,12 @@ _EXPECTATIONS += [
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('LS', ':subverb'),
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('LS', ':subverb'),
                           ('*', ':tbc'),
                           (_MsgTok.LIST, ':items'))),
@@ -226,12 +226,12 @@ _EXPECTATIONS += [
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('LIST', ':subverb'),
                           (_MsgTok.LIST, ':items'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'CAP',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           ('LIST', ':subverb'),
                           ('*', ':tbc'),
                           (_MsgTok.LIST, ':items'))),
@@ -246,7 +246,7 @@ _EXPECTATIONS += [
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '432',  # ERR_ERRONEOUSNICKNAME
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           _MsgTok.NICKNAME,
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
@@ -263,13 +263,13 @@ _EXPECTATIONS += [
 _EXPECTATIONS += [
     _MsgParseExpectation(_MsgTok.SERVER,
                          '353',  # RPL_NAMREPLY
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           '=',
                           (_MsgTok.CHANNEL, ':channel'),
                           (_MsgTok.LIST, ':names'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          '366',  # RPL_ENDOFNAMES
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.CHANNEL, ':channel'),
                           _MsgTok.ANY)),
     _MsgParseExpectation((_MsgTok.USER_ADDRESS, ':joiner'),
@@ -288,7 +288,7 @@ _EXPECTATIONS += [
 _EXPECTATIONS += [
     _MsgParseExpectation(_MsgTok.SERVER,
                          '401',  # ERR_NOSUCKNICK
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.NICKNAME, ':target'),
                           _MsgTok.ANY)),
     _MsgParseExpectation(_MsgTok.SERVER,
@@ -297,11 +297,11 @@ _EXPECTATIONS += [
                           (_MsgTok.ANY, ':message'))),
     _MsgParseExpectation(_MsgTok.SERVER,
                          'NOTICE',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, ':message'))),
     _MsgParseExpectation((_MsgTok.USER_ADDRESS, ':sender'),
                          'NOTICE',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, ':message'))),
     _MsgParseExpectation((_MsgTok.USER_ADDRESS, ':sender'),
                          'NOTICE',
@@ -309,7 +309,7 @@ _EXPECTATIONS += [
                           (_MsgTok.ANY, ':message'))),
     _MsgParseExpectation((_MsgTok.USER_ADDRESS, ':sender'),
                          'PRIVMSG',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, ':message'))),
     _MsgParseExpectation((_MsgTok.USER_ADDRESS, ':sender'),
                          'PRIVMSG',
@@ -324,11 +324,11 @@ _EXPECTATIONS += [
                          ((_MsgTok.ANY, 'set_db_attr:connection_state'),)),
     _MsgParseExpectation(_MsgTok.NICKNAME,
                          'MODE',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, 'set_db_attr:user_modes'))),
     _MsgParseExpectation(_MsgTok.USER_ADDRESS,
                          'MODE',
-                         ((_MsgTok.NICKNAME, 'set_nick:my_nickname'),
+                         ((_MsgTok.NICKNAME, 'set_db_attr:nickname'),
                           (_MsgTok.ANY, 'set_db_attr:user_modes'))),
     _MsgParseExpectation(_MsgTok.NONE,
                          'PING',
@@ -662,6 +662,11 @@ class _ClientDb(_Db, SharedClientDbFields):
     _completable_motd: _CompletableStringsList
     _channels: dict[str, _ChannelDb]
 
+    def __setattr__(self, key: str, value) -> None:
+        super().__setattr__(key, value)
+        if key == 'nickname':
+            self.nick_wanted = value
+
     def needs_arg(self, key: str) -> bool:
         'Reply if attribute of key may reasonably be addressed without an arg.'
         return not isinstance(getattr(self, key), (bool, int, str, tuple))
@@ -862,8 +867,6 @@ class Client(ABC, ClientQueueMixin):
             for arg in args:
                 if task == 'set_db_attr':
                     setattr(self._db, arg, ret[arg])
-                elif task == 'set_nick':
-                    self.set_nick(ret[arg], confirmed=True)
         if ret['verb'] == '005':   # RPL_ISUPPORT
             for item in ret['isupports']:
                 toks = item.split('=', maxsplit=1)
@@ -891,15 +894,15 @@ class Client(ABC, ClientQueueMixin):
                       target=ret['target'], alert=True)
         elif ret['verb'] == '432':  # ERR_ERRONEOUSNICKNAME
             alert = 'nickname refused for bad format'
-            if 'my_nickname' not in ret:
+            if 'nickname' not in ret:
                 alert += ', giving up'
                 self.close()
             self._log(alert, alert=True)
         elif ret['verb'] == '433':  # ERR_NICKNAMEINUSE
             self._log('nickname already in use, trying increment', alert=True)
-            self.set_nick(self._db.nick_incremented)
+            self.send(IrcMessage('NICK', params=(self._db.nick_incremented,)))
         elif ret['verb'] == '900':  # RPL_LOGGEDIN
-            self.set_nick(ret['full_address'][0], True)
+            self._db.nickname = ret['full_address'][0]
             self._db.username, self._db.client_host = ret['full_address'][1:]
         elif ret['verb'] in {'903', '904'}:  # RPL_SASLSUCCESS, ERR_SASLFAIL
             self._caps.end_negotiation()
@@ -930,7 +933,7 @@ class Client(ABC, ClientQueueMixin):
                                                         ret['joiner'][0], True)
         elif ret['verb'] == 'NICK':
             if ret['named'][0] == self._db.nickname:
-                self.set_nick(ret['nickname'], confirmed=True)
+                self._db.nickname = ret['nickname']
             else:
                 for id_, ch in self._db.chans_of_user(ret['named'][0]).items():
                     ch.remove_completable('users', ret['named'][0], True)
@@ -942,7 +945,7 @@ class Client(ABC, ClientQueueMixin):
                     'as_notice': msg.verb == 'NOTICE'}
             if 'sender' in ret:  # not just server message
                 kw |= {'sender': ret['sender'][0], 'scope': LogScope.CHAT,
-                       'target': (ret['sender'][0] if 'my_nickname' in ret
+                       'target': (ret['sender'][0] if 'nickname' in ret
                                   else ret['channel']['id'])}
             self._log(ret['message'], out=False, **kw)
         elif ret['verb'] == 'PART':
@@ -963,14 +966,6 @@ class Client(ABC, ClientQueueMixin):
                 self._log(f'{ret["quitter"][0]} quits: {ret["message"]}',
                           LogScope.CHAT, target=id_)
 
-    def set_nick(self, nickname: str, confirmed=False) -> None:
-        'Set ClientDb\'s .nick wanted, send NICK if != .nickname.'
-        if confirmed:
-            self._db.nickname = nickname
-        self._db.nick_wanted = nickname
-        if self.conn and self._db.nick_wanted != self._db.nickname:
-            self.send(IrcMessage(verb='NICK', params=(self._db.nick_wanted,)))
-
 
 @dataclass
 class NewClientEvent(AffectiveEvent):
index 3f40fbf7851173ff043bc366c571d75a243d49a4..bf259770b2cdebf441d8324fa307fc029d9ad4fe 100644 (file)
@@ -50,7 +50,7 @@ class _ClientWindow(Window, ClientQueueMixin):
 
     def cmd__nick(self, new_nick: str) -> None:
         'Attempt nickname change.'
-        self._client_trigger('set_nick', nickname=new_nick)
+        self._send_msg('NICK', (new_nick,))
 
     def cmd__join(self, channel: str) -> None:
         'Attempt joining a channel.'