-(defun attempt-reconnection (logger)
- (log-disconnection logger)
- (setf (connection logger) nil)
- (let ((connection (connect :nickname (nickname logger)
- :server (server logger)
- :channel-names (channel-names logger)
- :username (username logger)
- :realname (realname logger)
- :logging-stream (logging-stream logger))))
- (when (and connection (cl-irc::connectedp connection))
- (setf (connection logger) connection)
- (log-reconnection logger)
- t)))
+(defun is-connected (logger)
+ (when (ignore-errors (ping (connection logger) (server logger)))
+ (dotimes (i 20)
+ (when (and (last-pong logger)
+ (< (- (get-universal-time) (last-pong logger)) 21))
+ (return-from is-connected t))
+ (sleep 1))))
+
+
+(let (*recon-nick* *recon-server* *recon-username* *recon-realname*
+ *recon-user-output*
+ *recon-formats* *recon-async* *recon-logging-stream* *recon-channel-names*)
+ (declare (special *recon-nick* *recon-server* *recon-username* *recon-realname*
+ *recon-formats* *recon-password* *recon-async*
+ *recon-user-output*
+ *recon-logging-stream* *recon-channel-names*))
+
+ (defun attempt-reconnection (logger)
+ (when (is-connected logger)
+ (return-from attempt-reconnection nil))
+
+ (log-disconnection logger)
+ (when (connection logger)
+ (ignore-errors (quit (connection logger) "Client terminated by server"))
+ (setf *recon-nick* (nickname logger)
+ *recon-server* (server logger)
+ *recon-username* (username logger)
+ *recon-realname* (realname logger)
+ *recon-password* (password logger)
+ *recon-async* (async logger)
+ *recon-user-output* (user-output logger)
+ *recon-formats* (formats logger)
+ *recon-logging-stream* (logging-stream logger)
+ *recon-channel-names* (channel-names logger))
+ (ignore-errors (remove-logger logger)))
+
+ (ignore-errors
+ (add-logger *recon-nick* *recon-server*
+ :channels *recon-channel-names*
+ :output *recon-user-output*
+ :password *recon-password*
+ :realname *recon-realname*
+ :username *recon-username*
+ :logging-stream *recon-logging-stream*
+ :async *recon-async*
+ :formats *recon-formats*)))
+ )