server.clj
Branches > main > 9f21a66 > files / src / net / bowmap / protocol / server.clj
(ns net.bowmap.protocol.server
(:require
[clojure.core.async :refer [<!! io-thread put!]]
[net.bowmap.protocol.handle :as handle]
[net.bowmap.server.logic :as logic]
[net.bowmap.server.player :as player]
[net.bowmap.stormbow.effect-execution :refer [execute-effects!]]
[net.bowmap.stormbow.event :as event]
[net.bowmap.transport.connection :as connection]
[net.bowmap.transport.server :as mc]))
(defn handle-response [clientbound-packets {:keys [packets events]}]
(doseq [packet packets]
(put! clientbound-packets packet))
(doseq [event events]
(execute-effects! (logic/handle-events event))))
(defn handle-connection [connection]
(let [{::connection/keys! [close-fn serverbound-packets clientbound-packets closed]} connection]
(io-thread
(when-let [uuid @closed]
(execute-effects! (logic/handle-events {::event/id ::event/player-left ::player/uuid uuid}))))
(try
(loop []
(handle-response clientbound-packets (handle/interpret-packet (<!! serverbound-packets)))
(recur))
(finally
(close-fn)))))
(defn start-server! [port]
(mc/start-server! port #'handle-connection))