r8548: fix bug with unknown/private stream of nil
[irc-logger.git] / logger.lisp
index 26c78f55ac2350e51b524c6bf5bff87b36382a8e..16a47aff2e5336703a96456c2aba9f48803629ce 100644 (file)
     (format stream "~S~%" 
            (string-right-trim '(#\return) (raw-message-string msg)))))
 
+(defconstant +posix-epoch+
+  (encode-universal-time 0 0 0 1 1 1970 0))
+
+(defun posix-time-to-utime (time)
+  (+ time +posix-epoch+))
+
 (defun last-sexp-field (type msg)
   (cond
    ((null msg)
     nil)
    ((eq type :kick)
     (trailing-argument msg))
+   ((eq type :rpl_topicwhotime)
+    (when (stringp (car (last (arguments msg))))
+      (let ((secs (parse-integer (car (last (arguments msg))) :junk-allowed t)))
+       (when secs
+         (posix-time-to-utime secs)))))
    ((need-user-address? type)
     (user-address msg))))
 
 (defmethod %output-event ((format (eql :sexp)) stream utime type channel source text
                          msg unichannel)
-  (let ((*print-circle* nil)
-       (*print-pretty* nil))
+  (with-standard-io-syntax
     (if unichannel
        (format stream "(~S ~S ~S ~S ~S)~%" utime type source text (last-sexp-field type msg))
-      (format stream "(~S ~S ~S ~S ~S ~S)~%" utime type source channel text
-             (last-sexp-field type msg)))))
+       (format stream "(~S ~S ~S ~S ~S ~S)~%" utime type source channel text
+               (last-sexp-field type msg)))))
 
 (defmethod %output-event ((format (eql :text)) stream utime type channel
                          source text msg unichannel)
             (output-event-for-a-stream msg type channel text logger i))))))))
 
 (defun get-private-log-stream (logger)
-  (or (private-log-stream logger) *standard-output*))
+  (if (and logger (private-log-stream logger))
+      (private-log-stream logger)
+    *standard-output*))
 
 (defun get-unknown-log-stream (logger)
-  (or (unknown-log-stream logger) *standard-output*))
+  (if (and logger (unknown-log-stream logger))
+      (unknown-log-stream logger)
+    *standard-output*))
 
 (defun privmsg-hook (msg)
   (let ((logger (find-logger-with-connection (connection msg)))
   (output-event msg :rpl_topic (format nil "~{~A~^ ~}" (arguments msg))
                (trailing-argument msg)))
 
+(defun rpl_topicwhotime-hook (msg)
+  (output-event msg :rpl_topicwhotime
+               (second (arguments msg))
+               (third (arguments msg))))
+
+
 (defun invite-hook (msg)
   (let ((logger (find-logger-with-connection (connection msg))))
     (format 
     (add-hook conn 'irc::irc-rpl_topic-message 'rpl_topic-hook)
     (add-hook conn 'irc::irc-rpl_namreply-message 'rpl_namreply-hook)
     (add-hook conn 'irc::irc-rpl_endofnames-message 'rpl_endofnames-hook)
+    (add-hook conn 'irc::irc-rpl_topicwhotime-message 'rpl_topicwhotime-hook)
     conn))
 
 (defmethod cl-irc::irc-message-event :around ((msg cl-irc::irc-message))
        irc::irc-pong-message irc::irc-kill-message irc::irc-invite-message
        irc::irc-rpl_killdone-message irc::irc-rpl_closing-message
        irc::irc-rpl_topic-message irc::irc-rpl_namreply-message
-       irc::irc-rpl_endofnames-message)
+       irc::irc-rpl_endofnames-message irc::irc-rpl_topicwhotime-message
+       irc::irc-rpl_motd-message irc::irc-rpl_motdstart-message
+       irc::irc-rpl_endofmotd-message)
        ;; nothing to do
        )
       (t
 (defun add-logger (nick server &key channels output (password "")
                                    realname username private-log unknown-log
                                    (logging-stream t) (async t)
-                                   (formats '(:text)))
+                                   (formats '(:sexp)))
   (when (find-logger-with-nick nick)
     (format
      (get-private-log-stream (find-logger-with-nick nick))