_MsgParseExpectation(_MsgTok.SERVER,
'433', # ERR_NICKNAMEINUSE
(_MsgTok.NICKNAME,
- _MsgTok.NICKNAME,
+ (_MsgTok.NICKNAME, ':used'),
_MsgTok.ANY)),
_MsgParseExpectation((_MsgTok.USER_ADDRESS, ':named'),
'NICK',
]
+def _nick_incremented(nickname: str) -> str:
+ 'Return nickname with number suffix incremented, or "0" if none.'
+ name, digits = ([(nickname, '')]
+ + [(nickname[:i], nickname[i:])
+ for i in range(len(nickname), 0, -1)
+ if nickname[i:].isdigit()]
+ )[-1]
+ return name + str(0 if not digits else (int(digits) + 1))
+
+
class LogScope(Enum):
'Where log messages should go.'
ALL = auto()
'Return part of channels dictionary for channels user is currently in.'
return {k: v for k, v in self._channels.items() if user in v.users}
- @property
- def nick_incremented(self) -> str:
- 'Return .nick_wanted with number suffix incremented, or "0" if none.'
- name, digits = ([(self.nick_wanted, '')]
- + [(self.nick_wanted[:i], self.nick_wanted[i:])
- for i in range(len(self.nick_wanted), 0, -1)
- if self.nick_wanted[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.'
self._log(alert, alert=True)
elif ret['verb'] == '433': # ERR_NICKNAMEINUSE
self._log('nickname already in use, trying increment', alert=True)
- self.send(IrcMessage('NICK', params=(self._db.nick_incremented,)))
+ self.send(IrcMessage('NICK', (_nick_incremented(ret['used']),)))
elif ret['verb'] == '900': # RPL_LOGGEDIN
self._db.nickname = ret['full_address'][0]
self._db.username, self._db.client_host = ret['full_address'][1:]