[beirc-cvs] CVS beirc
afuchs
afuchs at common-lisp.net
Thu Mar 16 20:22:57 UTC 2006
Update of /project/beirc/cvsroot/beirc
In directory clnet:/tmp/cvs-serv10954
Modified Files:
application.lisp
Log Message:
Do nothing if connecting to a server/nick that we're already connected to.
--- /project/beirc/cvsroot/beirc/application.lisp 2006/03/16 19:29:10 1.59
+++ /project/beirc/cvsroot/beirc/application.lisp 2006/03/16 20:22:57 1.60
@@ -133,6 +133,14 @@
&optional (connection (current-connection *application-frame*)))
(cdr (assoc connection (server-receivers frame) :test #'connection=)))
+(defmethod server-receiver-from-args ((frame beirc) server-name port nickname)
+ (loop for (connection . receiver) in (server-receivers frame)
+ if (and (equal (irc:nickname (irc:user connection)) nickname)
+ (equal (irc:server-name connection) server-name)
+ ;; TODO: no port.
+ )
+ do (return receiver)))
+
(defmethod (setf server-receiver) (newval (frame beirc)
&optional (connection (current-connection *application-frame*)))
(pushnew (cons connection newval) (slot-value frame 'server-receivers)
@@ -817,33 +825,34 @@
(pass 'string :prompt "Password" :default nil)
(port 'number :prompt "Port" :default irc::*default-irc-server-port*))
(let ((success nil))
- (let* ((frame *application-frame*)
- (connection (apply #'irc:connect
- :nickname nick :server server :connection-type 'beirc-connection :port port
- (if (null pass)
- nil
- `(:password ,pass))))
- (server-receiver (intern-receiver (format nil "~A on ~A:~A" nick server port) connection frame)))
- (unwind-protect
- (progn
- (setf (irc:client-stream connection) (make-broadcast-stream))
- (when (tab-layout:find-in-tab-panes-list (find-pane-named frame 'server)
- (find-pane-named frame 'query))
- (tab-layout:remove-pane (find-pane-named frame 'server)
- (find-pane-named frame 'query)))
- (setf (server-receiver frame connection) server-receiver)
- (setf (ui-process *application-frame*) (current-process))
- (setf (connection-process *application-frame* connection)
- (clim-sys:make-process #'(lambda ()
- (restart-case
- (irc-event-loop frame connection)
- (disconnect ()
- :report "Terminate this connection"
- (disconnect connection frame "Client Disconnect"))))
- :name "IRC Message Muffling Loop"))
- (setf success t))
- (unless success
- (disconnect connection frame "Client error."))))))
+ (or (server-receiver-from-args *application-frame* server port nick)
+ (let* ((frame *application-frame*)
+ (connection (apply #'irc:connect
+ :nickname nick :server server :connection-type 'beirc-connection :port port
+ (if (null pass)
+ nil
+ `(:password ,pass))))
+ (server-receiver (intern-receiver (format nil "~A on ~A:~A" nick server port) connection frame)))
+ (unwind-protect
+ (progn
+ (setf (irc:client-stream connection) (make-broadcast-stream))
+ (when (tab-layout:find-in-tab-panes-list (find-pane-named frame 'server)
+ (find-pane-named frame 'query))
+ (tab-layout:remove-pane (find-pane-named frame 'server)
+ (find-pane-named frame 'query)))
+ (setf (server-receiver frame connection) server-receiver)
+ (setf (ui-process *application-frame*) (current-process))
+ (setf (connection-process *application-frame* connection)
+ (clim-sys:make-process #'(lambda ()
+ (restart-case
+ (irc-event-loop frame connection)
+ (disconnect ()
+ :report "Terminate this connection"
+ (disconnect connection frame "Client Disconnect"))))
+ :name "IRC Message Muffling Loop"))
+ (setf success t))
+ (unless success
+ (disconnect connection frame "Client error.")))))))
(defun disconnect (connection frame reason)
(let ((*application-frame* frame))
More information about the Beirc-cvs
mailing list