minecraft_server.clj

Branches > facts > 21b5507 > files / src / net / bowmap / network / minecraft_server.clj

(ns net.bowmap.network.minecraft-server
  (:require
   [clojure.core.async :refer [>!! chan close! io-thread]]
   [net.bowmap.network.connection :as connection])
  (:import
   [java.net ServerSocket]))

(defonce server (atom nil))

(defn accept-connection!! [server-socket]
  (connection/connection (ServerSocket/.accept server-socket)))

(defn start-server! [port]
  (when-let [server @server]
    (ServerSocket/.close server))
  (let [connections (chan 64)
        server-socket (ServerSocket. port)]
    (reset! server server-socket)
    (io-thread
      (loop []
        ; TODO close the channel when the server closes
        (let [connection (accept-connection!! server-socket)
              {:keys! [::connection/serverbound-frames]} connection]
          (io-thread
            (try
              (loop []
                (>!! serverbound-frames (connection/read-frame!! connection))
                (recur))
              (finally
                (close! serverbound-frames))))
          (>!! connections connection))
        (recur)))
    connections))