[beirc-cvs] CVS update: beirc/beirc.lisp
Andreas Fuchs
afuchs at common-lisp.net
Wed Sep 14 20:12:43 UTC 2005
Update of /project/beirc/cvsroot/beirc
In directory common-lisp.net:/tmp/cvs-serv15544
Modified Files:
beirc.lisp
Log Message:
Fix (mostly) two of the three known problems and implement "unseen messages"
functionality in the receiver list.
* on join (you or anybody else), you are no longer thrown into the
debugger (the problem was that I missed the : in the IRC spec for
JOIN messages. the channel is passed as the trailing arg.
* implemented more message types for the receiver finder; beirc can
now stay on #lisp for more than 5 minutes without barfing!
Date: Wed Sep 14 22:12:42 2005
Author: afuchs
Index: beirc/beirc.lisp
diff -u beirc/beirc.lisp:1.2 beirc/beirc.lisp:1.3
--- beirc/beirc.lisp:1.2 Tue Sep 13 22:48:11 2005
+++ beirc/beirc.lisp Wed Sep 14 22:12:40 2005
@@ -31,7 +31,8 @@
(cl:eval-when (:compile-toplevel :load-toplevel :execute)
(cl:require :split-sequence)
(cl:require :cl-irc)
- (cl:require :mcclim))
+ (cl:require :mcclim)
+ (cl:require :mcclim-freetype))
(defpackage :beirc
(:use :clim :clim-lisp :clim-sys)
@@ -68,6 +69,8 @@
(defclass receiver ()
((name :reader receiver-name :initarg :name)
(messages :accessor messages :initform nil)
+ (unseen-messages :accessor unseen-messages :initform 0)
+ (messages-directed-to-me :accessor messages-directed-to-me :initform 0)
(channel :reader channel :initform nil :initarg :channel)
(query :reader query :initform nil :initarg :query) ;; <- XXX: remove this.
(pane :reader pane :initform nil)
@@ -105,18 +108,36 @@
(gethash pane (receiver-panes frame)))
+;;; FIXME: many of these methods are the same and should be refactored
+;;; into perhaps three types.
(defmethod receiver-for-message ((message irc:irc-privmsg-message) frame)
;; XXX: handle target=ournick
(let ((target (first (irc:arguments message))))
(intern-receiver target frame :channel target)))
-(defmethod receiver-for-message ((message irc:irc-join-message) frame)
+(defmethod receiver-for-message ((message irc:ctcp-action-message) frame)
+ ;; XXX: handle target=ournick
(let ((target (first (irc:arguments message))))
(intern-receiver target frame :channel target)))
+(defmethod receiver-for-message ((message irc:irc-notice-message) frame)
+ ;; XXX: handle target=ournick
+ (let ((target (first (irc:arguments message))))
+ (intern-receiver target frame :channel target)))
+
+(defmethod receiver-for-message ((message irc:irc-join-message) frame)
+ (let ((target (irc:trailing-argument message)))
+ (intern-receiver target frame :channel target)))
+
(defmethod receiver-for-message ((message irc:irc-quit-message) frame)
(current-receiver frame) ; FIXME: quit messages should go to all channels/queries the user was on.
)
+(defmethod receiver-for-message ((message irc:irc-nick-message) frame)
+ (current-receiver frame) ; FIXME: quit messages should go to all channels/queries the user was on.
+ )
+(defmethod receiver-for-message ((message irc:irc-part-message) frame)
+ (let ((target (first (irc:arguments message))))
+ (intern-receiver target frame :channel target)))
;; TODO: more receiver-for-message methods.
@@ -160,11 +181,14 @@
&key initial-contents
&allow-other-keys)
(declare (ignore args))
- (dolist (k initial-contents)
+ (dolist (k (or initial-contents
+ (list (make-clim-application-pane))))
(sheet-adopt-child pane k)))
(defun raise-receiver (receiver &optional (frame *application-frame*))
(setf (current-receiver frame) receiver)
+ (setf (unseen-messages receiver) 0)
+ (setf (messages-directed-to-me receiver) 0)
(mapcar (lambda (pane)
(let ((pane-receiver (receiver-for-pane pane frame)))
(setf (sheet-enabled-p pane)
@@ -399,10 +423,19 @@
:name "Beirc Ticker")
(run-frame-top-level frame))))))))
+(defun message-directed-to-me-p (frame message)
+ (let ((my-nick (slot-value frame 'nick))
+ (text (or (irc:trailing-argument message) "")))
+ (search my-nick text)))
+
(defun post-message (frame message)
(let ((receiver (receiver-for-message message frame)))
(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))))
(clim-internals::event-queue-prepend
(climi::frame-event-queue frame)
(make-instance 'foo-event :sheet frame :receiver receiver))
@@ -431,7 +464,10 @@
(maphash #'suggest (receivers *application-frame*))))
(define-presentation-method present (o (type receiver) *standard-output* (view textual-view) &key)
- (format t "~A" (receiver-name o)))
+ (with-drawing-options (t :ink (cond ((> (messages-directed-to-me o) 0) +green+)
+ ((> (unseen-messages o) 0) +red+)
+ (t +black+)))
+ (format t "~A" (receiver-name o))))
(define-presentation-to-command-translator raise-this-receiver
(receiver com-raise-receiver beirc
More information about the Beirc-cvs
mailing list