home · contact · privacy
For MODE message parsing, collect mode arguments as tuple from the start.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 23 Dec 2025 11:09:54 +0000 (12:09 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 23 Dec 2025 11:09:54 +0000 (12:09 +0100)
src/ircplom/client.py
src/ircplom/msg_parse_expectations.py
src/tests/channel_modes.test

index 2727558803be877413f57bab670ea3040658c94a..c59f51d38e117abfbd664aab5501d9b7395390ce 100644 (file)
@@ -239,12 +239,11 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel):
         self.prefixes.complete()
         self._db.users.purge()
 
-    def set_modes(self, modeset: str, args_str='') -> None:
+    def set_modes(self, modeset: str, args: tuple[str, ...]) -> None:
         'Apply MODE settings on channels.'
         prefix_modes = ''.join(self._db.get_membership_modes().keys())
         modes = {c: '' for c in 'ABCD'} | self._db.get_chanmodes()
         todos: list[tuple[bool, str, str]] = []
-        args = args_str.split()
         idx_args = 0
         do_add = False
         try:
@@ -267,7 +266,7 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel):
             assert idx_args == len(args)
         except AssertionError:
             raise ImplementationFail(  # pylint: disable=raise-missing-from
-                    f'channel mode setting {modeset} on args: {args_str}')
+                    f'channel mode setting {modeset} on args: {args}')
         modes_attrs = self.prefixes, self.modes_listy, self.modes_valued, self.modes_toggled
         for attr in modes_attrs:
             attr.completed = None
index 4affc1b6ec4b7757675c90081ebb2135a1b62c74..c7ff34e67996b171c2fdf1eb5a335ea668221676 100644 (file)
@@ -607,17 +607,12 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [
         ((_MsgToken.NICKNAME, 'setattr_db.users[me]:nick'),
          (_MsgToken.ANY, 'setattr_db.users[me]:modes'))),
 
-    _MsgParseExpectation(
-        'MODE',
-        _MsgToken.SERVER,
-        ((_MsgToken.CHANNEL, ':CHANNEL'),
-         (_MsgToken.ANY, 'do_db.channels[CHANNEL].set_modes:modeset'))),
     _MsgParseExpectation(
         'MODE',
         _MsgToken.SERVER,
         ((_MsgToken.CHANNEL, ':CHANNEL'),
          (_MsgToken.ANY, ':modeset'),
-         (_MsgToken.ANY, ':args')),
+         (_MsgToken.LIST, ':args')),
         bonus_tasks=('do_db.channels[CHANNEL].set_modes:modeset,args',)),
 
     _MsgParseExpectation(
index a817ff798c9784626932f42f8c76b2ed7f0b7715..9593a88416a1fcf7d1196feec357af3a622a001b 100644 (file)
@@ -77,15 +77,15 @@ insert msg-prefixed-short [(USER_ID)=1 (NICK)=baz (PREFIX)=]
 
 # check server setting unknown or invalid modes
 insert servermsg-mode [(ARGS)=+f]
-insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%+f%on%args:%]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%+f%on%args:%()]
 insert servermsg-mode [% (ARGS)=-g%grab]
-insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%-g%on%args:%grab]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%-g%on%args:%('grab',)]
 insert servermsg-mode [(ARGS)=+l]
-insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%+l%on%args:%]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%+l%on%args:%()]
 insert servermsg-mode [% (ARGS)=+aBc%:foo%bar]
-insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%+aBc%on%args:%foo%bar]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%+aBc%on%args:%('foo',%'bar')]
 insert servermsg-mode [(ARGS)=a]
-insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%a%on%args:%]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting%a%on%args:%()]
 
 # check server setting type-A modes
 insert servermsg-mode [% (ARGS)=+l%:foo]