home · contact · privacy
Add 'doafter' task verb, with defined execution order between task verbs.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 4 Sep 2025 01:11:11 +0000 (03:11 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 4 Sep 2025 01:11:11 +0000 (03:11 +0200)
ircplom/client.py
ircplom/msg_parse_expectations.py

index 509f8d3acf7a21c2a984c644c074397914fad4ee..dbeff78738b147e73d59a4ccab325a322f30192d 100644 (file)
@@ -351,11 +351,9 @@ class _Topic(Topic['_NickUserHost']):
 
     def _set_what(self, what: str) -> None:
         self._what = what
-        self._who = None
 
     def _set_who(self, who: '_NickUserHost') -> None:
         self._who = who.copy()
-        self.complete()
 
     def complete(self) -> None:
         'Declare data collection finished, return full or empty content.'
@@ -711,24 +709,24 @@ class Client(ABC, ClientQueueMixin):
         if '_verb' not in ret:
             self._log(f'PLEASE IMPLEMENT HANDLER FOR: {msg.raw}')
             return
-        for task, tok_names in ret['_tasks'].items():
-            if task.verb == 'set' and task.path == ('user',):
+        for task, tok_names in [t for t in ret['_tasks'].items()
+                                if t[0].verb == 'set']:
+            assert task.path == ('user',)
+            assert tok_names == ['sender']
+            self.db.user_id(ret['sender'])
+        for verb in ('setattr', 'do', 'doafter'):
+            for task, tok_names in [t for t in ret['_tasks'].items()
+                                    if t[0].verb == verb]:
+                node = self
+                for step in task.path:
+                    node = (node[ret[step] if step.isupper() else step]
+                            if isinstance(node, Dict)
+                            else getattr(node, step))
                 for tok_name in tok_names:
-                    self.db.user_id(ret[tok_name])
-                continue
-            node = self
-            for step in task.path:
-                node = (node[ret[step] if step.isupper() else step]
-                        if isinstance(node, Dict)
-                        else getattr(node, step))
-            for tok_name in sorted(tok_names):
-                # FIXME: alphabetical sorting of tok_names merely hack to parse
-                # TOPIC messages, to ensure any setattr_topic:what be processed
-                # before any setattr_topic:who, i.e. properly completing .topic
-                if task.verb == 'setattr':
-                    setattr(node, tok_name, ret[tok_name])
-                elif task.verb == 'do':
-                    getattr(node, tok_name)()
+                    if task.verb == 'setattr':
+                        setattr(node, tok_name, ret[tok_name])
+                    else:
+                        getattr(node, tok_name)()
         if ret['_verb'] == '005':   # RPL_ISUPPORT
             for item in ret['isupport']:
                 if item[0] == '-':
index b23b1e3dc5d8464eff0472b80103b20d0fde3739..c91ff3e722904de5b076afe055463d9a532a7e1a 100644 (file)
@@ -430,7 +430,8 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [
         ((_MsgTok.NICKNAME, 'setattr_db.users.me:nick'),
          (_MsgTok.CHANNEL, ':CHAN'),
          (_MsgTok.NICK_USER_HOST, 'setattr_db.channels.CHAN.topic:who'),
-         (_MsgTok.ANY, ':timestamp'))),
+         (_MsgTok.ANY, ':timestamp')),
+        bonus_tasks=('doafter_db.channels.CHAN.topic:complete',)),
 
     _MsgParseExpectation(
         '353',  # RPL_NAMREPLY
@@ -453,7 +454,7 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [
         ((_MsgTok.NICKNAME, 'setattr_db.users.me:nick'),
          (_MsgTok.CHANNEL, ':CHAN'),
          _MsgTok.ANY),  # comment
-        bonus_tasks=('do_db.channels.CHAN.user_ids:complete',)),
+        bonus_tasks=('doafter_db.channels.CHAN.user_ids:complete',)),
 
     _MsgParseExpectation(
         'JOIN',
@@ -517,7 +518,7 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [
         'ERROR',
         _MsgTok.NONE,
         ((_MsgTok.ANY, 'setattr_db:connection_state'),),
-        bonus_tasks=('do_:close',)),
+        bonus_tasks=('doafter_:close',)),
 
     _MsgParseExpectation(
         'MODE',
@@ -539,7 +540,8 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [
         'TOPIC',
         (_MsgTok.NICK_USER_HOST, 'setattr_db.channels.CHAN.topic:who'),
         ((_MsgTok.CHANNEL, ':CHAN'),
-         (_MsgTok.ANY, 'setattr_db.channels.CHAN.topic:what'))),
+         (_MsgTok.ANY, 'setattr_db.channels.CHAN.topic:what')),
+        bonus_tasks=('doafter_db.channels.CHAN.topic:complete',)),
 
     _MsgParseExpectation(
         'QUIT',