From dfe0cab673bd4ca090305df04169bb8a84ef4459 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 5 Jun 2025 16:24:33 +0200 Subject: [PATCH] Disallow sending to (probably) closed connections. --- ircplom.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ircplom.py b/ircplom.py index 16c3ca7..54a8599 100755 --- a/ircplom.py +++ b/ircplom.py @@ -161,6 +161,7 @@ class IrcConnection: 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()) @@ -171,6 +172,7 @@ class IrcConnection: def close(self): 'Close both SocketRecvLoop and socket.' + self._assumed_open = False self._recv_loop.stop() self._socket.close() @@ -210,6 +212,10 @@ class IrcConnection: 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: @@ -217,8 +223,13 @@ class IrcConnection: 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: -- 2.30.2