server.clj
Branches > main > 12188fa > files / src / net / bowmap / protocol / server.clj
(ns net.bowmap.protocol.server
(:require
[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 [send-packet {:keys [packets events]}]
(doseq [packet packets]
(send-packet packet))
(doseq [event events]
(execute-effects! (logic/handle-events event))))
(defn handle-connection [connection]
(let [{::connection/keys! [close-fn send-packet receive-packet]} connection]
(try
(loop []
(handle-response send-packet (handle/interpret-packet (assoc (receive-packet) ::connection/connection connection)))
(recur))
(finally
(when-let [uuid (close-fn)]
(execute-effects! (logic/handle-events {::event/id ::event/player-left ::player/uuid uuid})))))))
(defn start-server! [port]
(mc/start-server! port #'handle-connection))