Allow atomic mode switching in the sender
authorGerd Flaig <gefla@pond.sub.org>
Sun, 26 Apr 2009 09:14:52 +0000 (11:14 +0200)
committerGerd Flaig <gefla@pond.sub.org>
Sun, 26 Apr 2009 09:14:52 +0000 (11:14 +0200)
empire.lisp

index 7f6eb3156cd3ed22861101dcdbeddaff292ddfb0..001f755037313cdcc13e1168199eea4817c3a096 100644 (file)
@@ -91,7 +91,7 @@
 (defgeneric quit (connection))
 (defgeneric handle-connection (connection))
 (defgeneric read-message (connection))
-(defgeneric send-message (connection message))
+(defgeneric send-message (connection message &key next-mode))
 (defgeneric connected-p (connection))
 (defgeneric reconnect (conncetion))
 
     (send-next-line c)))
 
 (defmethod send-next-line ((c connection))
-  (send-message-one c (locked-queue:dequeue (send-queue c))))
+  (let ((next-event (locked-queue:dequeue (send-queue c))))
+    (typecase next-event
+      (string (send-message-one c next-event))
+      (cons (let ((message (car next-event))
+                 (mode (cdr next-event)))
+             (send-message-one c message)
+             (set-new-mode c mode))))))
 
 (defmethod handle-prompt ((m play-mode) message)
   (let* ((c (connection m)))
   (let ((s (network-stream c)))
     (raw-send-message s message)))
 
-(defmethod send-message ((c connection) message)
+(defmethod send-message ((c connection) message &key next-mode)
   (if (not (connected-p c))
       (reconnect c))
-  (locked-queue:enqueue (send-queue c) message))
+  (if next-mode
+      (locked-queue:enqueue (send-queue c) (cons message next-mode))
+      (locked-queue:enqueue (send-queue c) message)))
 
 (defparameter +special-command-char+ #\;)