From: Christian Heller Date: Wed, 3 Sep 2025 13:18:13 +0000 (+0200) Subject: Refactor message task target parsing towards greater flexibility. X-Git-Url: https://plomlompom.com/repos/balance?a=commitdiff_plain;h=60c31b6e9521deb18d12ae2faaad2f70f5f95b05;p=ircplom Refactor message task target parsing towards greater flexibility. --- diff --git a/ircplom/client.py b/ircplom/client.py index 3fd06e5..c08d714 100644 --- a/ircplom/client.py +++ b/ircplom/client.py @@ -757,19 +757,20 @@ class Client(ABC, ClientQueueMixin): if task_verb == 'set' and target_name == 'user': for tok_name in tok_names: self._db.user_id(ret[tok_name]) - elif task_verb == 'setattr': - target: _ClientDb | _UpdatingNickUserHost | _UpdatingTopic - if target_name == 'me': - target = self._db.users[target_name] - elif target_name == 'topic': - target = self._db.channels[ret['CHAN']].topic - else: - target = self._db - for tok_name in sorted(tok_names): + continue + path_toks = target_name.split('.') + assert path_toks[0] == 'db' + parent = self._db + for step in path_toks[1:]: + parent = (parent[ret[step] if step.isupper() else step] + if isinstance(parent, Dict) + else getattr(parent, step)) + for tok_name in sorted(tok_names): + if task_verb == 'setattr': # NB: alphabetical sorting of tok_names purely as a hack # to ensure any setattr_topic:what be processed before any # setattr_topic:who, i.e. for parsing TOPIC message, FIXME - setattr(target, tok_name, ret[tok_name]) + setattr(parent, tok_name, ret[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 918ee47..02c0a63 100644 --- a/ircplom/msg_parse_expectations.py +++ b/ircplom/msg_parse_expectations.py @@ -30,19 +30,19 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [] MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.SERVER, '001', # RPL_WELCOME - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '002', # RPL_YOURHOST - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '003', # RPL_CREATED - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '004', # RPL_MYINFO - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY, MsgTok.ANY, MsgTok.ANY, @@ -50,54 +50,54 @@ MSG_EXPECTATIONS += [ MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '250', # RPL_STATSDLINE / RPL_STATSCONN - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '251', # RPL_LUSERCLIENT - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '252', # RPL_LUSEROP - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY, MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '253', # RPL_LUSERUNKNOWN - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY, MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '254', # RPL_LUSERCHANNELS - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY, MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '255', # RPL_LUSERME - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '265', # RPL_LOCALUSERS - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '265', # RPL_LOCALUSERS - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY, MsgTok.ANY, MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '266', # RPL_GLOBALUSERS - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '266', # RPL_GLOBALUSERS - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY, MsgTok.ANY, MsgTok.ANY)), _MsgParseExpectation(MsgTok.SERVER, '375', # RPL_MOTDSTART already implied by 1st 372 - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), ] @@ -105,22 +105,22 @@ MSG_EXPECTATIONS += [ MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.SERVER, '005', # RPL_ISUPPORT - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, ':isupport'), MsgTok.ANY), # comment idx_into_list=1), _MsgParseExpectation(MsgTok.SERVER, '372', # RPL_MOTD - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, ':line'))), _MsgParseExpectation(MsgTok.SERVER, '376', # RPL_ENDOFMOTD - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.ANY)), # comment _MsgParseExpectation(MsgTok.SERVER, '396', # RPL_VISIBLEHOST - ((MsgTok.NICKNAME, 'setattr_me:nick'), - (MsgTok.SERVER, 'setattr_me:host'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), + (MsgTok.SERVER, 'setattr_db.users.me:host'), MsgTok.ANY)), # comment ] @@ -128,17 +128,17 @@ MSG_EXPECTATIONS += [ MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.SERVER, '900', # RPL_LOGGEDIN - ((MsgTok.NICKNAME, 'setattr_me:nick'), - (MsgTok.NICK_USER_HOST, 'setattr_me:nickuserhost'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), + (MsgTok.NICK_USER_HOST, 'setattr_db.users.me:nickuserhost'), (MsgTok.ANY, 'setattr_db:sasl_account'), MsgTok.ANY)), # comment _MsgParseExpectation(MsgTok.SERVER, '903', # RPL_SASLSUCCESS - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, 'setattr_db:sasl_auth_state'))), _MsgParseExpectation(MsgTok.SERVER, '904', # ERR_SASLFAIL - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, 'setattr_db:sasl_auth_state'))), _MsgParseExpectation(MsgTok.NONE, 'AUTHENTICATE', @@ -149,12 +149,12 @@ MSG_EXPECTATIONS += [ MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('NEW', ':subverb'), (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('DEL', ':subverb'), (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, @@ -164,7 +164,7 @@ MSG_EXPECTATIONS += [ (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('ACK', ':subverb'), (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, @@ -174,7 +174,7 @@ MSG_EXPECTATIONS += [ (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('NAK', ':subverb'), (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, @@ -190,12 +190,12 @@ MSG_EXPECTATIONS += [ (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('LS', ':subverb'), (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('LS', ':subverb'), ('*', ':tbc'), (MsgTok.LIST, ':items'))), @@ -213,12 +213,12 @@ MSG_EXPECTATIONS += [ (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('LIST', ':subverb'), (MsgTok.LIST, ':items'))), _MsgParseExpectation(MsgTok.SERVER, 'CAP', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), ('LIST', ':subverb'), ('*', ':tbc'), (MsgTok.LIST, ':items'))), @@ -233,7 +233,7 @@ MSG_EXPECTATIONS += [ MsgTok.ANY)), # comment _MsgParseExpectation(MsgTok.SERVER, '432', # ERR_ERRONEOUSNICKNAME - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), MsgTok.NICKNAME, # no need to re-use the bad one MsgTok.ANY)), # comment _MsgParseExpectation(MsgTok.SERVER, @@ -255,30 +255,30 @@ MSG_EXPECTATIONS += [ MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.SERVER, '332', # RPL_TOPIC - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.CHANNEL, ':CHAN'), - (MsgTok.ANY, 'setattr_topic:what'))), + (MsgTok.ANY, 'setattr_db.channels.CHAN.topic:what'))), _MsgParseExpectation(MsgTok.SERVER, '333', # RPL_TOPICWHOTIME - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.CHANNEL, ':CHAN'), - (MsgTok.NICK_USER_HOST, 'setattr_topic:who'), + (MsgTok.NICK_USER_HOST, 'setattr_db.channels.CHAN.topic:who'), (MsgTok.ANY, ':timestamp'))), _MsgParseExpectation(MsgTok.SERVER, '353', # RPL_NAMREPLY - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), '@', (MsgTok.CHANNEL, ':channel'), (MsgTok.LIST, ':names'))), _MsgParseExpectation(MsgTok.SERVER, '353', # RPL_NAMREPLY - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), '=', (MsgTok.CHANNEL, ':channel'), (MsgTok.LIST, ':names'))), _MsgParseExpectation(MsgTok.SERVER, '366', # RPL_ENDOFNAMES - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.CHANNEL, ':channel'), MsgTok.ANY)), # comment _MsgParseExpectation((MsgTok.NICK_USER_HOST, ':joiner'), @@ -291,17 +291,17 @@ MSG_EXPECTATIONS += [ 'PART', ((MsgTok.CHANNEL, ':channel'), (MsgTok.ANY, ':message'))), - _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'setattr_topic:who'), + _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'setattr_db.channels.CHAN.topic:who'), 'TOPIC', ((MsgTok.CHANNEL, ':CHAN'), - (MsgTok.ANY, 'setattr_topic:what'))), + (MsgTok.ANY, 'setattr_db.channels.CHAN.topic:what'))), ] # messaging MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.SERVER, '401', # ERR_NOSUCKNICK - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.NICKNAME, ':target'), MsgTok.ANY)), # comment _MsgParseExpectation(MsgTok.SERVER, @@ -310,11 +310,11 @@ MSG_EXPECTATIONS += [ (MsgTok.ANY, ':message'))), _MsgParseExpectation(MsgTok.SERVER, 'NOTICE', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, ':message'))), _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'set_user:sender'), 'NOTICE', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, ':message'))), _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'set_user:sender'), 'NOTICE', @@ -322,7 +322,7 @@ MSG_EXPECTATIONS += [ (MsgTok.ANY, ':message'))), _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'set_user:sender'), 'PRIVMSG', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, ':message'))), _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'set_user:sender'), 'PRIVMSG', @@ -335,13 +335,13 @@ MSG_EXPECTATIONS += [ _MsgParseExpectation(MsgTok.NONE, 'ERROR', ((MsgTok.ANY, 'setattr_db:connection_state'),)), - _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'setattr_me:nickuserhost'), + _MsgParseExpectation((MsgTok.NICK_USER_HOST, 'setattr_db.users.me:nickuserhost'), 'MODE', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, 'setattr_db:user_modes'))), _MsgParseExpectation(MsgTok.NICKNAME, 'MODE', - ((MsgTok.NICKNAME, 'setattr_me:nick'), + ((MsgTok.NICKNAME, 'setattr_db.users.me:nick'), (MsgTok.ANY, 'setattr_db:user_modes'))), _MsgParseExpectation(MsgTok.NONE, 'PING',