X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;ds=sidebyside;f=logger.lisp;h=a1b8f5b2be15b62d2dcce262d8ff7c9674a63068;hb=c12932912e292d322e6451aa4357c48863a8ecc0;hp=e0da56a665a345e32f28c42b6f7aba33eb884d22;hpb=5bce8846ed56d86d07b41f5fcb27e2630d82c4e1;p=irc-logger.git diff --git a/logger.lisp b/logger.lisp index e0da56a..a1b8f5b 100644 --- a/logger.lisp +++ b/logger.lisp @@ -20,6 +20,8 @@ :documentation "IRC connection object.") (nick :initarg :nick :reader nickname :documentation "Nickname of the bot.") + (password :initarg :password :reader password + :documentation "Nickname's nickserver password.") (server :initarg :server :reader server :documentation "Connected IRC server.") (channels :initarg :channels :reader channels @@ -45,6 +47,9 @@ (defun find-logger-with-nick (nick) (find nick (the list *loggers*) :test #'string-equal :key #'nickname)) +(defun find-logger-with-connection (conn) + (find conn (the list *loggers*) :test #'eq :key #'connection)) + (defun make-output-name (name year month day) (format nil "~A-~4,'0D.~2,'0D.~2,'0D" (string-left-trim '(#\#) name) year month day)) @@ -273,7 +278,13 @@ (output-event msg :kick (first (arguments msg)))) (defun notice-hook (msg) - (output-event msg :notice (first (arguments msg)) (trailing-argument msg))) + (if (and (string-equal (source msg) "NickServ") + (string-equal "owned by someone else" (trailing-argument msg))) + (let ((logger (find-logger-with-connection (connection msg)))) + (if logger + (privmsg (connection msg) (source msg) (format nil "IDENTIFY ~A" (password logger))) + (warn "NickServ asks for identity with connection not found."))) + (output-event msg :notice (first (arguments msg)) (trailing-argument msg)))) (defun topic-hook (msg) (output-event msg :topic (first (arguments msg)) (trailing-argument msg))) @@ -297,9 +308,8 @@ "Returns T if output is setup for a single channel directory structure." (and (pathnamep user-output) (null (pathname-name user-output)))) -(defun create-logger (nick server &key channels output - (logging-stream t) - (formats '(:text))) +(defun create-logger (nick server &key channels output password + (logging-stream t) (formats '(:text))) "OUTPUT may be a pathname or a stream" ;; check arguments (assert channels) @@ -316,6 +326,7 @@ 'logger :connection conn :nick nick + :password password :server server :channels (make-channels channels formats output) :user-output output @@ -337,8 +348,8 @@ (defun start-logger (logger async) (if async - (read-message-loop-background (connection logger)) - (read-message-loop (connection logger)))) + (start-background-message-handler (connection logger)) + (read-message-loop (connection logger)))) (defun quit-logger (nick) "Quit the active connection with nick and remove from active list." @@ -359,15 +370,13 @@ (delete nick *loggers* :test #'string-equal :key #'nickname)) t)))) -(defun add-logger (nick server &key channels output - (logging-stream t) - (async t) - (formats '(:text))) +(defun add-logger (nick server &key channels output (password "") + (logging-stream t) (async t) (formats '(:text))) (when (find-logger-with-nick nick) (warn "Closing previously active connection.") (quit-logger nick)) (let ((logger (create-logger nick server :channels channels :output output - :logging-stream logging-stream + :logging-stream logging-stream :password password :formats formats))) (push logger *loggers*) (start-logger logger async)