class _UpdatingDict(Dict[DictItem], _UpdatingNode):
+ def items(self) -> tuple[tuple[str, DictItem], ...]:
+ 'Key-value pairs of item registrations.'
+ return tuple((k, v) for k, v in self._dict.items())
+
def _get(self, key: str):
if key not in self._dict:
self._dict[key] = self._item_cls()
if super().set_and_check_for_change(update):
if update.path == ('topic',):
msg = f'raw:{self.topic.who} set topic to: {self.topic.what}'
- return (self._scope(update.path), msg)
+ return self._scope(update.path), msg
return None
class _UpdatingNickUserHost(_UpdatingNode, NickUserHost):
- pass
+ log_scopes = {('nick',): LogScope.NICKNAME}
+ prev_nick = '?'
+
+ @property
+ def prev(self) -> str:
+ 'Return .nickuserhost with .prev_nick as .nick.'
+ return str(NickUserHost(self.prev_nick, self.user, self.host))
+
+ def __setattr__(self, key: str, value) -> None:
+ if key == 'nick':
+ self.prev_nick = self.nick
+ super().__setattr__(key, value)
class _UpdatingServerCapability(_UpdatingNode, ServerCapability):
return win
return self._new_win(scope=scope, chatname=chatname)
+ def windows_for_userid(self, user_id: str) -> list[_ClientWindow]:
+ 'Return windows interacting with userid (all if "me").'
+ if user_id == 'me':
+ return self.windows[:]
+ chan_names = [c for c, v in self.db.channels.items()
+ if user_id in v.user_ids]
+ return [w for w in self.windows
+ if isinstance(w, _ChatWindow)
+ and ((isinstance(w, _ChannelWindow)
+ and w.chatname in chan_names)
+ or (not isinstance(w, _ChannelWindow)
+ and w.chatname in {
+ self.db.users[user_id].nick,
+ self.db.users[user_id].prev_nick}))]
+
def log(self, msg: str, scope: LogScope, **kwargs) -> None:
'From parsing scope, kwargs, build prefix before sending to logger.'
first_char = '$'
scope, value = result
log_path = ':'.join(update.path)
log_kwargs: dict[str, Any] = {'scope': scope}
- if scope is LogScope.CHAT:
+ if scope in {LogScope.CHAT, LogScope.NICKNAME}:
log_kwargs |= {'target': update.path[1]}
if value is None:
self.log(f'{log_path} cleared', **log_kwargs)
+ elif scope is LogScope.NICKNAME:
+ self.log(f'{self.db.users[update.path[1]].prev} renames {value}',
+ **log_kwargs)
elif isinstance(value, dict):
for verb, item in [(k, v) for k, v in value.items() if v]:
toks = verb.split(':', maxsplit=1)
if kwargs['target'] != m.db.users['me'].nick
else kwargs['sender'])
return [m.window(LogScope.CHAT, chatname=chatname)]
+ if scope == LogScope.NICKNAME:
+ return m.windows_for_userid(kwargs['target'])
return [m.window(scope)]
return super()._log_target_wins(**kwargs)