home · contact · privacy
Refactor message task target parsing towards greater flexibility.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 3 Sep 2025 13:18:13 +0000 (15:18 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 3 Sep 2025 13:18:13 +0000 (15:18 +0200)
ircplom/client.py
ircplom/msg_parse_expectations.py

index 3fd06e55358a8bb4a981cf27ed9e7e3b5a37e4f3..c08d7140a1439a19bd54667cf813b459cab72fe9 100644 (file)
@@ -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] == '-':
index 918ee47532ecfc038b5b40fced3680e1d1a291c5..02c0a637a6e422039ba34ffea75d7c8c2c1e5375 100644 (file)
@@ -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',