params=(_MsgTok.NICKNAME_ME, _MsgTok.ANY)),
_MsgParseExpectation(_MsgTok.USER_ADDRESS_ME, 'NICK',
params=(_MsgTok.NICKNAME,)),
+ _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'NICK',
+ params=(_MsgTok.NICKNAME,)),
_MsgParseExpectation(_MsgTok.USER_ADDRESS, 'NOTICE', 2),
_MsgParseExpectation(_MsgTok.SERVER, 'NOTICE', 2),
_MsgParseExpectation(_MsgTok.USER_ADDRESS_ME, 'PART',
elif (ret := self._match_msg(msg, 'MODE')):
self._db.user_modes = ret['any']
elif (ret := self._match_msg(msg, 'NICK')):
- self.set_nick(ret['nickname'], confirmed=True)
+ if 'sender_me' in ret:
+ self.set_nick(ret['nickname'], confirmed=True)
+ else:
+ for chan_name in self._db.chan_names:
+ chan = self._db.chan(chan_name)
+ if ret['sender'] in chan.users:
+ chan.remove_completable('users', ret['sender'], True)
+ chan.append_completable('users', ret['nickname'], True)
+ self._log(f'{ret["sender"]} becomes {ret["nickname"]}',
+ scope=LogScope.CHAT, target=chan_name)
elif (ret := self._match_msg(msg, 'NOTICE'))\
and (msg.params[0] != '*' or not self._db.nickname):
kw = {'sender': ret['sender'], 'scope': LogScope.CHAT
if 'sender_me' in ret:
self._db.del_chan(ret['ch_name'])
else:
- ret['channel'].remove_completable('users', ret['sender'],
- stay_complete=True)
+ ret['channel'].remove_completable('users', ret['sender'], True)
elif (ret := self._match_msg(msg, 'PING')):
self.send(IrcMessage(verb='PONG', params=(ret['any'],)))
elif (ret := self._match_msg(msg, 'QUIT')):
for chan_name in self._db.chan_names:
chan = self._db.chan(chan_name)
if ret['sender'] in chan.users:
- chan.remove_completable('users', ret['sender'],
- stay_complete=True)
+ chan.remove_completable('users', ret['sender'], True)
self._log(f'{ret["sender"]} quits: {ret["any"]}',
scope=LogScope.CHAT, target=chan_name)
else: