From 314f63c596d5ed625b969a92de5112069d14a8f2 Mon Sep 17 00:00:00 2001 From: Gerd Flaig Date: Fri, 2 Jan 2009 19:14:22 +0100 Subject: [PATCH] Kill previous login per default --- empire.lisp | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/empire.lisp b/empire.lisp index 34aea13..14ee352 100644 --- a/empire.lisp +++ b/empire.lisp @@ -81,7 +81,7 @@ (handler (spawn-with-name (format nil "empire-handler-~a" user) #'handle-connection connection))) (setf (connection-handler connection) handler) - (empire-log:info "empire:connect: ~a" connection) + (empire-log:info "~a: connect" connection) connection)) (defgeneric quit (connection)) @@ -93,12 +93,11 @@ (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))) + (s (usocket:socket-stream sock))) (setf socket sock stream s - connection-handler handler))) + connection-handler (spawn-with-name (format nil "empire-handler-~a" user) + #'handle-connection c)))) (empire-log:info "~a: reconnect" c)) (defparameter +C_CMDOK+ "0") @@ -140,19 +139,20 @@ (defgeneric handle-prompt (base-mode message)) (defgeneric handle-flush (base-mode message)) (defgeneric handle-simple-message (base-mode message)) +(defgeneric handle-ignore (base-mode message)) (defmethod handle-init ((m init-mode) message) (declare (ignorable message)) (with-slots (play-sent-p) m (if (not play-sent-p) - (progn - (play (connection m)) + (let ((c (connection m))) + (login-and-play c) (setf play-sent-p t)) (set-new-mode m 'play-mode)))) (defmethod handle-exit ((m init-mode) message) (declare (ignorable message)) - (quit (connection m))) + t) (defmethod handle-exit ((m play-mode) message) (declare (ignorable message)) @@ -178,6 +178,10 @@ (empire-web:prompt (session c) (format nil "[~a,~a]: " minutes btus)))))) +(defmethod handle-ignore ((m init-mode) message) + (declare (ignorable message)) + t) + (defparameter *line-type-dispatch* (list `(,+C_DATA+ . handle-data) `(,+C_INIT+ . handle-init) @@ -185,6 +189,7 @@ `(,+C_FLUSH+ . handle-flush) `(,+C_BADCMD+ . handle-simple-message) `(,+C_FLASH+ . handle-simple-message) + `(,+C_CMDOK+ . handle-ignore) `(,+C_PROMPT+ . handle-prompt))) (defun parse-server-line (line) @@ -231,17 +236,22 @@ (write-sequence message s) (terpri s) (force-output s)) - -(defmethod send-message ((c connection) message) + +(defgeneric send-message-one (connection string)) +(defmethod send-message-one ((c connection) message) (empire-log:info "~a: > ~a" c message) + (let ((s (network-stream c))) + (raw-send-message s message))) + +(defmethod send-message ((c connection) message) (let ((sent-p nil) (tries 3)) (loop while (and (not sent-p) (> tries 0)) do (handler-case - (let ((s (network-stream c))) - (raw-send-message s message) + (progn + (send-message-one c message) (setf sent-p t)) (sb-int:closed-stream-error () (progn @@ -267,10 +277,15 @@ (cond ((special-command-p line) (special-command c (subseq line 1))) (t (send-message c line)))) -(defgeneric play (connection)) -(defmethod play ((c connection)) +(defgeneric login-and-play (connection)) +(defmethod login-and-play ((c connection)) + (send-message-one c (format nil "client eow ~a" *version*)) + (send-message-one c "user FIXME") (with-slots (user password) c - (send-message c (format nil "play FIXME ~a ~a" user password)))) + (send-message-one c (format nil "coun ~a" user)) + (send-message-one c (format nil "pass ~a" password))) + (send-message-one c "kill") + (send-message-one c "play")) (defmethod quit ((c connection)) (usocket:socket-close (socket c))) -- 2.43.0