Browse Source

Initial server component implementation

Thomas Dy 8 years ago
parent
commit
647f86f37f
3 changed files with 69 additions and 9 deletions
  1. 5 1
      project.clj
  2. 30 8
      src/bombnet/core.clj
  3. 34 0
      src/bombnet/server.clj

+ 5 - 1
project.clj

@@ -3,7 +3,11 @@
   :url ""
   :license {:name "WTFPL"
             :url "http://www.wtfpl.net/txt/copying/"}
-  :dependencies [[org.clojure/clojure "1.7.0"]]
+  :dependencies [[org.clojure/clojure "1.7.0"]
+                 [org.clojure/data.json "0.2.6"]
+                 [com.stuartsierra/component "0.3.1"]
+                 [compojure "1.4.0"]
+                 [http-kit "2.1.18"]]
   :main ^:skip-aot bombnet.core
   :target-path "target/%s"
   :profiles {:uberjar {:aot :all}})

+ 30 - 8
src/bombnet/core.clj

@@ -1,13 +1,35 @@
 (ns bombnet.core
   (:gen-class)
-  (:require [bombnet.console :refer :all]
-            [bombnet.game :refer :all]))
+  (:require [com.stuartsierra.component :as component]
+            [bombnet.server :refer :all]))
+
+(defn new-system []
+  (component/system-map
+    :server (new-server)))
+
+(def system nil)
+
+(defn init []
+  (alter-var-root #'system
+    (constantly (new-system))))
+
+(defn start []
+  (alter-var-root #'system component/start))
+
+(defn stop []
+  (alter-var-root #'system
+    (fn [s] (when s (component/stop s)))))
+
+(defn go []
+  (init)
+  (start))
+
+(defn reset []
+  (stop)
+  (init)
+  (start))
 
 (defn -main
-  "I don't do a whole lot ... yet"
+  "Run the server"
   [& args]
-  (-> (new-game [{:id 1 :name "Thomas"}])
-      (queue-action 1 {:type "bomb" :timer 1})
-      update-state
-      update-state
-      print-state))
+  (go))

+ 34 - 0
src/bombnet/server.clj

@@ -0,0 +1,34 @@
+(ns bombnet.server
+  (:require [com.stuartsierra.component :as component]
+            [compojure.core :refer :all]
+            [compojure.route :as route]
+            [org.httpkit.server :refer :all]))
+
+(defroutes app
+  (GET "/" [] "Hello")
+  (GET "/ws" request
+       (with-channel request channel
+         (send! channel "Hello")
+         (on-close channel (fn [status] (println "channel closed: " status)))
+         (on-receive channel (fn [data] ;; echo it back
+                               (send! channel data)))))
+  (route/not-found "Not Found"))
+
+(defrecord GameServer [server]
+  component/Lifecycle
+  (start [component]
+    (if server
+      component
+      (do
+        (println "Starting server")
+        (assoc component :server (run-server app {:port 8080})))))
+  (stop [component]
+    (if (not server)
+      component
+      (do
+        (println "Stopping server")
+        (server :timeout 100)
+        (assoc component :server nil)))))
+
+(defn new-server []
+  (map->GameServer {}))