aboutsummaryrefslogtreecommitdiff
path: root/server/api/game-manager.lisp
blob: e5355d10b1134b17616d81f9055b6ecc7c39b2d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(in-package :remote-snake-server-api)

(defclass game-manager ()
  ((games
    :initform '())
   (next-id
    :initform 0)))

(defgeneric create-game (gm)
  (:documentation "Create a game in the Game Manager."))

(defmethod print-object :around ((gm game-manager) stream)
  (with-slots (games) gm
    (format stream "Games: ~a" games)))

(defgeneric delete-game (gm game-id)
  (:documentation "Delete a game from Game Manager."))

(defgeneric get-game (gm game-id)
  (:documentation "Fetch a game from Game Manager."))

(defmethod delete-game ((gm game-manager) game-id)
  (get-game gm game-id) ; First try to get the game (if not found, an error will be raised)
  (with-slots (games) gm
    (setf games (remove-if #'(lambda (entry) (eql game-id (getf entry :id))) games))))

(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)))
      (when (< (length game) 1) (error "Game ~a not found !" game-id))
      (getf (first game) :game))))

;;; Create a new game in gm and return its id
(defmethod create-game ((gm game-manager))
  (let ((new-game-id nil))
    (with-slots (games next-id) gm
      (push (list :id next-id :game (make-instance 'game)) games)
      (setf new-game-id next-id)
      (incf next-id))
    new-game-id))