X-Git-Url: http://git.pond.sub.org/?p=eow;a=blobdiff_plain;f=empire.lisp;h=8a83ac0082f6a1806dab2c98a55cf48c9157b15d;hp=062c0fe960964ed642936ee318c853135efe133a;hb=534a13f805a930866db4a55e58bc86dc1608dce4;hpb=1fb3cc7e25d5bb3f5802a2dbe0ea4d710ff9e48e diff --git a/empire.lisp b/empire.lisp index 062c0fe..8a83ac0 100644 --- a/empire.lisp +++ b/empire.lisp @@ -180,6 +180,10 @@ (:kill-sent (send-message-one connection "play") (setf phase :play-sent))))) +(defmethod handle-data ((m init-mode) message) + (declare (ignorable message)) + t) + (defmethod handle-exit ((m play-mode) message) (declare (ignorable message)) (quit (connection m))) @@ -204,13 +208,17 @@ (cons (let ((message (car next-event)) (mode (cdr next-event))) (send-message-one c message) - (set-new-mode c mode)))))) + (set-new-mode (connection-mode c) mode)))))) + +(defun read-no-eval (stream) + (let ((*read-eval* nil)) + (read stream))) (defmethod handle-prompt ((m play-mode) message) (let* ((c (connection m))) (with-input-from-string (s message) - (let* ((minutes (read s)) ;;FIXME DANGEROUS - (btus (read s))) + (let* ((minutes (read-no-eval s)) + (btus (read-no-eval s))) (empire-web:prompt (session c) (format nil "[~a,~a]: " minutes btus)))) (send-next-line c))) @@ -267,6 +275,7 @@ (error 'no-handler :mode mode :type type)))) line) (sb-int:closed-stream-error () nil) + (sb-int:simple-stream-error () nil) (end-of-file () nil))) (defun raw-send-message (s message) @@ -293,8 +302,28 @@ (and (> (length line) 0) (char= +special-command-char+ (aref line 0)))) +(defclass xdump-mode (play-mode) + ((parser :initform (xdump:make-parser)) + (phase :initform :meta-meta))) + +(defmethod handle-data ((m xdump-mode) message) + (with-slots (connection parser phase) m + (if (xdump:parse-line parser message) + ;;XXX consider something like a 'pop-mode function + (ccase phase + (:meta-meta + (setf phase :meta-table + parser (xdump:make-parser)) + (send-message connection "xdump meta table")) + (:meta-table + (setf phase :table + parser (xdump:make-parser)) + (send-message connection "xdump table *")) + (:table + (set-new-mode (connection-mode connection) 'play-mode)))))) + (defmethod special-xup ((c connection)) - t) + (send-message c "xdump meta meta" :next-mode 'xdump-mode)) (defmethod special-command ((c connection) line) (cond ((string= line "xup") (special-xup c))