From 85bd9485475161684d479ec74bb40b22ca03f514 Mon Sep 17 00:00:00 2001 From: Gerd Flaig Date: Sat, 27 Dec 2008 16:42:23 +0100 Subject: [PATCH] automatic reconnect. handle more message types. --- empire.lisp | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/empire.lisp b/empire.lisp index 6230e93..cb666f4 100644 --- a/empire.lisp +++ b/empire.lisp @@ -93,11 +93,21 @@ this stream.") (setf (connection-handler connection) handler) connection)) - (defgeneric quit (connection)) (defgeneric handle-connection (connection)) (defgeneric read-message (connection)) (defgeneric send-message (connection message)) +(defgeneric reconnect (conncetion)) + +(defmethod reconnect ((c connection)) + (with-slots (server-name server-port user password socket stream connection-handler) c + (let* ((sock (usocket:socket-connect server-name server-port)) + (s (usocket:socket-stream sock)) + (handler (spawn-with-name (format nil "empire-handler-~a" user) + #'handle-connection c))) + (setf socket sock + stream s + connection-handler handler)))) (defparameter +C_CMDOK+ "0") (defparameter +C_DATA+ "1") @@ -135,6 +145,7 @@ this stream.") (defgeneric handle-init (base-mode message)) (defgeneric handle-exit (base-mode message)) (defgeneric handle-prompt (base-mode message)) +(defgeneric handle-simple-message (base-mode message)) (defmethod handle-init ((m init-mode) message) (declare (ignorable message)) @@ -159,10 +170,10 @@ this stream.") (format log "handle-data ~a~%" message) (empire-web:data (session c) message))) -(defmethod handle-flush ((m play-mode) message) +(defmethod handle-simple-message ((m play-mode) message) (let* ((c (connection m)) (log (logging-stream c))) - (format log "handle-flush ~a~%" message) + (format log "handle-simple-message ~a~%" message) (empire-web:data (session c) message))) (defmethod handle-prompt ((m play-mode) message) @@ -178,6 +189,9 @@ this stream.") (list `(,+C_DATA+ . handle-data) `(,+C_INIT+ . handle-init) `(,+C_EXIT+ . handle-exit) + `(,+C_FLUSH+ . handle-simple-message) + `(,+C_BADCMD+ . handle-simple-message) + `(,+C_FLASH+ . handle-simple-message) `(,+C_PROMPT+ . handle-prompt))) (defun parse-server-line (line) @@ -186,7 +200,9 @@ this stream.") if (eq (char line i) #\Space) do (return i))) (message-type (subseq line 0 first-space-index)) - (message (subseq line (+ first-space-index 1)))) + (message (if first-space-index + (subseq line (+ first-space-index 1)) + ""))) (values message message-type))) (defmethod handle-connection ((c connection)) @@ -216,15 +232,31 @@ this stream.") (funcall handler mode message) (error 'no-handler :mode mode :type type)))) line) - (sb-int:closed-stream-error () nil))) + (sb-int:closed-stream-error () nil) + (end-of-file () nil))) + +(defun raw-send-message (s message) + (write-sequence message s) + (terpri s) + (force-output s)) (defmethod send-message ((c connection) message) (let ((s (network-stream c)) (log (logging-stream c))) (format log "< ~a~%" message) - (write-sequence message s) - (terpri s) - (force-output s) + (let ((sent-p nil) + (tries 3)) + (loop + while (and (not sent-p) + (> tries 0)) + do (handler-case + (progn + (raw-send-message s message) + (setf sent-p t)) + (sb-int:closed-stream-error () + (progn + (decf tries) + (reconnect c)))))) message)) (defgeneric play (connection)) -- 2.43.0