def affect(self, target: 'Client') -> None:
target.log(msg='# connected to server', chat=CHAT_GLOB)
+ target.send(IrcMessage(verb='CAP', params=('LS', '302')))
target.send(IrcMessage(verb='USER', params=(getuser(), '0', '*',
target.realname)))
target.send(IrcMessage(verb='NICK', params=(target.nickname,)))
self._hostname = hostname
self._socket: Optional[socket] = None
self._recv_loop: Optional[Loop] = None
+ self._caps: list[str] = []
self.id_ = uuid4()
self.assumed_open = False
self.realname = realname
Thread(target=connect, daemon=True, args=(self,)).start()
+ def set_caps(self, final_line: bool, caps: list[str]) -> None:
+ 'Record server capabilities.'
+ finished_marker = '\0'
+ if self._caps[-1:] == [finished_marker]:
+ self._caps.clear()
+ self._caps += caps
+ if final_line:
+ self._caps += [finished_marker]
+ self.log(f'# server capabilities: {self._caps[:-1]}')
+
@abstractmethod
def log(self, msg: str, chat: str = '') -> None:
'''Write msg into log of chat, whatever shape that may have.
if first_run or nick_confirmed != self.nick_confirmed:
self.nick_confirmed = nick_confirmed
if not first_run:
- self.log(
- msg=f'{prefix} {"" if nick_confirmed else "un"}confirmed')
+ self.log(f'{prefix} {"" if nick_confirmed else "un"}confirmed')
def close(self) -> None:
'Close both recv Loop and socket.'
target.update_login(nickname=msg.params[0], nick_confirmed=True)
elif msg.verb == 'PRIVMSG':
target.log(msg=str(msg.params), chat=msg.source)
+ elif msg.verb == 'CAP' and msg.params[1] == 'LS':
+ final_line = msg.params[2] != '*'
+ target.set_caps(final_line=final_line,
+ caps=msg.params[-1].strip().split())
+ if final_line:
+ target.send(IrcMessage(verb='CAP', params=('END',)))