r10829: keep trying re-adding logger after a disconnection.
[irc-logger.git] / logger.lisp
index 9a4b8f1b7bb3d82690a7bbe8c9a4d1330694e587..cb1a2430633082e774b653f3d57065bbdd8b87fa 100644 (file)
@@ -9,7 +9,7 @@
 (defvar *daemon-monitor-process* nil "Process of background monitor.")
 (defparameter *timeout* 60)
 
-(defclass channel ()
+(defclass log-channel ()
   ((name :initarg :name :reader c-name
         :documentation "Name of channel.")
    (streams :initarg :streams :reader streams
 
 (defun add-private-log-entry (logger fmt &rest args)
   (apply #'add-log-entry
-        (if (get-private-log-stream logger) 
+        (if (and logger (get-private-log-stream logger))
             (get-private-log-stream logger) 
-            *standard-output*)
+           *standard-output*)
         fmt args))
 
 (defun privmsg-hook (msg)
       (output-event msg :privmsg channel (trailing-argument msg))))))
 
 (defun action-hook (msg)
-  (output-event msg :action (first (arguments msg))
-               (subseq (trailing-argument msg) 8 
-                       (- (length (trailing-argument msg)) 1))))
+  (let ((end (- (length (trailing-argument msg)) 1)))
+    ;; end has been as low as 7
+    (when (< end 8)
+      (warn "End is less than 8: `~A'." msg))
+    (output-event msg :action (first (arguments msg))
+                 (subseq (trailing-argument msg) (min 8 end)
+                         (- (length (trailing-argument msg)) 1)))))
 
 (defun nick-hook (msg)
   (output-event msg :nick nil (trailing-argument msg)))
 
 
 (defun make-a-channel (name formats output)
-  (make-instance 'channel
+  (make-instance 'log-channel
                 :name name
                 :streams (make-array (length formats) :initial-element nil)
                 :output-root (when (and (pathnamep output)
   (add-private-log-entry nil "Calling create-logger [add-logger].~%")
   (let ((logger
         (do ((new-logger 
-              (mp:with-timeout (*timeout* nil)
+              (#-sbcl mp:with-timeout #-sbcl (*timeout* nil)
+               #+sbcl sb-ext:with-timeout #+sbcl *timeout*
                 (create-logger nick server :channels channels :output output
                                :logging-stream logging-stream :password password
                                :realname realname :username username
                                :unknown-log unknown-log 
                                :formats formats
                                :async async))
-              (mp:with-timeout (*timeout* nil)
+              (#-sbcl mp:with-timeout #-sbcl (*timeout* nil)
+               #+sbcl sb-ext:with-timeout #+sbcl *timeout*
                 (create-logger nick server :channels channels :output output
                                :logging-stream logging-stream :password password
                                :realname realname :username username
   (let ((text (trailing-argument msg))
        (logger (find-logger-with-connection (connection msg))))
     (when (and (stringp text) 
-              (zerop (search (format nil "Closing Link: ~A" (l-nickname logger)) text)))
+              (eql 0 (search (format nil "Closing Link: ~A"
+                                     (l-nickname logger)) text)))
       (setf (warning-message-utime logger) (received-time msg)))
     (output-event msg :error nil (trailing-argument msg))))
 
            *recon-channel-names* (channel-names logger))
       (ignore-errors (remove-logger logger)))
     
-    (let ((new-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*
-                       :private-log *recon-private-log*
-                       :unknown-log *recon-unknown-log*
-                       :async *recon-async*
-                       :formats *recon-formats*))))
-      (when new-logger
-       (sleep 5)
-       (when (is-connected new-logger)
-         (log-reconnection new-logger)))))
+    (do ((new-logger nil))
+        (new-logger)
+      (setq new-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*
+                          :private-log *recon-private-log*
+                          :unknown-log *recon-unknown-log*
+                          :async *recon-async*
+                          :formats *recon-formats*)))
+      (cond
+       (new-logger
+       (sleep 20)
+       (cond
+         ((is-connected new-logger)
+          (log-reconnection new-logger))
+         (t
+          (log-daemon-message new-logger "Newly added logger is not connected. Removing connection and will re-attempt.")
+          (ignore-errors (remove-logger new-logger))
+          (setq new-logger nil))))
+       (t
+        (log-daemon-message nil "Got NIL for new logger. Waiting and retrying.")
+        (sleep 20)))))
   ) ;; end closure
 
 (defun daemon-monitor ()