sliva/src/sliva/server/handlers.clj

38 lines
1.3 KiB
Clojure

(ns sliva.server.handlers
(:require [compojure.core :refer [defroutes GET]]
[compojure.route :refer [resources]]
[clojure.string :as str]
[clojure.core.async :refer [chan <! <!! >! put! close! go go-loop]]
[ring.util.response :refer [resource-response]]
[ring.middleware.reload :refer [wrap-reload]]
[chord.http-kit :refer [with-channel]]))
(def clients (atom {}))
(defn send-all [& args]
(println "sending to all" args (keys @clients))
(doseq [conn @clients]
(println "sending" args)
(put! (val conn) (str/join ":" args))))
(defn socket-handler [request]
(let [cid (java.util.UUID/randomUUID)]
(with-channel request ws-ch
(go
(let [{:keys [message]} (<! ws-ch)]
(println "new connection - " cid)
(>! ws-ch (str "Hello " cid))
(swap! clients assoc cid ws-ch)
(send-all "open" cid)
(go-loop []
(let [{:keys [message]} (<! ws-ch)]
(println "GOT MSG!" message)
(let [[cmd & args] (str/split message #":")]
(println "command" cmd "(" args ")")
(condp = cmd
"ping" (>! ws-ch "pong")
"Unknown command :/")) (keys @clients)
(recur))))))))
;;(close! ws-ch)))))