From: Christian Heller Date: Tue, 23 Dec 2025 11:16:22 +0000 (+0100) Subject: On channel join ask its MODEs, and don't declare incomplete .modes_listy. X-Git-Url: https://plomlompom.com/repos/booking/%22https:/validator.w3.org/%7B%7Bprefix%7D%7D/error?a=commitdiff_plain;p=ircplom On channel join ask its MODEs, and don't declare incomplete .modes_listy. --- diff --git a/src/ircplom/client.py b/src/ircplom/client.py index c59f51d..5d0f3a0 100644 --- a/src/ircplom/client.py +++ b/src/ircplom/client.py @@ -267,8 +267,11 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel): except AssertionError: raise ImplementationFail( # pylint: disable=raise-missing-from 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: + modes_complete = tuple( + attr for attr in (self.prefixes, self.modes_listy, + self.modes_valued, self.modes_toggled) + if attr.completed is not None) + for attr in modes_complete: attr.completed = None for do_add, char, arg in todos: if char in modes['A'] + prefix_modes: @@ -287,7 +290,7 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel): getattr(self.modes_toggled, f'completable_{"add" if do_add else "remove"}' )(char, False) - for attr in modes_attrs: + for attr in modes_complete: attr.complete() @@ -843,6 +846,9 @@ class Client(ABC, ClientQueueMixin): 'Reply PING with its expected reply.' self.send('PONG', reply) + def ask_chanmodes(self, channel_name: str) -> None: + self.send('MODE', channel_name) + def handle_msg(self, msg: IrcMessage) -> None: 'Log msg.raw, then process incoming msg into appropriate client steps.' ret: Optional[dict[str, Any]] = None diff --git a/src/ircplom/msg_parse_expectations.py b/src/ircplom/msg_parse_expectations.py index c7ff34e..7a06c21 100644 --- a/src/ircplom/msg_parse_expectations.py +++ b/src/ircplom/msg_parse_expectations.py @@ -461,6 +461,24 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [ # joining/leaving + _MsgParseExpectation( + '324', + _MsgToken.SERVER, + ((_MsgToken.NICKNAME, 'setattr_db.users[me]:nick'), + (_MsgToken.CHANNEL, ':CHANNEL'), + (_MsgToken.ANY, ':modeset'), + (_MsgToken.LIST, ':args')), + bonus_tasks=('do_db.channels[CHANNEL].set_modes:modeset,args', + 'doafter_db.channels[CHANNEL].modes_valued.complete:', + 'doafter_db.channels[CHANNEL].modes_toggled.complete:')), + + _MsgParseExpectation( + '329', # RPL_CREATIONTIME + _MsgToken.SERVER, + ((_MsgToken.NICKNAME, 'setattr_db.users[me]:nick'), + _MsgToken.CHANNEL, + _MsgToken.ANY)), + _MsgParseExpectation( '332', # RPL_TOPIC _MsgToken.SERVER, @@ -497,7 +515,7 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [ '366', # RPL_ENDOFNAMES _MsgToken.SERVER, ((_MsgToken.NICKNAME, 'setattr_db.users[me]:nick'), - (_MsgToken.CHANNEL, ':CHAN'), + (_MsgToken.CHANNEL, 'do_ask_chanmodes:CHAN'), _MsgToken.ANY), # comment bonus_tasks=('doafter_db.channels[CHAN].prefixes.complete:', 'doafter_db.channels[CHAN].user_ids.complete:')), diff --git a/src/tests/channel_modes.test b/src/tests/channel_modes.test index 9593a88..6787eb4 100644 --- a/src/tests/channel_modes.test +++ b/src/tests/channel_modes.test @@ -1,7 +1,7 @@ insert ./lib/connect-to-usermode insert ./lib/isupport-set insert ./lib/join-channel -# for: join-channel-0-cmd-to-list-residents, join-channel-1-end-of-names +# for: join-channel-0-cmd-to-list-residents, join-channel-1-0-endofnames-to-prefixes, join-channel-1-1-userids-to-329, join-channel-1-endofnames-to-329 insert ./lib/no-handler insert ./lib/part-no-msg-other insert ./lib/privmsg-win @@ -32,10 +32,10 @@ insert user-set-to range=:1 [(USER_ID)=2 (USER_NICK)=oof] insert servermsglogged [% (MSG)=:foo.bar.baz%353%foo%=%#ch_win3%:+rab%zab] insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)=rab] insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=zab] -insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=3] +insert join-channel-1-0-endofnames-to-prefixes range=:-1 [(WIN_ID)=3] log 1 $ channels:#ch_win3:prefixes:o set to: [1] log 1 $ channels:#ch_win3:prefixes:v set to: [2], [3] -insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=3 (RESIDENT_IDS)=[1],%[2],%[3],%[4],%[me] (RESIDENT_NICKS)=@baz,%+oof,%+rab,%zab,%foo] +insert join-channel-1-1-userids-to-329 [% (WIN_ID)=3 (RESIDENT_IDS)=[1],%[2],%[3],%[4],%[me] (RESIDENT_NICKS)=@baz,%+oof,%+rab,%zab,%foo] # check (presence/absence of) membership prefixes mirrored in message display insert privmsg-win [% (WIN_ID)=3 (TXT)=foo%foo%foo] @@ -67,7 +67,7 @@ insert msg-prefixed-short [(USER_ID)=4 (NICK)=zab (PREFIX)=@] # check user parting loses them prefix even if kept identified by other window insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%baz] -insert join-channel-1-end-of-names [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=baz,%foo] +insert join-channel-1-endofnames-to-329 [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=baz,%foo] insert part-no-msg-other [% (USER_ID)=1 (NICK)=baz (REMAINING_IDS)=[2],%[3],%[4],%[me]] log 1 $ channels:#ch_win3:prefixes:o set to: [4] insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%JOIN%:#ch_win3] @@ -89,11 +89,11 @@ insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=channel%mode%setting% # check server setting type-A modes insert servermsg-mode [% (ARGS)=+l%:foo] -log 1 $ channels:#ch_win3:modes_listy:l set to: [foo] +# log 1 $ channels:#ch_win3:modes_listy:l set to: [foo] insert servermsg-mode [% (ARGS)=+l%:bar] -log 1 $ channels:#ch_win3:modes_listy:l set to: [bar], [foo] +# log 1 $ channels:#ch_win3:modes_listy:l set to: [bar], [foo] insert servermsg-mode [% (ARGS)=+l-l%:baz%foo] -log 1 $ channels:#ch_win3:modes_listy:l set to: [bar], [baz] +# log 1 $ channels:#ch_win3:modes_listy:l set to: [bar], [baz] # check server setting type-B modes insert servermsg-mode [% (ARGS)=+k%:password] @@ -104,7 +104,7 @@ log 1 $ channels:#ch_win3:modes_valued cleared # check server setting type-C modes insert servermsg-mode [% (ARGS)=+x%:foo] log 1 $ channels:#ch_win3:modes_valued:x set to: [foo] -insert servermsg-mode [% (ARGS)=+xy%:bar%zab] +insert servermsg-mode [% (ARGS)=+xy%bar%zab] log 1 $ channels:#ch_win3:modes_valued:x set to: [bar] log 1 $ channels:#ch_win3:modes_valued:y set to: [zab] insert servermsg-mode [(ARGS)=-x] @@ -117,3 +117,12 @@ insert servermsg-mode [(ARGS)=-cba] log 1 $ channels:#ch_win3:modes_toggled set to: [B] insert servermsg-mode [(ARGS)=-B+cb] log 1 $ channels:#ch_win3:modes_toggled set to: [b], [c] + +# check /join into channel with modes already set +insert join-channel-0-cmd-to-list-residents [(WIN_ID)=5 (RESIDENT_NAMES)=foo] +insert join-channel-1-endofnames-to-329 range=:-2 [% (WIN_ID)=5 (RESIDENT_IDS)=[me] (RESIDENT_NICKS)=foo %+=%+kxyaBc%foo%bar%baz] +log 1 $ channels:#ch_win5:modes_valued:k set to: [foo] +log 1 $ channels:#ch_win5:modes_valued:x set to: [bar] +log 1 $ channels:#ch_win5:modes_valued:y set to: [baz] +log 1 $ channels:#ch_win5:modes_toggled set to: [B], [a], [c] +insert join-channel-1-endofnames-to-329 range=-2: [% (WIN_ID)=5] diff --git a/src/tests/channels.test b/src/tests/channels.test index 759e0a9..2275704 100644 --- a/src/tests/channels.test +++ b/src/tests/channels.test @@ -10,7 +10,7 @@ insert ./lib/connect-to-usermode insert ./lib/disconnect # for: disconnect0, disconnect1 insert ./lib/join-channel -# for: join-channel-0-cmd-to-list-residents, join-channel-0-0-cmd-to-ack, join-channel-0-1-list-residents, join-channel-1-end-of-names +# for: join-channel-0-cmd-to-list-residents, join-channel-0-0-cmd-to-ack, join-channel-0-1-list-residents, join-channel-1-0-endofnames-to-prefixes, join-channel-1-1-userids-to-329, join-channel-1-endofnames-to-329 insert ./lib/join-empty insert ./lib/part # for: part, part-core, part-no-msg, part-no-msg-me, quit @@ -96,7 +96,7 @@ insert part-empty [(WIN_ID)=3] # check /join to, and part from, channel with one other user insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=3 (RESIDENT_NAMES)=foo%bar] insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=bar] -insert join-channel-1-end-of-names [% (WIN_ID)=3 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=bar,%foo] +insert join-channel-1-endofnames-to-329 [% (WIN_ID)=3 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=bar,%foo] insert part-no-msg-me [% (WIN_ID)=3 (USERIDS_CLEAR)=set%to:%[1]] log 1 $ users:1 deleted @@ -107,7 +107,7 @@ insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)=oof] insert servermsglogged [% (MSG)=:foo.bar.baz%353%foo%=%#ch_win3%:rab%zab] insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=rab] insert user-set-to range=:1 [(USER_ID)=5 (USER_NICK)=zab] -insert join-channel-1-end-of-names [% (WIN_ID)=3 (RESIDENT_IDS)=[2],%[3],%[4],%[5],%[me] (RESIDENT_NICKS)=baz,%oof,%rab,%zab,%foo] +insert join-channel-1-endofnames-to-329 [% (WIN_ID)=3 (RESIDENT_IDS)=[2],%[3],%[4],%[5],%[me] (RESIDENT_NICKS)=baz,%oof,%rab,%zab,%foo] # check /join into channel with topic set > /window 4 @@ -117,8 +117,8 @@ insert servermsglogged [% (MSG)=:foo.bar.baz%332%foo%#ch_win4%:foo%bar%baz] insert servermsglogged [% (MSG)=:foo.bar.baz%333%foo%#ch_win4%baz!~bazbaz@OLD.baz.baz%1234567890] insert topic-set-to [% baz.baz=OLD.baz.baz (WIN_ID)=4 (TOPIC)=foo%bar%baz] insert join-channel-0-1-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%baz] -insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=4] -insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=4 (RESIDENT_IDS)=[2],%[me] (RESIDENT_NICKS)=baz,%foo] +insert join-channel-1-0-endofnames-to-prefixes range=:-1 [(WIN_ID)=4] +insert join-channel-1-1-userids-to-329 [% (WIN_ID)=4 (RESIDENT_IDS)=[2],%[me] (RESIDENT_NICKS)=baz,%foo] # check _observed_ topic change _does_ affect users database, and … insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%TOPIC%#ch_win4%:foo%bar%baz] diff --git a/src/tests/isupports.test b/src/tests/isupports.test index cc7dc02..1e0e4f0 100644 --- a/src/tests/isupports.test +++ b/src/tests/isupports.test @@ -8,7 +8,7 @@ insert ./lib/disconnect insert ./lib/isupport-clear insert ./lib/isupport-set insert ./lib/join-channel -# for: join-channel-0-cmd-to-list-residents, join-channel-1 +# for: join-channel-0-cmd-to-list-residents, join-channel-1-0-endofnames-to-prefixes, join-channel-1-1-userids-to-329 insert ./lib/join-empty insert ./lib/no-handler insert ./lib/servermsglogged @@ -80,18 +80,18 @@ insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=7 (RESIDENT_NAMES)=foo%@ insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=bar] insert user-set-to range=:1 [(USER_ID)=2 (USER_NICK)=baz] insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)==quux] -insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=7] +insert join-channel-1-0-endofnames-to-prefixes range=:-1 [(WIN_ID)=7] log 1 $ channels:#ch_win7:prefixes:o set to: [1] log 1 $ channels:#ch_win7:prefixes:v set to: [2] -insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=7 (RESIDENT_IDS)=[1],%[2],%[3],%[me] (RESIDENT_NICKS)=@bar,%+baz,%=quux,%foo] +insert join-channel-1-1-userids-to-329 [% (WIN_ID)=7 (RESIDENT_IDS)=[1],%[2],%[3],%[me] (RESIDENT_NICKS)=@bar,%+baz,%=quux,%foo] insert isupport-set [(KEY)=PREFIX (VALUE)=(vE)+=] insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=8 (RESIDENT_NAMES)=foo%@bar%+baz%=quux] insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=@bar] insert user-set-to range=:1 [(USER_ID)=5 (USER_NICK)=quux] -insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=8] +insert join-channel-1-0-endofnames-to-prefixes range=:-1 [(WIN_ID)=8] log 1 $ channels:#ch_win8:prefixes:v set to: [2] log 1 $ channels:#ch_win8:prefixes:E set to: [5] -insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=8 (RESIDENT_IDS)=[2],%[4],%[5],%[me] (RESIDENT_NICKS)=+baz,%@bar,%=quux,%foo] +insert join-channel-1-1-userids-to-329 [% (WIN_ID)=8 (RESIDENT_IDS)=[2],%[4],%[5],%[me] (RESIDENT_NICKS)=+baz,%@bar,%=quux,%foo] # test effect of USERLEN insert join-empty [(WIN_ID)=9] diff --git a/src/tests/lib/join-channel b/src/tests/lib/join-channel index ca0a805..76d4bb6 100644 --- a/src/tests/lib/join-channel +++ b/src/tests/lib/join-channel @@ -12,8 +12,17 @@ insert servermsglogged [% (MSG)=:foo.bar.baz%353%foo%=%#ch_win(WIN_ID)%:(RESIDEN insert join-channel-0-0-cmd-to-ack insert join-channel-0-1-list-residents -× join-channel-1-end-of-names +× join-channel-1-0-endofnames-to-prefixes insert servermsglogged [% (MSG)=:foo.bar.baz%366%foo%#ch_win(WIN_ID)%:End%of%/NAMES%list.] +log 1 > MODE :#ch_win(WIN_ID) log 1 $ channels:#ch_win(WIN_ID):prefixes cleared + +× join-channel-1-1-userids-to-329 log 1 $ channels:#ch_win(WIN_ID):user_ids set to: (RESIDENT_IDS) log (WIN_ID) $ residents: (RESIDENT_NICKS) +insert servermsglogged [% (MSG)=:foo.bar.baz%324%foo%#ch_win(WIN_ID)%+] +insert servermsglogged [% (MSG)=:foo.bar.baz%329%foo%#ch_win(WIN_ID)%123456789] + +× join-channel-1-endofnames-to-329 +insert join-channel-1-0-endofnames-to-prefixes +insert join-channel-1-1-userids-to-329 diff --git a/src/tests/lib/join-empty b/src/tests/lib/join-empty index 4180334..2a1baee 100644 --- a/src/tests/lib/join-empty +++ b/src/tests/lib/join-empty @@ -1,6 +1,6 @@ insert ./lib/join-channel -# for join-channel-0-cmd-to-list-residents, join-channel-1-end-of-names +# for join-channel-0-cmd-to-list-residents, join-channel-1-endofnames-to-329 × join-empty insert join-channel-0-cmd-to-list-residents [(RESIDENT_NAMES)=foo] -insert join-channel-1-end-of-names [(RESIDENT_IDS)=[me] (RESIDENT_NICKS)=foo] +insert join-channel-1-endofnames-to-329 [(RESIDENT_IDS)=[me] (RESIDENT_NICKS)=foo (CHANMODES)=+] diff --git a/src/tests/test.test b/src/tests/test.test index 50cbd47..8df7efd 100644 --- a/src/tests/test.test +++ b/src/tests/test.test @@ -12,7 +12,7 @@ insert ./lib/enter_misc # for: enter-help-win0 insert ./lib/isupport-clear insert ./lib/join-channel -# for: join-channel-0-cmd-to-list-residents, join-channel-1-end-of-names +# for: join-channel-0-cmd-to-list-residents, join-channel-1-0-endofnames-to-prefixes, join-channel-1-1-userids-to-329, join-channel-1-endofnames-to-329 insert ./lib/part # for: part-no-msg-me, quits insert ./lib/pingpong @@ -115,9 +115,9 @@ log 3 $ foo1!~foofoo@foo.foo renames foo # join channel with other user insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%@baz] insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=baz] -insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=4] +insert join-channel-1-0-endofnames-to-prefixes range=:-1 [(WIN_ID)=4] log 1 $ channels:#ch_win4:prefixes:o set to: [1] -insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=@baz,%foo] +insert join-channel-1-1-userids-to-329 [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=@baz,%foo] # process non-self channel JOIN insert servermsglogged [% (MSG)=:bar!~barbar@bar.bar%JOIN%:#ch_win4] @@ -127,7 +127,7 @@ log 4 $ bar!~barbar@bar.bar joins # join second channel with partial residents identity to compare distribution of resident-specific messages insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=5 (RESIDENT_NAMES)=foo%bar] -insert join-channel-1-end-of-names [% (WIN_ID)=5 (RESIDENT_IDS)=[2],%[me] (RESIDENT_NICKS)=bar,%foo] +insert join-channel-1-endofnames-to-329 [% (WIN_ID)=5 (RESIDENT_IDS)=[2],%[me] (RESIDENT_NICKS)=bar,%foo] # handle query window with known user insert servermsglogged [% (MSG)=:bar!~barbar@bar.bar%PRIVMSG%foo%:hi%there]