on_update=lambda k: self._on_update(name, k))
return self._channels[name]
+ def chans_of_user(self, user: str) -> dict[str, _ChannelDb]:
+ 'Return part of channels dictionary for channels user is currently in.'
+ return {k: v for k, v in self._channels.items() if user in v.users}
+
def process_isupport(self, params: tuple[str, ...]) -> None:
'Process 005 RPL_ISUPPORT params into dictionary updates.'
for param in params[1:-1]:
if len(toks) != 3:
break
to_return[key_nick] = toks[0]
-: elif ex_tok is _MsgTok.ANY:
+ elif ex_tok is _MsgTok.ANY:
to_return['any'] = msg_tok
- if ex_tok in {_MsgTok.NICKNAME_ME, _MsTok.USER_ADDRESS_ME}:
+ if ex_tok in {_MsgTok.NICKNAME_ME, _MsgTok.USER_ADDRESS_ME}:
if to_return[key_nick] != self._db.nickname:
break
to_return[f'{key_nick}_me'] = to_return[key_nick]
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)
+ for nom, chan in self._db.chans_of_user(ret['sender']).items():
+ 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=nom)
elif (ret := self._match_msg(msg, 'NOTICE'))\
and (msg.params[0] != '*' or not self._db.nickname):
kw = {'sender': ret['sender'], 'scope': LogScope.CHAT
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'], True)
- self._log(f'{ret["sender"]} quits: {ret["any"]}',
- scope=LogScope.CHAT, target=chan_name)
+ for nom, chan in self._db.chans_of_user(ret['sender']).items():
+ chan.remove_completable('users', ret['sender'], True)
+ self._log(f'{ret["sender"]} quits: {ret["any"]}',
+ scope=LogScope.CHAT, target=nom)
else:
self._log(f'PLEASE IMPLEMENT HANDLER FOR: {msg.raw}')