return
self._socket.settimeout(TIMEOUT_LOOP)
self._assumed_open = True
- self._loop = _ConnectionLoop(conn_idx=self.conn_idx,
+ self._loop = _ConnectionLoop(self,
q_to_main=self._q_to_main,
- bonus_iterator=self._read_lines(),
- login=self._login,
- set_login=self._set_login)
+ bonus_iterator=self._read_lines())
self.broadcast_conn(_ConnectedEvent)
Thread(target=connect, daemon=True, args=(self,)).start()
- def _set_login(self, **kwargs) -> None:
+ def update_login(self, **kwargs) -> None:
+ 'Adapt ._login attributes to kwargs, broadcast NickSetEvent.'
for key, val in kwargs.items():
setattr(self._login, key, val)
self.broadcast_conn(NickSetEvent)
def close(self) -> None:
'Close both _ConnectionLoop and socket.'
self._assumed_open = False
- self._set_login(nick_confirmed=False)
+ self.update_login(nick_confirmed=False)
if self._loop:
self._loop.stop()
self._loop = None
return
self._socket.sendall(line.encode('utf-8') + _IRCSPEC_LINE_SEPARATOR)
+ def send(self, verb: str, parameters: tuple[str, ...]) -> None:
+ 'Broadcast SendEvent for IrcMessage(verb, parameters).'
+ self.broadcast_conn(SendEvent, IrcMessage(verb, parameters))
+
def handle(self, event: ConnEvent) -> None:
'Process connection-directed Event into further steps.'
if isinstance(event, InitReconnectEvent):
else:
self._start_connecting()
elif isinstance(event, _ConnectedEvent):
- assert self._loop is not None
- self._loop.put(event)
+ # self.send('CAP', ('LS', '302'))
+ self.send('USER', (self._login.user, '0', '*', self._login.real))
+ self.send('NICK', (self._login.nick,))
+ # self.send('CAP', ('LIST',))
+ # self.send('CAP', ('END',))
elif isinstance(event, _DisconnectedEvent):
self.close()
elif isinstance(event, SendEvent):
return self._raw
-class _ConnectionLoop(Loop, BroadcastConnMixin):
- 'Loop receiving and translating socket messages towards main loop.'
+class _ConnectionLoop(Loop):
+ 'Loop to react on messages from server.'
- def __init__(self, login: LoginNames, set_login: Callable, **kwargs
- ) -> None:
+ def __init__(self, conn: IrcConnection, **kwargs) -> None:
super().__init__(**kwargs)
- self._login = login
- self._set_login = set_login
-
- def _send(self, verb: str, parameters: tuple[str, ...]) -> None:
- self.broadcast_conn(SendEvent, IrcMessage(verb, parameters))
-
- def process_main(self, event: Event) -> bool:
- if not super().process_main(event):
- return False
- if isinstance(event, _ConnectedEvent):
- # self._send('CAP', ('LS', '302'))
- self._send('USER', (self._login.user, '0', '*', self._login.real))
- self._send('NICK', (self._login.nick,))
- # self._send('CAP', ('LIST',))
- # self._send('CAP', ('END',))
- return True
+ self._conn = conn
def process_bonus(self, yielded: str) -> None:
msg = IrcMessage.from_raw(yielded)
- self.broadcast_conn(LogConnEvent, f'<-: {msg.raw}')
+ self._conn.broadcast_conn(LogConnEvent, f'<-: {msg.raw}')
if msg.verb == 'PING':
- self._send('PONG', (msg.parameters[0],))
+ self._conn.send('PONG', (msg.parameters[0],))
elif msg.verb == 'ERROR'\
and msg.parameters[0].startswith('Closing link:'):
- self.broadcast_conn(_DisconnectedEvent)
+ self._conn.broadcast_conn(_DisconnectedEvent)
elif msg.verb in {'001', 'NICK'}:
- self._set_login(nick=msg.parameters[0], nick_confirmed=True)
+ self._conn.update_login(nick=msg.parameters[0],
+ nick_confirmed=True)