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))