[beirc-cvs] CVS update: beirc/beirc.lisp
Andreas Fuchs
afuchs at common-lisp.net
Sun Sep 25 12:31:14 UTC 2005
Update of /project/beirc/cvsroot/beirc
In directory common-lisp.net:/tmp/cvs-serv25317
Modified Files:
beirc.lisp
Log Message:
Show QUIT and NICK messages in every channel the user and me are in.
This change comes at a price: I had to basically copy cl-irc's
READ-MESSAGE method, and use a lot of unexported symbols, too. Ugh.
Date: Sun Sep 25 14:31:13 2005
Author: afuchs
Index: beirc/beirc.lisp
diff -u beirc/beirc.lisp:1.29 beirc/beirc.lisp:1.30
--- beirc/beirc.lisp:1.29 Sun Sep 25 00:30:23 2005
+++ beirc/beirc.lisp Sun Sep 25 14:31:05 2005
@@ -157,9 +157,11 @@
(macrolet ((define-global-message-receiver-lookup (message-type)
`(defmethod receiver-for-message ((message ,message-type) frame)
- ;; FIXME: global messages should go to all
- ;; channels/queries the source (user) was on.
- (current-receiver frame))))
+ (remove nil
+ (mapcar (lambda (channel)
+ (find-receiver (irc:name channel) frame))
+ (irc:channels (irc:find-user (beirc::current-connection frame)
+ (irc:source message))))))))
(define-global-message-receiver-lookup irc:irc-quit-message)
(define-global-message-receiver-lookup irc:irc-nick-message))
@@ -438,20 +440,26 @@
(text (or (irc:trailing-argument message) "")))
(search my-nick text)))
+(defun post-message-to-receiver (frame message receiver)
+ (setf (messages receiver)
+ (append (messages receiver) (list message)))
+ (unless (eql receiver (current-receiver frame))
+ (incf (unseen-messages receiver))
+ (when (message-directed-to-me-p frame message)
+ (incf (messages-directed-to-me receiver))))
+ (update-drawing-options receiver)
+ (clim-internals::event-queue-prepend
+ (climi::frame-event-queue frame)
+ (make-instance 'foo-event :sheet frame :receiver receiver))
+ nil)
+
(defun post-message (frame message)
(let ((receiver (receiver-for-message message frame)))
- (unless (null receiver)
- (setf (messages receiver)
- (append (messages receiver) (list message)))
- (unless (eql receiver (current-receiver frame))
- (incf (unseen-messages receiver))
- (when (message-directed-to-me-p frame message)
- (incf (messages-directed-to-me receiver))))
- (update-drawing-options receiver)
- (clim-internals::event-queue-prepend
- (climi::frame-event-queue frame)
- (make-instance 'foo-event :sheet frame :receiver receiver))
- nil)))
+ (cond ((consp receiver)
+ (loop for 1-receiver in receiver
+ do (post-message-to-receiver frame message 1-receiver)))
+ ((null receiver) nil)
+ (t (post-message-to-receiver frame message receiver)))))
(defun ticker (frame)
(loop
@@ -818,10 +826,23 @@
(defclass beirc-connection (irc:connection)
())
-(defmethod irc:read-message :around ((connection beirc-connection))
- (let ((message (call-next-method connection)))
- (post-message *application-frame* message)
- message))
+;;; KLUDGE: "why isn't this an :around method," you ask? CL-IRC's
+;;; read-message registers the message's content before passing the
+;;; message back, which means that QUIT and NICK messages can not be
+;;; meaningfully decoded, with respect to: on which channels was the
+;;; user before we got the message (so that we can display it
+;;; everywhere it is relevant).
+;;; So, this method is basically a copy of IRC:READ-MESSAGE. ugh.
+(defmethod irc:read-message ((connection beirc-connection))
+ (handler-case
+ (when (irc::connectedp connection)
+ (let ((message (irc::read-irc-message connection)))
+ (post-message *application-frame* message)
+ (irc::irc-message-event message)
+ message))
+ (stream-error (c) (signal 'irc::invalidate-me :stream
+ (irc:server-stream connection)
+ :condition c))))
(defun irc-event-loop (frame connection)
(unwind-protect
More information about the Beirc-cvs
mailing list