home · contact · privacy
Also define PRIVMSG and NOTICE handlings into new scheme.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 19 Aug 2025 19:18:28 +0000 (21:18 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 19 Aug 2025 19:18:28 +0000 (21:18 +0200)
ircplom/client.py

index 639ce14de8a9803035d2a354e29ea14a0c83fcb2..db728003c0c2248e2801858ac6f386d5e4ccf30a 100644 (file)
@@ -87,14 +87,19 @@ _EXPECTATIONS: tuple[_MsgParseExpectation, ...] = (
                         params=(_MsgTok.CHANNEL,)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'JOIN',
                         params=(_MsgTok.CHANNEL,)),
+   _MsgParseExpectation(_MsgTok.NICKNAME_ME, 'MODE',
+                        params=(_MsgTok.NICKNAME_ME, _MsgTok.ANY)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS_ME, 'MODE',
                         params=(_MsgTok.NICKNAME_ME, _MsgTok.ANY)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS_ME, 'NICK',
                         params=(_MsgTok.NICKNAME,)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'NICK',
                         params=(_MsgTok.NICKNAME,)),
-   _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'NOTICE', 2),
-   _MsgParseExpectation(_MsgTok.SERVER, 'NOTICE', 2),
+   _MsgParseExpectation(_MsgTok.SERVER, 'NOTICE', params=('*', _MsgTok.ANY)),
+   _MsgParseExpectation(_MsgTok.SERVER, 'NOTICE',
+                        params=(_MsgTok.NICKNAME, _MsgTok.ANY)),
+   _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'NOTICE',
+                        params=(_MsgTok.NICKNAME_ME, _MsgTok.ANY)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS_ME, 'PART',
                         params=(_MsgTok.CHANNEL,)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'PART',
@@ -102,8 +107,10 @@ _EXPECTATIONS: tuple[_MsgParseExpectation, ...] = (
    _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'PART',
                         params=(_MsgTok.CHANNEL, _MsgTok.ANY)),
    _MsgParseExpectation(_MsgTok.NONE, 'PING', params=(_MsgTok.ANY,)),
-   _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'PRIVMSG', 2),
-   _MsgParseExpectation(_MsgTok.SERVER, 'PRIVMSG', 2),
+   _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'PRIVMSG',
+                        params=(_MsgTok.NICKNAME_ME, _MsgTok.ANY)),
+   _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'PRIVMSG',
+                        params=(_MsgTok.CHANNEL, _MsgTok.ANY)),
    _MsgParseExpectation(_MsgTok.USER_ADDRESS, 'QUIT', params=(_MsgTok.ANY,)),
 )
 
@@ -615,7 +622,7 @@ class Client(ABC, ClientQueueMixin):
                     to_return |= {'ch_name': msg_tok,
                                   'channel': self._db.chan(msg_tok)}
                 elif ex_tok in {_MsgTok.NICKNAME, _MsgTok.NICKNAME_ME}:
-                    if msg_tok[0] in '~&@%+# ':
+                    if msg_tok[0] in '~&@%+# *':
                         break
                     to_return[key_nick] = msg_tok
                 elif ex_tok in {_MsgTok.USER_ADDRESS, _MsgTok.USER_ADDRESS_ME}:
@@ -719,15 +726,15 @@ class Client(ABC, ClientQueueMixin):
                     self._log(f'{ret["sender"]} becomes {ret["nickname"]}',
                               scope=LogScope.CHAT, target=nom)
         elif (ret := self._match_msg(msg, 'NOTICE'))\
-                and (msg.params[0] != '*' or not self._db.nickname):
-            kw = {'sender': ret['sender'], 'scope': LogScope.CHAT
-                  } if 'sender' in ret else {}
-            self._log(msg.params[-1], out=False, target=msg.params[0],
-                      as_notice=True, **kw)
-        elif (ret := self._match_msg(msg, 'PRIVMSG')) and msg.params[0] != '*':
-            kw = {'sender': ret['sender'], 'scope': LogScope.CHAT
+                or (ret := self._match_msg(msg, 'PRIVMSG')):
+            kw = {'sender': ret['sender'], 'scope': LogScope.CHAT,
+                  'target': ret.get('ch_name', ret['sender']),
                   } if 'sender' in ret else {}
-            self._log(msg.params[-1], out=False, target=msg.params[0], **kw)
+            if msg.verb == 'NOTICE':
+                if 'nickname' in ret and 'nickname_me' not in ret:
+                    self.set_nick(ret['nickname'], confirmed=True)
+                kw |= {'as_notice': True}
+            self._log(ret['any'], out=False, **kw)
         elif (ret := self._match_msg(msg, 'PART')):
             log_msg = f'{ret["sender"]} {msg.verb.lower()}s {ret["ch_name"]}'
             log_msg += f': {ret["any"]}' if 'any' in ret else ''