self._socket = socket()
self._socket.settimeout(TIMEOUT_CONNECT)
self._socket.connect((hostname, PORT))
+ self._assumed_open = True
self._socket.settimeout(TIMEOUT_LOOP)
self._recv_loop = SocketRecvLoop(self._idx, self._q_to_main,
self._read_lines())
def close(self):
'Close both SocketRecvLoop and socket.'
+ self._assumed_open = False
self._recv_loop.stop()
self._socket.close()
def _write_line(self, line: str) -> None:
'Send line-separator-delimited message over socket.'
+ if not self._assumed_open:
+ self._q_to_main.eput('ALERT',
+ 'cannot send, assuming connection closed')
+ return
self._socket.sendall(line.encode('utf-8') + IRCSPEC_LINE_SEPARATOR)
def handle(self, event: Event) -> None:
msg: IrcMessage = event.payload[1]
if event.type_ == 'SEND':
self._write_line(msg.raw)
- if event.type_ == 'RECV' and msg.verb == 'PING':
- self._broadcast('SEND', IrcMessage('PONG', [msg.parameters[0]]))
+ elif event.type_ == 'RECV':
+ if msg.verb == 'PING':
+ self._broadcast('SEND',
+ IrcMessage('PONG', [msg.parameters[0]]))
+ elif msg.verb == 'ERROR'\
+ and msg.parameters[0].startswith('Closing link:'):
+ self._assumed_open = False
class IrcMessage: