From d261883d4148a87ea8f6bb6cef16be406a2c0a10 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Thu, 9 May 2019 18:38:31 +0200 Subject: [PATCH] Update api --- doc/api.org | 16 ++++----- doc/api.pdf | Bin 119891 -> 119335 bytes server/api/api.lisp | 64 ++++++++++++++++++++++++++++++++++- server/api/game-manager.lisp | 8 +++++ server/game/game.lisp | 7 ++++ server/packages.lisp | 7 ++-- 6 files changed, 91 insertions(+), 11 deletions(-) diff --git a/doc/api.org b/doc/api.org index cd7dec3..25eb9a0 100644 --- a/doc/api.org +++ b/doc/api.org @@ -22,8 +22,8 @@ "syn": 1, "game-id": 1, "game-over": false, - "snake": [(1,2),(1,3)], - "food": [(6,7)] + "snake": [[1,2],[1,3]], + "food": [[6,7]] } #+END_SRC Note that, syn entry is used to keep packet ordering consistent and detecting packet inversion on the network. Thus, @@ -46,8 +46,8 @@ "syn": 2, "game-id": 1, "game-over": false, - "snake": [(0,2),(1,2)], - "food": [(6,7)] + "snake": [[0,2],[1,2]], + "food": [[6,7]] } #+END_SRC *** Refresh Screen @@ -67,8 +67,8 @@ "syn": 3, "game-id": 1, "game-over": false, - "snake": [(1,2),(0,2)], - "food": [(6,7)] + "snake": [[1,2],[0,2]], + "food": [[6,7]] } #+END_SRC *** End Game @@ -79,8 +79,8 @@ "syn": null, "game-id": 1, "game-over": true, - "snake": [(0,2),(1,2)], - "food": [(6,7)] + "snake": [[0,2],[1,2]], + "food": [[6,7]] } #+END_SRC - No reply is expected from the client and server will be in charge to free local memory. Note that syn=null. diff --git a/doc/api.pdf b/doc/api.pdf index a02a350c3ce9d5b2bef5143cbd3abd9b4cb989a0..b2b5cc959ad80bb3bab5d781a860bb8cae7462c5 100644 GIT binary patch delta 29829 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
mZ3+N^{ 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�sTynrz2+bKtncL@SxR|QCH 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 diff --git a/server/api/api.lisp b/server/api/api.lisp index 186076c..3bd7e49 100644 --- a/server/api/api.lisp +++ b/server/api/api.lisp @@ -4,6 +4,68 @@ (defclass api () ((gm - :initform (make-instance 'game-manager)))) + :initform (make-instance 'game-manager)) + (games-syn + :initform '()))) + + +(defmethod create-syn ((api api) game-id &optional (initial-value 0)) + (unless (eq nil (get-syn api game-id)) (error "This game ~a already have a syn !" game-id)) + (with-slots (games-syn) api + (push (list :game-id game-id :syn initial-value) games-syn) + initial-value)) + +(defmethod refresh-syn ((api api) game-id) + (with-slots (games-syn) api + (incf (getf (first (remove-if-not #'(lambda (entry) (eql game-id (getf entry :game-id))) games-syn)) :syn)))) + +(defmethod get-syn ((api api) game-id) + (with-slots (games-syn) api + (getf (first (remove-if-not #'(lambda (entry) (eql game-id (getf entry :game-id))) games-syn)) :syn))) + + + +;;; TODO: Handle errors (valid json etc..) +(defun parse-request (request) + (flet ((normalizer (key) + (string-upcase key))) + (let ((p-request (parse request :normalize-all t :keyword-normalizer #'normalizer ))) + p-request))) + +(defmethod handle-new-game ((api api) data) + (with-slots (gm) api + (let* ((game-id (create-game gm)) + (game-syn (create-syn api game-id 1))) ; Create syn with 1 (since first packet already receive) + (let ((game-dump (dump gm game-id))) + (setf (getf game-dump :game-over) :null) ; Define nil as null (for json) + (to-json + (append (list :type "state" :syn game-syn) game-dump)))))) + +;;; TODO: RETURN JSON !!!! +(defmethod handle-update ((api api) data) + (with-slots (gm) api + (let* ((dir (getf data :direction)) + (game-id (getf data :game-id)) + (game (get-game gm game-id))) + (cond + ((equal dir "up") (setf dir :up)) + ((equal dir "down") (setf dir :down)) + ((equal dir "left") (setf dir :left)) + ((equal dir "right") (setf dir :right)) + (t (setf dir nil))) + (if dir + (refresh game :dir dir) + (refresh game))))) + + + +(defmethod handle-request ((api api) request) + (let* ((data (parse-request request)) + (type (getf data :type))) + (cond + ((equal type "new-game") (handle-new-game api data)) + ((equal type "update") (handle-update api data)) + (t (format t "Unknow type"))))) + diff --git a/server/api/game-manager.lisp b/server/api/game-manager.lisp index e5355d1..751aae1 100644 --- a/server/api/game-manager.lisp +++ b/server/api/game-manager.lisp @@ -24,6 +24,14 @@ (with-slots (games) gm (setf games (remove-if #'(lambda (entry) (eql game-id (getf entry :id))) games)))) +(defgeneric dump (g game-id) + (:documentation "Dump a game in the Game manager. Return a plist.")) + +(defmethod dump ((g game-manager) game-id) + (with-slots (games) g + (append (list :id game-id) (remote-snake-server-game:dump (get-game g game-id))))) + + (defmethod get-game ((gm game-manager) game-id) (with-slots (games) gm (let ((game (remove-if-not #'(lambda (entry) (eql game-id (getf entry :id))) games))) diff --git a/server/game/game.lisp b/server/game/game.lisp index f909f36..9ea2029 100644 --- a/server/game/game.lisp +++ b/server/game/game.lisp @@ -39,6 +39,13 @@ (format t "~%Direction: ~a" dir) (format t "~%Food: ~a" food))) +(defgeneric dump (g) + (:documentation "Dump a game. Return a plist.")) + +(defmethod dump ((g game)) + (with-slots (snake food game-over) g + (list :snake snake :food food :game-over game-over))) + ;;; Note that there is no waranty that nb food are added (ex: if food position collide with snake position) (defgeneric add-food (g nb) (:documentation "Add food on the game grid.")) diff --git a/server/packages.lisp b/server/packages.lisp index 788083d..3f3788d 100644 --- a/server/packages.lisp +++ b/server/packages.lisp @@ -2,10 +2,13 @@ (:nicknames :rsg) (:use :common-lisp) (:export - #:game)) + #:game + #:dump + #:refresh)) (defpackage :remote-snake-server-api (:nicknames :rsapi) - (:use :common-lisp :jonathan) + (:use :common-lisp :jonathan :remote-snake-server-game) + (:shadow #:dump) ; Because game-manager also has a dump method (:export #:api))