del self._dict[key_to_unset]
return (value_changed, confirm_changed)
- def append(self, key, value: str) -> None:
- 'To list[str] keyed by key, append value.'
- appendable = self.get_force(key)[0]
- assert isinstance(appendable, list)
- appendable.append(value)
+ def append(self, key: str, value: str) -> None:
+ 'To list[str] keyed by key, append value; if non-existant, create it.'
+ targeted = self.get_force(key)[0]
+ if isinstance(targeted, list):
+ targeted.append(value)
+ elif targeted is None:
+ self._dict[self._unconf_key(key)] = [value]
+ else:
+ raise Exception
def get_force(self, key: str) -> tuple[Optional[int | str | list[str]],
bool]:
self._db.set('port', PORT_SSL, confirm=True)
self.client_id = self._db.hostname
self._caps = _CapsManager(self.send, self._db)
+ self._prev_verb = ''
super().__init__(client_id=self.client_id, **kwargs)
self._start_connecting()
self._log(msg.raw, scope=LogScope.RAW, out=True)
def _update_db(self, key: str, value: Optional[int | str], confirm: bool
- ) -> None:
+ ) -> tuple[bool, bool]:
'Wrap ._db.set into something accessible to subclass extension.'
- self._db.set(key, value, confirm)
+ return self._db.set(key, value, confirm)
def close(self) -> None:
'Close both recv Loop and socket.'
def handle_msg(self, msg: IrcMessage) -> None:
'Log msg.raw, then process incoming msg into appropriate client steps.'
self._log(msg.raw, scope=LogScope.RAW, out=False)
+ if msg.verb != self._prev_verb and self._prev_verb == '005':
+ self._update_db('isupports', None, True)
+ self._prev_verb = msg.verb
numerics_to_ignore = []
for min_, max_ in _NUMERIC_RANGES_TO_IGNORE:
numerics_to_ignore += list(range(min_, max_ + 1))
match msg.verb:
case '001' | 'NICK':
self._update_db('nickname', value=msg.params[0], confirm=True)
+ case '005':
+ if self._db.isupports:
+ self._db.set('isupports', [], False)
+ for param in msg.params[1:-1]:
+ self._db.append('isupports', param)
case '375':
self._db.set('motd', [], False)
case '372':
changes = self._db.set(key, value, confirmed)
for i, t in enumerate((('', value), ('confirmation of ', confirmed))):
if changes[i]:
+ announcement = f'changing {t[0]}{key} to:'
+ if isinstance(t[1], list):
+ self.log(announcement, scope=scope)
+ for item in t[1]:
+ self.log(f' {item}', scope=scope)
+ continue
self.log(f'changing {t[0]}{key} to: [{t[1]}]', scope=scope)
for win in [w for w in self.windows
if isinstance(w, _ChatWindow)]:
def _update_db(self, key: str, value: Optional[int | str], confirm: bool
) -> None:
- super()._update_db(key, value, confirm)
+ value_changed, _ = super()._update_db(key, value, confirm)
+ if value is None and not value_changed: # local ._db may have fallback
+ value = self._db.get_force(key)[0] # values Tui._db doesn't
self._client_tui_trigger('update', scope=LogScope.SERVER,
key=key, value=value, confirmed=confirm)