From 8196d8a3080525af020ce8f5858224df45f6dc59 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 4 Sep 2025 03:11:11 +0200 Subject: [PATCH] Add 'doafter' task verb, with defined execution order between task verbs. --- ircplom/client.py | 36 +++++++++++++++---------------- ircplom/msg_parse_expectations.py | 10 +++++---- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/ircplom/client.py b/ircplom/client.py index 509f8d3..dbeff78 100644 --- a/ircplom/client.py +++ b/ircplom/client.py @@ -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] == '-': diff --git a/ircplom/msg_parse_expectations.py b/ircplom/msg_parse_expectations.py index b23b1e3..c91ff3e 100644 --- a/ircplom/msg_parse_expectations.py +++ b/ircplom/msg_parse_expectations.py @@ -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', -- 2.30.2