|
@@ -2,26 +2,45 @@
|
|
(:require [com.stuartsierra.component :as component]
|
|
(:require [com.stuartsierra.component :as component]
|
|
[compojure.core :refer :all]
|
|
[compojure.core :refer :all]
|
|
[compojure.route :as route]
|
|
[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
|
|
(defroutes app
|
|
(GET "/" [] "Hello")
|
|
(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"))
|
|
(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
|
|
component/Lifecycle
|
|
(start [component]
|
|
(start [component]
|
|
(if server
|
|
(if server
|
|
component
|
|
component
|
|
- (do
|
|
|
|
|
|
+ (let [handler (-> app
|
|
|
|
+ (wrap-manager manager))]
|
|
(println "Starting server")
|
|
(println "Starting server")
|
|
- (assoc component :server (run-server app {:port 8080})))))
|
|
|
|
|
|
+ (assoc component :server (run-server handler {:port 8080})))))
|
|
(stop [component]
|
|
(stop [component]
|
|
(if (not server)
|
|
(if (not server)
|
|
component
|
|
component
|
|
@@ -31,4 +50,6 @@
|
|
(assoc component :server nil)))))
|
|
(assoc component :server nil)))))
|
|
|
|
|
|
(defn new-server []
|
|
(defn new-server []
|
|
- (map->GameServer {}))
|
|
|
|
|
|
+ (component/using
|
|
|
|
+ (map->GameServer {})
|
|
|
|
+ [:manager]))
|