'Collects .topic, and in .user_ids inhabitant IDs.'
topic: Topic
user_ids: Iterable[str]
+ prefixes: Dict[tuple[str, ...]]
exits: Dict[str]
def add_from_namreply(self, items: tuple[str, ...]) -> None:
'Add to .user_ids items assumed as nicknames with membership prefixes.'
+ prefixes = self._get_membership_prefixes()
for item in items:
- n_u_h = NickUserHost(item.lstrip(self._get_membership_prefixes()))
+ prefix = ''.join([pfx for pfx in prefixes if item.startswith(pfx)])
+ n_u_h = NickUserHost(item.lstrip(prefix))
user_id = self._userid_for_nickuserhost(n_u_h, create_if_none=True)
self.user_ids.completable_add(user_id, on_complete=False)
+ if prefix:
+ if prefix in self.prefixes.keys():
+ self.prefixes[prefix] += (user_id,)
+ else:
+ self.prefixes[prefix] = (user_id,)
def add_user(self, user: '_User') -> None:
'To .user_ids add user.nickname, keep .user_ids declared complete.'
def remove_user(self, user: '_User', msg: str) -> None:
'From .user_ids remove .nickname, keep .user_ids declared complete.'
+ for prefix in self.prefixes.keys():
+ self.prefixes[prefix] = tuple(id_ for id_ in self.prefixes[prefix]
+ if id_ != user.id_)
self.exits[user.id_] = msg
self.user_ids.completable_remove(user.id_, on_complete=True)
del self.exits[user.id_]
user_ids: UpdatingCompletableStringsSet
topic: _UpdatingCompletableTopic
exits: UpdatingDict[str]
+ prefixes: UpdatingDict[tuple[str, ...]]
class _UpdatingUser(UpdatingAttrsMixin, _User):
class _UpdatingChannel(_UpdatingNode, Channel):
user_ids: set[str]
exits: _UpdatingDict[str]
+ prefixes: _UpdatingDict[tuple[str, ...]]
def recursive_set_and_report_change(self, update: _Update) -> None:
super().recursive_set_and_report_change(update)
# for Clearable.clear.
def __setitem__(self, key: str, val: DictItem) -> None:
- assert isinstance(val, self._item_cls), (type(val), self._item_cls)
self._dict[key] = val
def __getitem__(self, key: str) -> DictItem:
> /join TARGET
log LOG_WIN_ID $ already in that channel
-× part-other
-insert servermsglogged : + MSG ::NICK!~NICK@NICK.NICK PART :#ch_test0
-insert parts-core : + exitMSG= exitPREFIX= USERIDS_CLEAR=set§to:§REMAINING_IDS CHANNEL=#ch_test0 CHAN_WIN_ID=3 § :
+× part-other-0
+insert servermsglogged : + MSG ::NICK!~NICK@NICK.NICK PART ARGS
+
+× part-other-0-no-msg
+insert part-other-0 : + ARGS ::#ch_test0
+
+× part-other-1
+insert parts-core : + USERIDS_CLEAR=set§to:§REMAINING_IDS CHANNEL=#ch_test0 CHAN_WIN_ID=3 § :
+
+× part-other-1-no-msg
+insert part-other-1 : + exitMSG= exitPREFIX :
× ×--------------------------
log 1 $ users:1 deleted
# check /join into channel with many other users, with multi-line 353
-insert join-channel-0 : + CHANNEL=#ch_test0 RESIDENT_NAMES :foo baz oof
+insert join-channel-0 : + CHANNEL=#ch_test0 RESIDENT_NAMES :foo @baz +oof
insert user-set-to :1 + USER_ID=2 USERNICK :baz
+log 1 $ channels:#ch_test0:prefixes:@ set to: [2]
insert user-set-to :1 + USER_ID=3 USERNICK :oof
-insert servermsglogged : + MSG ::foo.bar.baz 353 foo = #ch_test0 :rab zab
+log 1 $ channels:#ch_test0:prefixes:+ set to: [3]
+insert servermsglogged : + MSG ::foo.bar.baz 353 foo = #ch_test0 :+rab zab
insert user-set-to :1 + USER_ID=4 USERNICK :rab
+log 1 $ channels:#ch_test0:prefixes:+ set to: [3], [4]
insert user-set-to :1 + USER_ID=5 USERNICK :zab
insert join-channel-1 : + CHANNEL=#ch_test0 RESIDENT_IDS :[2], [3], [4], [5], [me]
log 3 $ residents: baz, oof, rab, zab, foo
log 3 < (*.?.net) msg_test6 msg_test7
# check part of user visible, and of user NOT visible in other channel
-insert part-other : + NICK=baz USER_ID=2 REMAINING_IDS :[3], [4], [5], [me]
-insert part-other : + NICK=oof USER_ID=3 REMAINING_IDS :[4], [5], [me]
+insert part-other-0-no-msg : + NICK :baz
+log 1 $ channels:#ch_test0:prefixes:@ emptied
+insert part-other-1-no-msg : + USER_ID=2 NICK=baz REMAINING_IDS :[3], [4], [5], [me]
+insert part-other-0-no-msg : + NICK :oof
+log 1 $ channels:#ch_test0:prefixes:+ set to: [4]
+insert part-other-1-no-msg : + USER_ID=3 NICK=oof REMAINING_IDS :[4], [5], [me]
log 1 $ users:3 deleted
# check other-user part with exit message
-insert servermsglogged : + MSG ::zab!~zab@zab.zab PART #ch_test0 :goodbye
+insert part-other-0 : + NICK=zab ARGS :#ch_test0 :goodbye
insert user-set-to 1: + USER_ID=5 USERNAME=~zab USERHOST :zab.zab
-insert parts-core : + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=5 NICK=zab exitPREFIX=:§ exitMSG=goodbye USERIDS_CLEAR=set§to:§[4],§[me] § :
+insert part-other-1 : + USER_ID=5 NICK=zab exitPREFIX=:§ exitMSG=goodbye REMAINING_IDS=[4],§[me] § :
log 1 $ users:5 deleted
# check re-join of user kept visible in other channel
# test effect of PREFIX
insert join-channel-0 : +0 CHANNEL=#ch_test6 RESIDENT_NAMES :foo @bar +baz =quux
insert user-set-to :1 +1 USER_ID=1 USERNICK :bar
+log 1 $ channels:#ch_test6:prefixes:@ set to: [1]
insert user-set-to :1 +1 USER_ID=2 USERNICK :baz
+log 1 $ channels:#ch_test6:prefixes:+ set to: [2]
insert user-set-to :1 +1 USER_ID=3 USERNICK :=quux
insert join-channel-1 : +0 CHANNEL=#ch_test6 RESIDENT_IDS :[1], [2], [3], [me]
log 7 $ residents: bar, baz, =quux, foo
insert un-default : +0 KEY=PREFIX VALUE :(vE)+=
insert join-channel-0 : +0 CHANNEL=#ch_test7 RESIDENT_NAMES :foo @bar +baz =quux
insert user-set-to :1 +1 USER_ID=4 USERNICK :@bar
+log 1 $ channels:#ch_test7:prefixes:+ set to: [2]
insert user-set-to :1 +1 USER_ID=5 USERNICK :quux
+log 1 $ channels:#ch_test7:prefixes:= set to: [5]
insert join-channel-1 : +0 CHANNEL=#ch_test7 RESIDENT_IDS :[2], [4], [5], [me]
log 8 $ residents: baz, @bar, quux, foo
× parts-core
insert exit-channel : + exitTYPE=P exitDESC :parts
-× part-1
× part
> /part
log 1 > PART :CHANNEL
# join channel with other user
insert join-channel-0 : +0 CHANNEL=#test RESIDENT_NAMES :foo @baz
insert user-set-to :1 +1 USER_ID=1 USERNICK :baz
+log 1 $ channels:#test:prefixes:@ set to: [1]
insert join-channel-1 : +0 CHANNEL=#test RESIDENT_IDS :[1], [me]
log 4 $ residents: baz, foo