From: Christian Heller Date: Thu, 21 Aug 2025 02:46:15 +0000 (+0200) Subject: By automatically setting .nick_wanted on .nickname, reduce special cases. X-Git-Url: https://plomlompom.com/repos/blog?a=commitdiff_plain;h=7a6df54ef5637137785687e86b48e87fe718bcfa;p=ircplom By automatically setting .nick_wanted on .nickname, reduce special cases. --- diff --git a/ircplom/client.py b/ircplom/client.py index 291f596..c32e755 100644 --- a/ircplom/client.py +++ b/ircplom/client.py @@ -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): diff --git a/ircplom/client_tui.py b/ircplom/client_tui.py index 3f40fbf..bf25977 100644 --- a/ircplom/client_tui.py +++ b/ircplom/client_tui.py @@ -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.'