server.clj

Branches > main > cb928b0 > 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))