home · contact · privacy
Only explicitly use userid_for_nickuserhost for updating users entries.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 5 Sep 2025 12:51:47 +0000 (14:51 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 5 Sep 2025 12:51:47 +0000 (14:51 +0200)
ircplom/client.py

index e36f46102c9a19a52b2622a7179163250f872a18..07c4f7ddff4f4d9f05f18884495288ee3089ed50 100644 (file)
@@ -380,7 +380,8 @@ class _Channel:
 
     def append_nick(self, nickuserhost: '_NickUserHost') -> None:
         'To .user_ids append .nickname and declare .user_ids complete.'
-        user_id = self._id_for_nickuserhost(nickuserhost, create_if_none=True)
+        user_id = self._id_for_nickuserhost(nickuserhost, create_if_none=True,
+                                            updating=True)
         self.user_ids.append(user_id, complete=True)
 
     def remove_nick(self, nickuserhost: '_NickUserHost') -> None:
@@ -513,7 +514,8 @@ class _ClientDb(_UpdatingMixin, SharedClientDbFields):
     def userid_for_nickuserhost(self,
                                 nickuserhost: _NickUserHost,
                                 create_if_none=False,
-                                allow_none=False
+                                allow_none=False,
+                                updating=False
                                 ) -> Optional[str]:
         'Return user_id for nickuserhost.nick, create if none, maybe update.'
         matches = [id_ for id_ in self.users.keys()
@@ -528,10 +530,12 @@ class _ClientDb(_UpdatingMixin, SharedClientDbFields):
             stored = self.users[id_]
             if '?' in {stored.user, stored.host}:
                 assert stored.host in {stored.user, '?'}
+                assert updating
                 self.users.set_updating(id_, nickuserhost)
             else:
                 assert nickuserhost.host == stored.host
                 if nickuserhost.user == f'~{stored.user}':
+                    assert updating
                     self.users.set_updating(id_, nickuserhost)
                 else:
                     assert nickuserhost.user == stored.user
@@ -706,9 +710,10 @@ class Client(ABC, ClientQueueMixin):
         if '_verb' not in ret:
             self._log(f'PLEASE IMPLEMENT HANDLER FOR: {msg.raw}')
             return
-        for nuh in ret['_nickuserhosts']:  # update, ensure identities
-            if (id_ := self.db.userid_for_nickuserhost(nuh, allow_none=True)):
-                for ret_name in [k for k in ret if ret[k] is nuh]:
+        for n_u_h in ret['_nickuserhosts']:  # update, ensure identities
+            if (id_ := self.db.userid_for_nickuserhost(n_u_h, allow_none=True,
+                                                       updating=True)):
+                for ret_name in [k for k in ret if ret[k] is n_u_h]:
                     ret[ret_name] = self.db.users[id_]
         for verb in ('setattr', 'do', 'doafter'):
             for task, tok_names in [t for t in ret['_tasks'].items()
@@ -766,7 +771,8 @@ class Client(ABC, ClientQueueMixin):
         elif ret['_verb'] == 'JOIN' and ret['joiner'] != self.db.users['me']:
             self.db.channels[ret['channel']].append_nick(ret['joiner'])
         elif ret['_verb'] == 'NICK':
-            user_id = self.db.userid_for_nickuserhost(ret['named'])
+            user_id = self.db.userid_for_nickuserhost(ret['named'],
+                                                      updating=True)
             assert user_id is not None
             self.db.users[user_id].nick = ret['nick']
             if user_id == 'me':