home · contact · privacy
Disallow sending to (probably) closed connections. master
authorChristian Heller <c.heller@plomlompom.de>
Thu, 5 Jun 2025 14:24:33 +0000 (16:24 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 5 Jun 2025 14:24:33 +0000 (16:24 +0200)
ircplom.py

index 16c3ca7036d4fbe2f8f3736ec85f33323c49e9db..54a8599f3c7f3a2ba7d00f7b699de541ab25dfd8 100755 (executable)
@@ -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: