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)
) -> 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]]))
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: