Browse Source

Connect server with manager

Thomas Dy 8 years ago
parent
commit
e6f0128038
2 changed files with 34 additions and 12 deletions
  1. 2 1
      src/bombnet/core.clj
  2. 32 11
      src/bombnet/server.clj

+ 2 - 1
src/bombnet/core.clj

@@ -5,7 +5,8 @@
 
 (defn new-system []
   (component/system-map
-    :server (new-server)))
+    :server (new-server)
+    :manager (bombnet.manager/new-manager)))
 
 (def system nil)
 

+ 32 - 11
src/bombnet/server.clj

@@ -2,26 +2,45 @@
   (:require [com.stuartsierra.component :as component]
             [compojure.core :refer :all]
             [compojure.route :as route]
-            [org.httpkit.server :refer :all]))
+            [clojure.data.json :as json]
+            [clojure.core.async :refer [>! >!! <! <!! alts! alts!! chan go go-loop timeout]]
+            [org.httpkit.server :refer :all]
+            [bombnet.manager :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)))))
+  (GET "/ws/:room" [room]
+       (fn [request]
+         (with-channel request channel
+           (let [manager (get request ::manager)
+                 id (get request :query-string)
+                 in-ch (get-room manager room)
+                 out-ch (chan)]
+
+             (>!! in-ch [:client-join {:id id :channel out-ch}])
+             (go-loop []
+                      (send! channel (json/write-str (<! out-ch)))
+                      (recur))
+             (on-close channel (fn [status] (>!! in-ch [:client-leave id])))
+             (on-receive channel (fn [data]
+                                   (let [parsed (json/read-str data :key-fn keyword)]
+                                     (>!! in-ch [:message {:id id :message parsed}]))))))))
   (route/not-found "Not Found"))
 
-(defrecord GameServer [server]
+(defn wrap-manager
+  [handler manager]
+  (fn [req]
+    (handler (assoc req ::manager manager))))
+
+(defrecord GameServer [server manager]
   component/Lifecycle
   (start [component]
     (if server
       component
-      (do
+      (let [handler (-> app
+                        (wrap-manager manager))]
         (println "Starting server")
-        (assoc component :server (run-server app {:port 8080})))))
+        (assoc component :server (run-server handler {:port 8080})))))
   (stop [component]
     (if (not server)
       component
@@ -31,4 +50,6 @@
         (assoc component :server nil)))))
 
 (defn new-server []
-  (map->GameServer {}))
+  (component/using
+    (map->GameServer {})
+    [:manager]))