Send updates in chunks
[eow] / empire.lisp
index 7f6eb3156cd3ed22861101dcdbeddaff292ddfb0..c32696c3504258bd0f4bf78d61806f3b419c11c0 100644 (file)
@@ -91,7 +91,7 @@
 (defgeneric quit (connection))
 (defgeneric handle-connection (connection))
 (defgeneric read-message (connection))
 (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))
 
 (defgeneric connected-p (connection))
 (defgeneric reconnect (conncetion))
 
     (send-next-line c)))
 
 (defmethod send-next-line ((c connection))
     (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))))
+    (etypecase 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)))
 
 (defmethod handle-prompt ((m play-mode) message)
   (let* ((c (connection m)))
   (let ((s (network-stream c)))
     (raw-send-message s message)))
 
   (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))
   (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+ #\;)
 
 
 (defparameter +special-command-char+ #\;)