From 78d757ce5920161381d079af88811a855f0f90bd Mon Sep 17 00:00:00 2001 From: Pavel Korolev Date: Mon, 17 Apr 2017 14:23:15 +0300 Subject: [PATCH] Split into client and proxy server --- {assets => client/assets}/dude-and-mortar.brf | 0 {assets => client/assets}/font.brf | Bin .../mortar-combat-devel.conf.lisp | 0 .../mortar-combat.conf.lisp | 0 .../mortar-combat.dist.lisp | 0 run.bat => client/run.bat | 0 run.sh => client/run.sh | 0 {src => client/src}/ball.lisp | 0 {src => client/src}/camera.lisp | 0 {src => client/src}/dude.lisp | 0 {src => client/src}/main.lisp | 0 {src => client/src}/mortar.lisp | 0 {src => client/src}/packages.lisp | 0 {src => client/src}/room.lisp | 0 {src => client/src}/shaders/dude.lisp | 0 {src => client/src}/shaders/dude.v.glsl | 0 {src => client/src}/shaders/passthru.f.glsl | 0 {src => client/src}/shaders/passthru.lisp | 0 {src => client/src}/shaders/passthru.v.glsl | 0 {src => client/src}/utils.lisp | 0 mortar-combat.asd | 19 ++++- proxy/commands.lisp | 6 ++ proxy/context.lisp | 5 ++ proxy/packages.lisp | 7 ++ proxy/proxy.lisp | 75 ++++++++++++++++++ 25 files changed, 111 insertions(+), 1 deletion(-) rename {assets => client/assets}/dude-and-mortar.brf (100%) rename {assets => client/assets}/font.brf (100%) rename mortar-combat-devel.conf.lisp => client/mortar-combat-devel.conf.lisp (100%) rename mortar-combat.conf.lisp => client/mortar-combat.conf.lisp (100%) rename mortar-combat.dist.lisp => client/mortar-combat.dist.lisp (100%) rename run.bat => client/run.bat (100%) rename run.sh => client/run.sh (100%) rename {src => client/src}/ball.lisp (100%) rename {src => client/src}/camera.lisp (100%) rename {src => client/src}/dude.lisp (100%) rename {src => client/src}/main.lisp (100%) rename {src => client/src}/mortar.lisp (100%) rename {src => client/src}/packages.lisp (100%) rename {src => client/src}/room.lisp (100%) rename {src => client/src}/shaders/dude.lisp (100%) rename {src => client/src}/shaders/dude.v.glsl (100%) rename {src => client/src}/shaders/passthru.f.glsl (100%) rename {src => client/src}/shaders/passthru.lisp (100%) rename {src => client/src}/shaders/passthru.v.glsl (100%) rename {src => client/src}/utils.lisp (100%) create mode 100644 proxy/commands.lisp create mode 100644 proxy/context.lisp create mode 100644 proxy/packages.lisp create mode 100644 proxy/proxy.lisp diff --git a/assets/dude-and-mortar.brf b/client/assets/dude-and-mortar.brf similarity index 100% rename from assets/dude-and-mortar.brf rename to client/assets/dude-and-mortar.brf diff --git a/assets/font.brf b/client/assets/font.brf similarity index 100% rename from assets/font.brf rename to client/assets/font.brf diff --git a/mortar-combat-devel.conf.lisp b/client/mortar-combat-devel.conf.lisp similarity index 100% rename from mortar-combat-devel.conf.lisp rename to client/mortar-combat-devel.conf.lisp diff --git a/mortar-combat.conf.lisp b/client/mortar-combat.conf.lisp similarity index 100% rename from mortar-combat.conf.lisp rename to client/mortar-combat.conf.lisp diff --git a/mortar-combat.dist.lisp b/client/mortar-combat.dist.lisp similarity index 100% rename from mortar-combat.dist.lisp rename to client/mortar-combat.dist.lisp diff --git a/run.bat b/client/run.bat similarity index 100% rename from run.bat rename to client/run.bat diff --git a/run.sh b/client/run.sh similarity index 100% rename from run.sh rename to client/run.sh diff --git a/src/ball.lisp b/client/src/ball.lisp similarity index 100% rename from src/ball.lisp rename to client/src/ball.lisp diff --git a/src/camera.lisp b/client/src/camera.lisp similarity index 100% rename from src/camera.lisp rename to client/src/camera.lisp diff --git a/src/dude.lisp b/client/src/dude.lisp similarity index 100% rename from src/dude.lisp rename to client/src/dude.lisp diff --git a/src/main.lisp b/client/src/main.lisp similarity index 100% rename from src/main.lisp rename to client/src/main.lisp diff --git a/src/mortar.lisp b/client/src/mortar.lisp similarity index 100% rename from src/mortar.lisp rename to client/src/mortar.lisp diff --git a/src/packages.lisp b/client/src/packages.lisp similarity index 100% rename from src/packages.lisp rename to client/src/packages.lisp diff --git a/src/room.lisp b/client/src/room.lisp similarity index 100% rename from src/room.lisp rename to client/src/room.lisp diff --git a/src/shaders/dude.lisp b/client/src/shaders/dude.lisp similarity index 100% rename from src/shaders/dude.lisp rename to client/src/shaders/dude.lisp diff --git a/src/shaders/dude.v.glsl b/client/src/shaders/dude.v.glsl similarity index 100% rename from src/shaders/dude.v.glsl rename to client/src/shaders/dude.v.glsl diff --git a/src/shaders/passthru.f.glsl b/client/src/shaders/passthru.f.glsl similarity index 100% rename from src/shaders/passthru.f.glsl rename to client/src/shaders/passthru.f.glsl diff --git a/src/shaders/passthru.lisp b/client/src/shaders/passthru.lisp similarity index 100% rename from src/shaders/passthru.lisp rename to client/src/shaders/passthru.lisp diff --git a/src/shaders/passthru.v.glsl b/client/src/shaders/passthru.v.glsl similarity index 100% rename from src/shaders/passthru.v.glsl rename to client/src/shaders/passthru.v.glsl diff --git a/src/utils.lisp b/client/src/utils.lisp similarity index 100% rename from src/utils.lisp rename to client/src/utils.lisp diff --git a/mortar-combat.asd b/mortar-combat.asd index 4f7513d..b9e1185 100644 --- a/mortar-combat.asd +++ b/mortar-combat.asd @@ -11,7 +11,7 @@ :license "GPLv3" :depends-on (log4cl uiop cl-muth bodge-blobs cl-bodge) :serial t - :pathname "src/" + :pathname "client/src/" :components ((:file "packages") (:file "utils") (:file "camera") @@ -32,4 +32,21 @@ :license "GPLv3" :depends-on (bodge-blobs mortar-combat cl-bodge/distribution) :serial t + :pathname "client/" :components ((:file "mortar-combat.dist"))) + + +(defsystem mortar-combat/proxy + :description "Proxy server for Mortar Combat" + :version "0.0.1" + :author "Pavel Korolev" + :mailto "dev@borodust.org" + :license "GPLv3" + :depends-on (log4cl cl-muth cl-conspack usocket flexi-streams + cl-bodge/engine cl-bodge/utils) + :serial t + :pathname "proxy/" + :components ((:file "packages") + (:file "context") + (:file "proxy") + (:file "commands"))) diff --git a/proxy/commands.lisp b/proxy/commands.lisp new file mode 100644 index 0000000..56b6f3b --- /dev/null +++ b/proxy/commands.lisp @@ -0,0 +1,6 @@ +(in-package :mortar-combat.proxy) + + +(defmethod process-command ((command (eql :version)) message) + (list :command :version + :version +server-version+)) diff --git a/proxy/context.lisp b/proxy/context.lisp new file mode 100644 index 0000000..b533072 --- /dev/null +++ b/proxy/context.lisp @@ -0,0 +1,5 @@ +(in-package :mortar-combat.proxy) + + +(defclass mortar-combat-context () + ((arenas :initform (make-hash-table :test #'equal)))) diff --git a/proxy/packages.lisp b/proxy/packages.lisp new file mode 100644 index 0000000..583ea46 --- /dev/null +++ b/proxy/packages.lisp @@ -0,0 +1,7 @@ +(in-package :mortar-combat.def) + + +(defpackage :mortar-combat.proxy + (:use :cl :ge.ng :ge.util) + (:export start + stop)) diff --git a/proxy/proxy.lisp b/proxy/proxy.lisp new file mode 100644 index 0000000..8a11da5 --- /dev/null +++ b/proxy/proxy.lisp @@ -0,0 +1,75 @@ +(in-package :mortar-combat.proxy) + + +(defvar *main-latch* (mt:make-latch)) + + +(define-constant +server-version+ 1) + + +(defgeneric process-command (command message) + (:method (command message) + (list :command :error + :type :unknown-command + :text "Unknown command"))) + + +(defclass mortar-combat-proxy (thread-bound-system) + ((proxy-socket :initform nil) + (info-socket :initform nil))) + + +(defun process-request (this connection) + ;; fixme: record connection's last communication timestamp + ;; to autoclose idle connections + (run (-> (this) () + (let ((stream (usocket:socket-stream connection))) + (when (listen stream) + ;; fixme: make async + (let ((message (conspack:decode-stream stream))) + (when (listp message) + (conspack:encode (process-command (getf message :command) message) + :stream stream) + (force-output stream)))))))) + + +(defmethod initialize-system :after ((this mortar-combat-proxy)) + (with-slots (proxy-socket info-socket) this + (setf proxy-socket (usocket:socket-listen #(127 0 0 1) 8222 + :element-type '(unsigned-byte 8)) + info-socket (usocket:socket-listen #(127 0 0 1) 8778 + :element-type '(unsigned-byte 8))) + (in-new-thread "socket-listener" + (let ((sockets (list proxy-socket info-socket))) + (loop while (enabledp this) do + (loop for connection in (cddr (usocket:wait-for-input sockets)) + when (usocket:socket-state connection) + do (process-request this connection)) + (cond + ((usocket:socket-state info-socket) + (push (usocket:socket-accept info-socket) (cddr sockets))))))))) + + +(defmethod make-system-context ((this mortar-combat-proxy)) + (make-instance 'mortar-combat-context)) + + +(defmethod discard-system :before ((this mortar-combat-proxy)) + (with-slots (proxy-socket info-socket) this + (usocket:socket-close proxy-socket) + (usocket:socket-close info-socket))) + + +(defun start () + (startup '(:engine (:systems (mortar-combat-proxy))))) + + +(defun stop () + (in-new-thread "exit-thread" + (shutdown))) + + +(defun main (args) + (declare (ignore args)) + (start) + (mt:wait-for-latch *main-latch*))