diff --git a/http2irc.py b/http2irc.py index 039c078..a3e7ef0 100644 --- a/http2irc.py +++ b/http2irc.py @@ -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: