Browse Source

Handle various possible error messages from the IRC server

master
JustAnotherArchivist 4 years ago
parent
commit
8f84c2a81c
1 changed files with 39 additions and 2 deletions
  1. +39
    -2
      http2irc.py

+ 39
- 2
http2irc.py View File

@@ -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:


Loading…
Cancel
Save