def _match_msg(self, msg: IrcMessage) -> dict[str, Any]:
         'Test .source, .verb, .params.'
-        tok_type = (str | _NickUserHost | tuple[str, ...]
-                    | dict[str, str | _Channel])
+        tok_type = str | _NickUserHost | tuple[str, ...]
 
         def param_match(ex_tok: str | MsgTok, msg_tok: str | list[str]
                         ) -> Optional[tok_type | tuple[tok_type, ...]]:
                 return msg_tok if ('.' in msg_tok
                                    and not set('@!') & set(msg_tok)) else None
             if ex_tok is MsgTok.CHANNEL:
-                return {'id': msg_tok, 'db': self._db.channels[msg_tok]
-                        } if self._db.is_chan_name(msg_tok) else None
+                return msg_tok if self._db.is_chan_name(msg_tok) else None
             if ex_tok is MsgTok.NICKNAME:
                 return (msg_tok
                         if msg_tok[0] not in self._db.illegal_nick_firstchars
                     key, data = _Dict.key_val_from_eq_str(item)
                     self._db.isupport[key] = data
         elif ret['verb'] == '353':  # RPL_NAMREPLY
-            ret['channel']['db'].add_from_namreply(ret['names'])
+            self._db.channels[ret['channel']].add_from_namreply(ret['names'])
         elif ret['verb'] == '366':  # RPL_ENDOFNAMES
-            ret['channel']['db'].user_ids.complete()
+            self._db.channels[ret['channel']].user_ids.complete()
         elif ret['verb'] == '372':  # RPL_MOTD
             self._db.motd.append(ret['line'])
         elif ret['verb'] == '376':  # RPL_ENDOFMOTD
         elif ret['verb'] == 'ERROR':
             self.close()
         elif ret['verb'] == 'JOIN' and ret['joiner'] != self._db.users['me']:
-            ret['channel']['db'].append_nick(ret['joiner'])
+            self._db.channels[ret['channel']].append_nick(ret['joiner'])
         elif ret['verb'] == 'NICK':
             user_id = self._db.user_id(ret['named'])
             self._db.users[user_id].nick = ret['nick']
             if 'sender' in ret:  # not just server message
                 kw |= {'sender': ret['sender'].nick, 'scope': LogScope.CHAT,
                        'target': (ret['sender'].nick if 'nick' in ret
-                                  else ret['channel']['id'])}
+                                  else ret['channel'])}
             self._log(ret['message'], out=False, **kw)
         elif ret['verb'] == 'PART':
             if ret['parter'] == self._db.users['me']:
-                del self._db.channels[ret['channel']['id']]
+                del self._db.channels[ret['channel']]
             else:
-                ret['channel']['db'].remove_nick(ret['parter'])
+                self._db.channels[ret['channel']].remove_nick(ret['parter'])
         elif ret['verb'] == 'PING':
             self.send(IrcMessage(verb='PONG', params=(ret['reply'],)))
         elif ret['verb'] == 'QUIT':