conn: Optional[IrcConnection] = None
_cls_conn: type[IrcConnection] = IrcConnection
_expected_pong: str
+ _retry_in_s: int
def __init__(self, conn_setup: IrcConnSetup, channels: set[str], **kwargs
) -> None:
self._put(ExceptionEvent(CrashingException(e)))
else:
self._expected_pong = ''
+ self._retry_in_s = -1
self.db.connection_state = 'connected'
self.caps.start_negotation()
self.send('USER', self.db.user_wanted,
Thread(target=connect, daemon=True, args=(self,)).start()
def close(self) -> None:
- 'Close connection and wipe memory of its states.'
+ 'Close connection, wipe memory of its states, reconnect if indicated.'
if not self._autojoins:
for name in self.db.channels.keys():
self._autojoins.add(name)
if self.conn:
self.conn.close()
self.conn = None
+ if self._retry_in_s > 0:
+ self._retry_in_s *= 2
+ self.connect()
def on_handled_loop_exception(self, e: IrcConnException) -> None:
'On …AbortException, call .close(), on …Timeout… first (!) try PING.'
self.close()
elif isinstance(e, IrcConnTimeoutException):
if self._expected_pong:
+ self._retry_in_s = 1
self.on_handled_loop_exception(
IrcConnAbortException('no timely PONG from server'))
else:
2 .$ DISCONNECTED
| full-timeout-out
-# on re-connect, ensure timer cleared, so won't trigger already on 1st timeout
-> /window 1
-> /reconnect
+# on (automatic!) re-connect, ensure timer cleared, so won't trigger already on 1st timeout
+| conn2-in
repeat conn0-in conn0-out
2 .$ CONNECTED
repeat conn1-in conn1-out
+| conn2-out
repeat full-timeout-in full-timeout-out
+# after proof that a full double-timeout was necessary, we again automatically re-connect before our /quit gets processed …
+repeat conn2-in conn2-out
+
> /quit
0 .<