home · contact · privacy
Open connection window before connection success, log error to it.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 5 Jun 2025 19:07:18 +0000 (21:07 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 5 Jun 2025 19:07:18 +0000 (21:07 +0200)
ircplom.py

index 203c8b2ceeae1d801275fa9a68d558315dfd394f..f9d9a90886613983f5eb5f0e17b264a62a9a6631 100755 (executable)
@@ -6,7 +6,7 @@ from contextlib import contextmanager
 from inspect import _empty as inspect_empty, signature, stack
 from queue import SimpleQueue, Empty as QueueEmpty
 from signal import SIGWINCH, signal
-from socket import socket
+from socket import socket, gaierror as socket_gaierror
 from threading import Thread
 from typing import (
     Any, Callable, Generator, Iterator, Literal, NamedTuple, Optional, Self)
@@ -158,14 +158,20 @@ class IrcConnection:
                  ) -> None:
         self._idx = idx
         self._q_to_main = q_to_main
+        self._assumed_open = False
+        self._recv_loop: Optional[SocketRecvLoop] = None
         self._socket = socket()
         self._socket.settimeout(TIMEOUT_CONNECT)
-        self._socket.connect((hostname, PORT))
+        self._broadcast('CONNECTION_WINDOW', self._idx)
+        try:
+            self._socket.connect((hostname, PORT))
+        except socket_gaierror as e:
+            self._broadcast('CONN_ALERT', str(e))
+            return
         self._assumed_open = True
         self._socket.settimeout(TIMEOUT_LOOP)
         self._recv_loop = SocketRecvLoop(self._idx, self._q_to_main,
                                          self._read_lines())
-        self._broadcast('CONNECTION_WINDOW', self._idx)
         self._broadcast('SEND', IrcMessage('USER', [login[0], '0', '*',
                                                     login[2]]))
         self._broadcast('SEND', IrcMessage('NICK', [login[1]]))
@@ -173,7 +179,8 @@ class IrcConnection:
     def close(self):
         'Close both SocketRecvLoop and socket.'
         self._assumed_open = False
-        self._recv_loop.stop()
+        if self._recv_loop:
+            self._recv_loop.stop()
         self._socket.close()
 
     def _broadcast(self, type_: str, payload: Any = None) -> None: