Update of /project/net-nittin-irc/cvsroot/net-nittin-irc In directory common-lisp.net:/tmp/cvs-serv2300
Modified Files: TODO event.lisp package.lisp parse-message.lisp protocol.lisp Log Message: many fixes, exports and partial DCC SEND/CHAT implementation
Date: Mon Nov 10 12:25:38 2003 Author: eenge
Index: net-nittin-irc/TODO diff -u net-nittin-irc/TODO:1.5 net-nittin-irc/TODO:1.6 --- net-nittin-irc/TODO:1.5 Fri Nov 7 10:40:19 2003 +++ net-nittin-irc/TODO Mon Nov 10 12:25:38 2003 @@ -11,6 +11,3 @@ equivalence of two nicknames or channel names.
So when we do FIND-USER etc. we need to be mindful of this fact. - - - Make it so that the user can choose whether to automatically - accept DCC CHAT requests or not.
Index: net-nittin-irc/event.lisp diff -u net-nittin-irc/event.lisp:1.5 net-nittin-irc/event.lisp:1.6 --- net-nittin-irc/event.lisp:1.5 Fri Nov 7 10:40:19 2003 +++ net-nittin-irc/event.lisp Mon Nov 10 12:25:38 2003 @@ -1,4 +1,4 @@ -;;;; $Id: event.lisp,v 1.5 2003/11/07 15:40:19 eenge Exp $ +;;;; $Id: event.lisp,v 1.6 2003/11/10 17:25:38 eenge Exp $ ;;;; $Source: /project/net-nittin-irc/cvsroot/net-nittin-irc/event.lisp,v $
;;;; See LICENSE for licensing information. @@ -976,12 +976,30 @@ (defmethod irc-message-event ((message ctcp-dcc-chat-request-message)) (apply-to-hooks message) (client-log (connection message) message) - (let* ((user (find-user (connection message) (source message))) - (args (tokenize-string (trailing-argument message))) - (remote-address (hbo-to-vector-quad (parse-integer (fourth args)))) - (remote-port (parse-integer (fifth args) :junk-allowed t))) - (push (make-dcc-connection :user user - :remote-address remote-address - :remote-port remote-port) - *dcc-connections*))) + (when (automatically-accept-dcc-connections (configuration (connection message))) + (let* ((user (find-user (connection message) (source message))) + (args (tokenize-string (trailing-argument message))) + (remote-address (hbo-to-vector-quad (parse-integer (fourth args)))) + (remote-port (parse-integer (fifth args) :junk-allowed t))) + (push (make-dcc-connection :user user + :remote-address remote-address + :remote-port remote-port) + *dcc-connections*)))) + +(defmethod irc-message-event ((message ctcp-dcc-send-request-message)) + (apply-to-hooks message) + (client-log (connection message) message) + (when (automatically-accept-dcc-downloads (configuration (connection message))) + (let* ((user (find-user (connection message) (source message))) + (args (tokenize-string (trailing-argument message))) + (filename (third args)) + (remote-address (hbo-to-vector-quad (parse-integer (fourth args)))) + (remote-port (parse-integer (fifth args))) + (filesize (parse-integer (sixth args) :junk-allowed t))) + (let ((dcc-connection (make-dcc-connection :user user + :remote-address remote-address + :remote-port remote-port))) + (with-open-file (stream filename :direction :output + :if-exists :supersede) + (write-sequence (read-message-loop dcc-connection) stream))))))
Index: net-nittin-irc/package.lisp diff -u net-nittin-irc/package.lisp:1.3 net-nittin-irc/package.lisp:1.4 --- net-nittin-irc/package.lisp:1.3 Fri Nov 7 08:43:06 2003 +++ net-nittin-irc/package.lisp Mon Nov 10 12:25:38 2003 @@ -1,4 +1,4 @@ -;;;; $Id: package.lisp,v 1.3 2003/11/07 13:43:06 eenge Exp $ +;;;; $Id: package.lisp,v 1.4 2003/11/10 17:25:38 eenge Exp $ ;;;; $Source: /project/net-nittin-irc/cvsroot/net-nittin-irc/package.lisp,v $
;;;; See the LICENSE file for licensing information. @@ -12,6 +12,15 @@ (:export :read-message-loop :read-message :send-message + :server-name + :server-stream + :client-stream + :channels + :configuration + :all-users + :all-channels + :dangling-users + :channel-list :add-hook :remove-hook :remove-hooks
Index: net-nittin-irc/parse-message.lisp diff -u net-nittin-irc/parse-message.lisp:1.3 net-nittin-irc/parse-message.lisp:1.4 --- net-nittin-irc/parse-message.lisp:1.3 Fri Nov 7 10:40:19 2003 +++ net-nittin-irc/parse-message.lisp Mon Nov 10 12:25:38 2003 @@ -1,4 +1,4 @@ -;;;; $Id: parse-message.lisp,v 1.3 2003/11/07 15:40:19 eenge Exp $ +;;;; $Id: parse-message.lisp,v 1.4 2003/11/10 17:25:38 eenge Exp $ ;;;; $Source: /project/net-nittin-irc/cvsroot/net-nittin-irc/parse-message.lisp,v $
;;;; See the LICENSE file for licensing information. @@ -75,6 +75,9 @@ (:dcc-chat-request (when (string-equal (char string 5) #\C) :dcc-chat-request)) + (:dcc-send-request + (when (string-equal (char string 5) #\S) + :dcc-send-request)) (otherwise nil)))
(defun parse-ctcp-message (string) @@ -86,7 +89,8 @@ (#\A (ctcp-type-p string :action)) (#\C (ctcp-type-p string :clientinfo)) (#\D - (dcc-type-p string :dcc-chat-request)) + (or (dcc-type-p string :dcc-chat-request) + (dcc-type-p string :dcc-send-request))) (#\F (ctcp-type-p string :finger)) (#\P (ctcp-type-p string :ping)) (#\S (ctcp-type-p string :source))
Index: net-nittin-irc/protocol.lisp diff -u net-nittin-irc/protocol.lisp:1.6 net-nittin-irc/protocol.lisp:1.7 --- net-nittin-irc/protocol.lisp:1.6 Fri Nov 7 10:40:19 2003 +++ net-nittin-irc/protocol.lisp Mon Nov 10 12:25:38 2003 @@ -1,4 +1,4 @@ -;;;; $Id: protocol.lisp,v 1.6 2003/11/07 15:40:19 eenge Exp $ +;;;; $Id: protocol.lisp,v 1.7 2003/11/10 17:25:38 eenge Exp $ ;;;; $Source: /project/net-nittin-irc/cvsroot/net-nittin-irc/protocol.lisp,v $
;;;; See LICENSE for licensing information. @@ -52,6 +52,11 @@ :initarg :hooks :accessor hooks :initform (make-hash-table :test #'equal)) + (configuration + :initarg :configuration + :accessor configuration + :documentation "A CONFIGURATION object which would dictate much of +the behaviour of the library towards the connection object.") (dangling-users :initarg :dangling-users :accessor dangling-users @@ -72,15 +77,19 @@ (channels nil) (dangling-users nil) (hooks nil) - (channel-list nil)) - (let ((connection (make-instance 'connection - :user user - :server-name server-name - :server-stream server-stream - :client-stream client-stream - :channels channels - :dangling-users dangling-users - :channel-list channel-list))) + (channel-list nil) + (configuration nil)) + (let* ((configuration (or configuration + (make-configuration))) + (connection (make-instance 'connection + :user user + :server-name server-name + :server-stream server-stream + :client-stream client-stream + :channels channels + :dangling-users dangling-users + :channel-list channel-list + :configuration configuration))) (dolist (hook hooks) (add-hook connection (car hook) (cadr hook))) connection)) @@ -156,6 +165,33 @@ (setf (gethash class (hooks connection)) nil))
;; +;; Configuration +;; + +(defclass configuration () + ((automatically-accept-dcc-connections + :initarg :automatically-accept-dcc-connections + :accessor automatically-accept-dcc-connections + :initform t) + (automatically-accept-dcc-downloads + :initarg :automatically-accept-dcc-downloads + :accessor automatically-accept-dcc-downloads + :initform t) + (dcc-download-directory + :initarg :dcc-download-directory + :accessor dcc-download-directory + :initform (user-homedir-pathname)))) + +(defun make-configuration (&key + (automatically-accept-dcc-connections t) + (automatically-accept-dcc-downloads t) + (dcc-download-directory (user-homedir-pathname))) + (make-instance 'configuration + :automatically-accept-dcc-connections automatically-accept-dcc-connections + :automatically-accept-dcc-downloads automatically-accept-dcc-downloads + :dcc-download-directory dcc-download-directory)) + +;; ;; DCC Connection ;;
@@ -201,9 +237,10 @@ :output-stream t)))
(defmethod read-message ((connection dcc-connection)) - (format (output-stream connection) "~A~%" (read-line (stream connection))) - (force-output (output-stream connection)) - t) + (let ((message (read-line (stream connection)))) + (format (output-stream connection) "~A~%" message) + (force-output (output-stream connection)) + message))
(defmethod read-message-loop ((connection dcc-connection)) (loop while (read-message connection))) @@ -412,12 +449,14 @@
(defclass irc-error-reply (irc-message) ())
-(defmacro define-irc-message (command) - (let ((name (intern (format nil "IRC-~A-MESSAGE" command)))) - `(progn - (defmethod find-irc-message-class ((type (eql ,command))) - (find-class ',name)) - (defclass ,name (irc-message) ())))) +(let ((*print-case* :upcase)) + (defmacro define-irc-message (command) + (let ((name (intern (format nil "IRC-~A-MESSAGE" command)))) + `(progn + (defmethod find-irc-message-class ((type (eql ,command))) + (find-class ',name)) + (export ',name) + (defclass ,name (irc-message) ())))))
(defun create-irc-message-classes (class-list) (dolist (class class-list) @@ -458,12 +497,14 @@
(defclass standard-ctcp-message (ctcp-mixin message) ())
-(defmacro define-ctcp-message (ctcp-command) - (let ((name (intern (format nil "CTCP-~A-MESSAGE" ctcp-command)))) - `(progn - (defmethod find-ctcp-message-class ((type (eql ,ctcp-command))) - (find-class ',name)) - (defclass ,name (ctcp-mixin irc-message) ())))) +(let ((*print-case* :upcase)) + (defmacro define-ctcp-message (ctcp-command) + (let ((name (intern (format nil "CTCP-~A-MESSAGE" ctcp-command)))) + `(progn + (defmethod find-ctcp-message-class ((type (eql ,ctcp-command))) + (find-class ',name)) + (export ',name) + (defclass ,name (ctcp-mixin irc-message) ())))))
(defun create-ctcp-message-classes (class-list) (dolist (class class-list) @@ -471,7 +512,8 @@
;; should perhaps wrap this in an eval-when? (create-ctcp-message-classes '(:action :source :finger :ping - :version :userinfo :time :dcc-chat-request)) + :version :userinfo :time :dcc-chat-request + :dcc-send-request))
(defmethod find-ctcp-message-class (type) (find-class 'standard-ctcp-message))
net-nittin-irc-cvs@common-lisp.net