From: Christian Heller Date: Mon, 11 Aug 2025 08:54:36 +0000 (+0200) Subject: Add /join and /privmsg to channels, beyond just single-user queries. X-Git-Url: https://plomlompom.com/repos/booking/%7B%7B%20web_path%20%7D%7D/%7B%7Bprefix%7D%7D/ledger?a=commitdiff_plain;h=7399cebcdcda37bd147db4feadf75634bec980e5;p=ircplom Add /join and /privmsg to channels, beyond just single-user queries. --- diff --git a/ircplom/client.py b/ircplom/client.py index bbcec40..7526f9f 100644 --- a/ircplom/client.py +++ b/ircplom/client.py @@ -228,7 +228,7 @@ class Client(ABC, ClientQueueMixin): self.conn.send(msg) if to_log: if isinstance(log_target, str): - self._log(to_log, scope=LogScope.CHAT, nickname=log_target, + self._log(to_log, scope=LogScope.CHAT, target=log_target, out=True) else: self._log(to_log, scope=log_target) @@ -269,7 +269,8 @@ class Client(ABC, ClientQueueMixin): self.update_login(nickname=msg.params[0], nick_confirmed=True) case 'PRIVMSG': self._log(msg.params[-1], scope=LogScope.CHAT, out=False, - nickname=msg.source.split('!')[0]) + sender=msg.source.split('!')[0], + channel=msg.params[0]) case 'CAP': if (result := self._caps.process_msg(msg.params[1:])): if isinstance(result, str): diff --git a/ircplom/client_tui.py b/ircplom/client_tui.py index d9bd76f..efb34c0 100644 --- a/ircplom/client_tui.py +++ b/ircplom/client_tui.py @@ -12,6 +12,7 @@ from ircplom.client import (IrcConnSetup, Client, ClientQueueMixin, LogScope, NewClientEvent) CMD_SHORTCUTS['disconnect'] = 'window.disconnect' +CMD_SHORTCUTS['join'] = 'window.join' CMD_SHORTCUTS['nick'] = 'window.nick' CMD_SHORTCUTS['privmsg'] = 'window.privmsg' CMD_SHORTCUTS['reconnect'] = 'window.reconnect' @@ -47,6 +48,10 @@ class _ClientWindow(Window, ClientQueueMixin): 'Attempt nickname change.' self._send_msg('NICK', (new_nick,)) + def cmd__join(self, channel: str) -> None: + 'Attempt joining a channel.' + self._send_msg('JOIN', (channel,)) + def cmd__privmsg(self, target: str, msg: str) -> None: 'Send chat message msg to target.' self._send_msg('PRIVMSG', (target, msg), log_target=target, to_log=msg) @@ -81,14 +86,14 @@ class _PrivmsgPromptWidget(PromptWidget): class _PrivmsgWindow(_ClientWindow): prompt: _PrivmsgPromptWidget - def __init__(self, nickname: str, **kwargs) -> None: - self.nickname = nickname + def __init__(self, chatname: str, **kwargs) -> None: + self.chatname = chatname super().__init__(**kwargs) - self._title = f'{self.client_id} {self.nickname}' + self._title = f'{self.client_id} {self.chatname}' def cmd__chat(self, msg: str) -> None: - 'PRIVMSG to target identified by .nickname.' - self.cmd__privmsg(target=self.nickname, msg=msg) + 'PRIVMSG to target identified by .chatname.' + self.cmd__privmsg(target=self.chatname, msg=msg) @dataclass @@ -107,27 +112,27 @@ class _ClientWindowsManager: to_set = win.prompt.prefix_update_keys() win.prompt.update_prefix(**{k: getattr(self, k) for k in to_set}) - def _new_win(self, scope: LogScope, nickname: str = '') -> _ClientWindow: + def _new_win(self, scope: LogScope, chatname: str = '') -> _ClientWindow: kwargs = {'scope': scope, 'log': self.log, 'win_cls': _ClientWindow} if scope == LogScope.CHAT: kwargs['win_cls'] = _PrivmsgWindow - kwargs['nickname'] = nickname + kwargs['chatname'] = chatname win = self._tui_new_window(**kwargs) if isinstance(win, _PrivmsgWindow): self._prompt_update(win) self.windows += [win] return win - def window(self, scope: LogScope, nickname: str = '') -> _ClientWindow: + def window(self, scope: LogScope, chatname: str = '') -> _ClientWindow: 'Return client window of scope.' for win in [w for w in self.windows if w.scope == scope]: if scope == LogScope.CHAT: if isinstance(win, _PrivmsgWindow)\ - and win.nickname == nickname: + and win.chatname == chatname: return win continue return win - return self._new_win(scope=scope, nickname=nickname) + return self._new_win(scope=scope, chatname=chatname) def log(self, msg: str, scope: LogScope, **kwargs) -> None: 'From parsing scope, kwargs, build prefix before sending to logger.' @@ -137,7 +142,7 @@ class _ClientWindowsManager: else: prefix += _LOG_PREFIX_SERVER if scope == LogScope.CHAT: - nickname = self.nickname if kwargs['out'] else kwargs['nickname'] + nickname = self.nickname if kwargs['out'] else kwargs['sender'] prefix += f' [{nickname}]' self._tui_log(msg, scope=scope, prefix=prefix, **kwargs) @@ -176,7 +181,9 @@ class ClientTui(BaseTui): if target == LogScope.SERVER: return [m.window(LogScope.SERVER), m.window(LogScope.RAW)] if target == LogScope.CHAT: - return [m.window(LogScope.CHAT, nickname=kwargs['nickname'])] + chatname = (kwargs['target'] if kwargs['out'] + else kwargs.get('channel', kwargs['sender'])) + return [m.window(LogScope.CHAT, chatname=chatname)] return [m.window(target)] return super()._log_target_wins(**kwargs)