|
|
@@ -381,12 +381,20 @@ class IRCClientProtocol(asyncio.Protocol): |
|
|
|
if message.startswith(b':'): |
|
|
|
# Prefixed message, extract command + parameters (the prefix cannot contain a space) |
|
|
|
message = message.split(b' ', 1)[1] |
|
|
|
|
|
|
|
# PING/PONG |
|
|
|
if message.startswith(b'PING '): |
|
|
|
self.send(b'PONG ' + message[5:]) |
|
|
|
elif message.startswith(b'PONG '): |
|
|
|
self.pongReceivedEvent.set() |
|
|
|
elif message.startswith(b'CAP ') and self.sasl and message[message.find(b' ', 4) + 1:] == b'ACK :sasl': |
|
|
|
self.send(b'AUTHENTICATE EXTERNAL') |
|
|
|
|
|
|
|
# SASL |
|
|
|
elif message.startswith(b'CAP ') and self.sasl: |
|
|
|
if message[message.find(b' ', 4) + 1:] == b'ACK :sasl': |
|
|
|
self.send(b'AUTHENTICATE EXTERNAL') |
|
|
|
else: |
|
|
|
self.logger.error(f'Received unexpected CAP reply {message!r}, terminating connection') |
|
|
|
self.transport.close() |
|
|
|
elif message == b'AUTHENTICATE +': |
|
|
|
self.send(b'AUTHENTICATE +') |
|
|
|
elif message.startswith(b'903 '): # SASL auth successful |
|
|
@@ -395,6 +403,35 @@ class IRCClientProtocol(asyncio.Protocol): |
|
|
|
elif any(message.startswith(x) for x in (b'902 ', b'904 ', b'905 ', b'906 ', b'908 ')): |
|
|
|
self.logger.error('SASL error, terminating connection') |
|
|
|
self.transport.close() |
|
|
|
|
|
|
|
# NICK errors |
|
|
|
elif any(message.startswith(x) for x in (b'431 ', b'432 ', b'433 ', b'436 ')): |
|
|
|
self.logger.error(f'Failed to set nickname: {message!r}, terminating connection') |
|
|
|
self.transport.close() |
|
|
|
|
|
|
|
# USER errors |
|
|
|
elif any(message.startswith(x) for x in (b'461 ', b'462 ')): |
|
|
|
self.logger.error(f'Failed to register: {message!r}, terminating connection') |
|
|
|
self.transport.close() |
|
|
|
|
|
|
|
# JOIN errors |
|
|
|
elif any(message.startswith(x) for x in (b'405 ', b'471 ', b'473 ', b'474 ', b'475 ')): |
|
|
|
self.logger.error(f'Failed to join channel: {message!r}, terminating connection') |
|
|
|
self.transport.close() |
|
|
|
|
|
|
|
# PART errors |
|
|
|
elif message.startswith(b'442 '): |
|
|
|
self.logger.error(f'Failed to part channel: {message!r}') |
|
|
|
|
|
|
|
# JOIN/PART errors |
|
|
|
elif message.startswith(b'403 '): |
|
|
|
self.logger.error(f'Failed to join or part channel: {message!r}') |
|
|
|
|
|
|
|
# PRIVMSG errors |
|
|
|
elif any(message.startswith(x) for x in (b'401 ', b'404 ', b'407 ', b'411 ', b'412 ', b'413 ', b'414 ')): |
|
|
|
self.logger.error(f'Failed to send message: {message!r}') |
|
|
|
|
|
|
|
# Connection registration reply |
|
|
|
elif message.startswith(b'001 '): |
|
|
|
self.logger.info('IRC connection registered') |
|
|
|
if self.sasl and not self.authenticated: |
|
|
|