handle ERR_NICKNAMEINUSE pre-registration (add alt-nicknames param)

This commit is contained in:
jesopo 2020-09-30 10:06:47 +00:00
parent 4d9dcf0652
commit bfdae87b36
2 changed files with 21 additions and 2 deletions

View File

@ -46,6 +46,7 @@ class ConnectionParams(object):
sts: Optional[STSPolicy] = None
resume: Optional[ResumePolicy] = None
reconnect: int = 10 # seconds
reconnect: int = 10 # seconds
alt_nicknames: List[str] = field(default_factory=list)
autojoin: List[str] = field(default_factory=list)

View File

@ -69,7 +69,8 @@ class Server(IServer):
self._wait_for: Optional[Tuple[Awaitable, WaitFor]] = None
self._wait_for_fut: Optional[Future[WaitFor]] = None
self._pending_who: Deque[str] = deque()
self._pending_who: Deque[str] = deque()
self._initial_nick: Optional[str] = None
def hostmask(self) -> str:
hostmask = self.nickname
@ -139,6 +140,8 @@ class Server(IServer):
username = self.params.username or nickname
realname = self.params.realname or nickname
self._initial_nick = nickname
# these must remain non-awaited; reading hasn't started yet
if not self.params.password is None:
self.send(build("PASS", [self.params.password]))
@ -172,6 +175,21 @@ class Server(IServer):
self._pending_who.pop()
await self._next_who()
elif (line.command == ERR_NICKNAMEINUSE and
self._initial_nick is not None):
nick = self._initial_nick
alt_nicks = self.params.alt_nicknames
if not alt_nicks:
alt_nicks = [nick+"_"*i for i in range(3)]
for alt_nick in alt_nicks:
if await self.send_nick(alt_nick):
break
else:
self._initial_nick = None
await self.send(build("QUIT"))
elif emit is not None:
if emit.command == "001":
await self.send(build("WHO", [self.nickname]))