server.clj

Bowmap · bowmap.git · Tickets

Branches > main > b63dff0 > files / src / net / bowmap / server / network / server.clj

(ns net.bowmap.server.network.server
  (:require
   [clojure.core.async :refer [<!! chan io-thread put!]]
   [net.bowmap.server.protocol.client :refer [apply-serverbound-frame]]
   [net.bowmap.server.network.connection :as connection]
   [net.bowmap.server.protocol.phase :as phase]
   [net.bowmap.server.network.minecraft-server :as mc]))

(defn client-step
  ([_] {::phase/phase ::phase/handshaking})
  ([client in frame]
   (case in
     ::connection/serverbound-frames (apply-serverbound-frame client frame))))

(defn handle-connection! [{::connection/keys! [serverbound-frames]}]
  (let [serverbound-packets (chan 1024)]
    (io-thread
      (loop [client-state (client-step nil)]
        (when-some [frame (<!! serverbound-frames)]
          (let [[client' packet] (client-step client-state ::connection/serverbound-frames frame)]
            (put! serverbound-packets packet)
            (recur client')))))))

(defn run-server!
  "Starts running the Minecraft server.
   Returns a future that delivers when the server closes."
  [& {:keys [& :port :bind-addr] :as args}]
  (let [server (mc/server args)]
    (future
      (loop []
        (when-some [connection (<!! server)]
          (handle-connection! connection)
          (recur))))))