home · contact · privacy
Handle shortening of usernames by USERLEN.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 18 Sep 2025 06:39:17 +0000 (08:39 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 18 Sep 2025 06:39:17 +0000 (08:39 +0200)
ircplom/client.py
ircplom/irc_conn.py
test.txt

index 224ccdbb30cf41d13ef68a28881508b2ed2ae07e..d7d86fab535a32938706774111982dfd772deacd 100644 (file)
@@ -498,6 +498,7 @@ class _UpdatingUser(_UpdatingAttrsMixin, _User):
 
 
 class _UpdatingUsersDict(_UpdatingDict[_UpdatingUser]):
+    userlen: int
 
     def __init__(self, **kwargs) -> None:
         super().__init__(**kwargs)
@@ -529,7 +530,8 @@ class _UpdatingUsersDict(_UpdatingDict[_UpdatingUser]):
             # .nick by definition same, check other fields for updatability;
             # allow where '?', or for set .user only to add "~" prefix, assert
             # nothing else could have changed
-            if stored.user == '?' or nickuserhost.user == f'~{stored.user}':
+            if stored.user == '?'\
+                    or nickuserhost.user == f'~{stored.user}'[:self.userlen]:
                 assert updating
                 stored.user = nickuserhost.user
             else:
@@ -604,10 +606,12 @@ class _ClientDb(_Clearable, _UpdatingAttrsMixin, SharedClientDbFields):
                     'userid_for_nickuserhost': self.users.id_for_nickuserhost,
                     'get_membership_prefixes': self._get_membership_prefixes,
                     'purge_users': self.users.purge}
-        elif key == 'users' and attr._create_if_none is None:
-            attr._create_if_none = {
-                    'names_channels_of_user': self.channels.of_user,
-                    'remove_from_channels': self.channels.remove_user}
+        elif key == 'users':
+            attr.userlen = int(self.isupport['USERLEN'])
+            if attr._create_if_none is None:
+                attr._create_if_none = {
+                        'names_channels_of_user': self.channels.of_user,
+                        'remove_from_channels': self.channels.remove_user}
         elif key == 'caps' and attr._create_if_none is None:
             attr._create_if_none = {}
         return attr
index af04814b4b73254c9775bfd69acfd86b59f3c50d..fb1bd21d973d4fbe42b93688f40035b31e20f0ee 100644 (file)
@@ -17,7 +17,8 @@ ILLEGAL_NICK_CHARS = ' ,*?!@'
 ILLEGAL_NICK_FIRSTCHARS = ':$'
 ISUPPORT_DEFAULTS = {
     'CHANTYPES': '#&',
-    'PREFIX': '(ov)@+'
+    'PREFIX': '(ov)@+',
+    'USERLEN': '10'
 }
 _IRCSPEC_LINE_SEPARATOR = b'\r\n'
 _IRCSPEC_TAG_ESCAPES = ((r'\:', ';'),
index 1b842a2c5f4f1f9d3f70eef2fe43a81788510f52..5afb4bfee90f275f899cbadcf3f39bf41b23ad69 100644 (file)
--- a/test.txt
+++ b/test.txt
 # ETC.
 
 # on /connect init databases, log in new windows
-> /connect foo.bar.baz foo:bar bar:baz
+> /connect foo.bar.baz foo:bar foobarbazquux:baz
 1,2 $ isupport cleared
 1,2 $ isupport:CHANTYPES set to: [#&]
 1,2 $ isupport:PREFIX set to: [(ov)@+]
+1,2 $ isupport:USERLEN set to: [10]
 1,2 $ caps cleared
 1,2 $ users cleared
 1,2 $ channels cleared
@@ -55,7 +56,7 @@
 1,2 $ hostname set to: [foo.bar.baz]
 1,2 $ port set to: [-1]
 1,2 $ nick_wanted set to: [foo]
-1,2 $ user_wanted set to: [bar]
+1,2 $ user_wanted set to: [foobarbazquux]
 1,2 $ realname set to: [baz]
 1,2 $ password set to: [bar]
 1,2 $ port set to: [6697]
@@ -64,7 +65,7 @@
 1,2 $ connection_state set to: [connected]
 
 2 > CAP LS :302
-2 > USER bar 0 * :baz
+2 > USER foobarbazquux 0 * :baz
 2 > NICK :foo
 
 2 < :*.?.net NOTICE * :*** Looking up your ident...
 2 > AUTHENTICATE :PLAIN
 2 < AUTHENTICATE +
 2 > AUTHENTICATE :Zm9vAGZvbwBiYXI=
-2 < :foo.bar.baz 900 foo foo!bar@baz.bar.foo foo :You are now logged in as foo
+2 < :foo.bar.baz 900 foo foo!foobarbazq@baz.bar.foo foo :You are now logged in as foo
 
 1,2 $ users:me:nick set to: [?]
 1,2 $ ?!?@? renames ?
 1,2 $ users:me:nick set to: [foo]
 1,2 $ ?!?@? renames foo
-1,2 $ users:me:user set to: [bar]
+1,2 $ users:me:user set to: [foobarbazq]
 1,2 $ users:me:host set to: [baz.bar.foo]
 
 1,2 $ sasl_account set to: [foo]
 2 < :foo MODE foo :+Ziw
 1,2 $ users:me:modes set to: [+Ziw]
 
-2 < :SaslServ!SaslServ@services.bar.baz NOTICE foo :Last login from ~bar@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
-3 <<< [SaslServ] Last login from ~bar@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+2 < :SaslServ!SaslServ@services.bar.baz NOTICE foo :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+3 <<< [SaslServ] Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 
 > /join #test
 0 !# invalid prompt command: /join unknown
 
 > /join #test
 2 > JOIN :#test
-2 < :foo!~bar@baz.bar.foo JOIN #test
-1,2 $ users:me:user set to: [~bar]
+2 < :foo!~foobarbaz@baz.bar.foo JOIN #test
+1,2 $ users:me:user set to: [~foobarbaz]
 2 < :foo.bar.baz 332 foo #test :foo bar baz
 2 < :foo.bar.baz 333 foo #test bar!~bar@bar.bar 1234567890
 4 $ bar!~bar@bar.bar set topic: foo bar baz
 1,2 $ users:3 cleared
 1,2 $ users:3:nick set to: [?]
 , $ ?!?@? renames ?
-2 < :foo!~bar@baz.bar.foo PART :#test
-1,2,3,4 $ foo!~bar@baz.bar.foo parts
+2 < :foo!~foobarbaz@baz.bar.foo PART :#test
+1,2,3,4 $ foo!~foobarbaz@baz.bar.foo parts
 1,2 $ users:3 cleared
 1,2 $ channels:#test cleared
 1,2 $ users:1 cleared
 > /disconnect
 1,2 $ requesting disconnect …
 2 > QUIT :ircplom says bye
-2 < :foo!~bar@baz.bar.foo QUIT :Client Quit
-1,2,3,4 $ foo!~bar@baz.bar.foo quits: Client Quit
-2 < ERROR :Closing link: (bar@baz.bar.foo) [Quit: ircplom says bye]
-1,2,3,4 $ connection_state set to: [Closing link: (bar@baz.bar.foo) [Quit: ircplom says bye]]
+2 < :foo!~foobarbaz@baz.bar.foo QUIT :Client Quit
+1,2,3,4 $ foo!~foobarbaz@baz.bar.foo quits: Client Quit
+2 < ERROR :Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]
+1,2,3,4 $ connection_state set to: [Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]]
 1,2,3,4 $ connection_state set to: []
 1,2 $ isupport cleared
 1,2 $ isupport:CHANTYPES set to: [#&]
 1,2 $ isupport:PREFIX set to: [(ov)@+]
+1,2 $ isupport:USERLEN set to: [10]
 1,2 $ motd set to:
 1,2 $ sasl_account set to: []
 1,2 $ sasl_auth_state set to: []
 # except for two positions marked with NB comment, exactly same as on 1st time
 1,2,3,4 $ connection_state set to: [connected]
 2 > CAP LS :302
-2 > USER bar 0 * :baz
+2 > USER foobarbazquux 0 * :baz
 2 > NICK :foo
 2 < :*.?.net NOTICE * :*** Looking up your ident...
 1,2 $$$ *** Looking up your ident...
 2 > AUTHENTICATE :PLAIN
 2 < AUTHENTICATE +
 2 > AUTHENTICATE :Zm9vAGZvbwBiYXI=
-2 < :foo.bar.baz 900 foo foo!bar@baz.bar.foo foo :You are now logged in as foo
+2 < :foo.bar.baz 900 foo foo!foobarbazq@baz.bar.foo foo :You are now logged in as foo
 1,2 $ users:me:nick set to: [?]
 1,2,3,4 $ ?!?@? renames ?
 1,2 $ users:me:nick set to: [foo]
 1,2,3,4 $ ?!?@? renames foo
-1,2 $ users:me:user set to: [bar]
+1,2 $ users:me:user set to: [foobarbazq]
 1,2 $ users:me:host set to: [baz.bar.foo]
 1,2 $ sasl_account set to: [foo]
 2 < :foo.bar.baz 903 foo :SASL authentication successful
 1,2 $   - (to this server) -
 2 < :foo MODE foo :+Ziw
 1,2 $ users:me:modes set to: [+Ziw]
-2 < :SaslServ!SaslServ@services.bar.baz NOTICE foo :Last login from ~bar@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
-3 <<< [SaslServ] Last login from ~bar@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+2 < :SaslServ!SaslServ@services.bar.baz NOTICE foo :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+3 <<< [SaslServ] Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 > /join #test
 2 > JOIN :#test
-2 < :foo!~bar@baz.bar.foo JOIN #test
-1,2 $ users:me:user set to: [~bar]
+2 < :foo!~foobarbaz@baz.bar.foo JOIN #test
+1,2 $ users:me:user set to: [~foobarbaz]
 2 < :foo.bar.baz 353 foo @ #test :foo @bar
 1,2 $ users:4:nick set to: [?]
 , $ ?!?@? renames ?