else:
self.isupports[toks[0]] = toks[1] if len(toks) > 1 else ''
+ @property
+ def nick_incremented(self) -> str:
+ 'Return .nickname with number suffix incremented, or "0" if none yet.'
+ name, digits = ([(self.nickname, '')]
+ + [(self.nickname[:i], self.nickname[i:])
+ for i in range(len(self.nickname), 0, -1)
+ if self.nickname[i:].isdigit()]
+ )[-1]
+ return name + str(0 if not digits else (int(digits) + 1))
+
class Client(ABC, ClientQueueMixin):
'Abstracts socket connection, loop over it, and handling messages from it.'
# '@'-split because <https://defs.ircdocs.horse/defs/numerics>
# claims: "<hostname> can also be in the form <user@hostname>"
self._db.client_host = msg.params[1].split('@')[-1]
+ elif msg.match('433', 3): # ERR_NICKNAMEINUSE
+ new_nick = self._db.nick_incremented
+ self._log('nickname already in use, trying {new_nick}', alert=True)
+ self.send(IrcMessage(verb='NICK', params=(new_nick,)))
elif msg.match('903', 2) or msg.match('904', 2): # RPL_SUCESS, or …
self._db.sasl_auth_state = 'WIN' if msg.verb == '903' else 'FAIL'
self._caps.end_negotiation() # … ERR_SASLFAIL