home · contact · privacy
Add /join and /privmsg to channels, beyond just single-user queries. master
authorChristian Heller <c.heller@plomlompom.de>
Mon, 11 Aug 2025 08:54:36 +0000 (10:54 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 11 Aug 2025 08:54:36 +0000 (10:54 +0200)
ircplom/client.py
ircplom/client_tui.py

index bbcec40e46323847071c2a19b49772b554a15d42..7526f9fe4fe96b59ee50eab945c3cc28c8920ed9 100644 (file)
@@ -228,7 +228,7 @@ class Client(ABC, ClientQueueMixin):
         self.conn.send(msg)
         if to_log:
             if isinstance(log_target, str):
         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)
                           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,
                 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):
             case 'CAP':
                 if (result := self._caps.process_msg(msg.params[1:])):
                     if isinstance(result, str):
index d9bd76f00bc8be3867eac501960863585f68f0f3..efb34c04141283dd6c54959fcaa8687a761a3950 100644 (file)
@@ -12,6 +12,7 @@ from ircplom.client import (IrcConnSetup, Client, ClientQueueMixin, LogScope,
                             NewClientEvent)
 
 CMD_SHORTCUTS['disconnect'] = 'window.disconnect'
                             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'
 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,))
 
         '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)
     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
 
 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)
         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:
 
     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
 
 
 @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})
 
         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 = {'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
 
         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)\
         '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 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.'
 
     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:
         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)
 
             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:
             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)
 
             return [m.window(target)]
         return super()._log_target_wins(**kwargs)