Update of /project/cl-irc/cvsroot/cl-irc
In directory common-lisp.net:/tmp/cvs-serv2975
Modified Files:
command.lisp event.lisp protocol.lisp
Log Message:
Three patches from Mr. Fuchs:
* the way to handle all IRC messages is by defining your own subclass of connection; use this
* fix a usage of an undefined function
* find-or-make-user should use username, hostmask and realname values as soon as they're available
Date: Sun Sep 25 16:55:03 2005
Author: bmastenbrook
Index: cl-irc/command.lisp
diff -u cl-irc/command.lisp:1.11 cl-irc/command.lisp:1.12
--- cl-irc/command.lisp:1.11 Sun Sep 18 16:24:45 2005
+++ cl-irc/command.lisp Sun Sep 25 16:55:02 2005
@@ -1,4 +1,4 @@
-;;;; $Id: command.lisp,v 1.11 2005/09/18 14:24:45 bmastenbrook Exp $
+;;;; $Id: command.lisp,v 1.12 2005/09/25 14:55:02 bmastenbrook Exp $
;;;; $Source: /project/cl-irc/cvsroot/cl-irc/command.lisp,v $
;;;; See LICENSE for licensing information.
@@ -245,10 +245,12 @@
(mode 0)
(server *default-irc-server*)
(port *default-irc-server-port*)
+ (connection-type 'connection)
(logging-stream t))
"Connect to server and return a connection object."
(let* ((stream (socket-connect server port))
- (connection (make-connection :server-stream stream
+ (connection (make-connection :connection-type connection-type
+ :server-stream stream
:client-stream logging-stream
:server-name server))
(user (make-user connection
Index: cl-irc/event.lisp
diff -u cl-irc/event.lisp:1.10 cl-irc/event.lisp:1.11
--- cl-irc/event.lisp:1.10 Tue Sep 13 22:34:41 2005
+++ cl-irc/event.lisp Sun Sep 25 16:55:02 2005
@@ -1,4 +1,4 @@
-;;;; $Id: event.lisp,v 1.10 2005/09/13 20:34:41 ehuelsmann Exp $
+;;;; $Id: event.lisp,v 1.11 2005/09/25 14:55:02 bmastenbrook Exp $
;;;; $Source: /project/cl-irc/cvsroot/cl-irc/event.lisp,v $
;;;; See LICENSE for licensing information.
@@ -229,7 +229,9 @@
(defmethod default-hook ((message irc-nick-message))
(let* ((con (connection message))
- (user (find-or-create-user con (source message))))
+ (user (find-or-make-user con (source message)
+ :hostname (host message)
+ :username (user message))))
(change-nickname con user (trailing-argument message))))
(defmethod default-hook ((message irc-kick-message))
Index: cl-irc/protocol.lisp
diff -u cl-irc/protocol.lisp:1.24 cl-irc/protocol.lisp:1.25
--- cl-irc/protocol.lisp:1.24 Sun Apr 17 23:14:30 2005
+++ cl-irc/protocol.lisp Sun Sep 25 16:55:02 2005
@@ -1,4 +1,4 @@
-;;;; $Id: protocol.lisp,v 1.24 2005/04/17 21:14:30 ehuelsmann Exp $
+;;;; $Id: protocol.lisp,v 1.25 2005/09/25 14:55:02 bmastenbrook Exp $
;;;; $Source: /project/cl-irc/cvsroot/cl-irc/protocol.lisp,v $
;;;; See LICENSE for licensing information.
@@ -185,12 +185,13 @@
(defgeneric case-map-name (connection))
(defgeneric re-apply-case-mapping (connection))
-(defun make-connection (&key (user nil)
+(defun make-connection (&key (connection-type 'connection)
+ (user nil)
(server-name "")
(server-stream nil)
(client-stream t)
(hooks nil))
- (let ((connection (make-instance 'connection
+ (let ((connection (make-instance connection-type
:user user
:server-name server-name
:server-stream server-stream
@@ -772,12 +773,21 @@
(defmethod find-or-make-user ((connection connection) nickname &key (username "")
(hostname "") (realname ""))
- (or (find-user connection nickname)
- (make-user connection
- :nickname nickname
- :username username
- :hostname hostname
- :realname realname)))
+ (let ((user (find-user connection nickname)))
+ (unless user
+ (setf user
+ (make-user connection
+ :nickname nickname
+ :username username
+ :hostname hostname
+ :realname realname)))
+ (labels ((update-slot-if-known (slotname value)
+ (when (string= (slot-value user slotname) "")
+ (setf (slot-value user slotname) value))))
+ (update-slot-if-known 'username username)
+ (update-slot-if-known 'hostname hostname)
+ (update-slot-if-known 'realname realname))
+ user))
(defmethod change-nickname ((connection connection) (user user) new-nickname)
(let ((new-user user)