ba1da08

Branches > main > ba1da08 > files / src / net / bowmap / transport

Move server list ping out of server logic code

Grahp, 2026-08-24

Commit: ba1da0840e136299d1dc70c862297bd5afab8958
Parent: 0dda787

4 changed files:

src/net/bowmap/protocol/handle.clj modified (view file)

@@ -10,6 +10,7 @@    [net.bowmap.protocol.registry :as reg]    [net.bowmap.protocol.state :as state]    [net.bowmap.server.gamemode :as gamemode]+   [net.bowmap.server.ping :as ping]    [net.bowmap.server.player :as player]    [net.bowmap.server.position :as position]    [net.bowmap.server.server :as server]@@ -31,7 +32,16 @@                     :protocol-id protocol)}))  (defmethod interpret-packet ::serverbound/status-request [_ _]-  {:events [{::event/id ::event/server-list-requested}]})+  (let [{::ping/keys! [player-count max-players motd]} (ping/ping-server)]+    {:packets [{::pk/id ::clientbound/status-response+                :response {:version {:name "26.2"+                                     :protocol 776}+                           ; Gets the number of players playing, which is what you want+                           ; And there are no side-effects!+                           :players {:online player-count+                                     :max max-players}+                           :description motd+                           :enforcesSecureChat false}}]}))  (defmethod interpret-packet ::serverbound/ping-request [_ pk]   {:packets [{::pk/id ::clientbound/pong-response

src/net/bowmap/server/logic.clj modified (view file)

@@ -3,7 +3,6 @@    [net.bowmap.server.player :as player]    [net.bowmap.server.position :as position]    [net.bowmap.server.server :as server]-   [net.bowmap.stormbow.effect :as effect]    [net.bowmap.stormbow.event :as event]))  (defmulti handle-event@@ -11,18 +10,6 @@   (fn [event]     (::event/id event))) -(defmethod handle-event ::event/server-list-requested [_]-  (dosync-    [{::effect/id ::effect/send-server-list-      :server-list-response {:version {:name "26.2"-                                       :protocol 776}-                             ; Gets the number of players playing, which is what you want-                             ; And there are no side-effects!-                             :players {:online (count @server/players)-                                       :max server/max-player-count}-                             :description {:text "Bowmap!"}-                             :enforcesSecureChat false}}]))- ; Want this to be pure, which means you need a way to encode that state change as data? (defmethod handle-event ::event/player-joined [{::player/keys! [player]}]   (dosync@@ -34,9 +21,6 @@  (defmethod handle-event ::event/player-left [{:keys! [::player/uuid]}]   (dosync-    {::event/id ::event/playing-     ::event/mode ::event/retract-     ::player/uuid uuid}     (commute server/players dissoc uuid)     [])) 

src/net/bowmap/server/ping.clj added (view file)

@@ -0,0 +1,9 @@+(ns net.bowmap.server.ping+  (:require+   [net.bowmap.server.server :as server]))++(defn ping-server []+  {::player-count (count @server/players)+   ::max-players server/max-player-count+   ; TODO eventually make this a component+   ::motd {:text "Bowmap!"}})

src/net/bowmap/stormbow/effect_execution.clj modified (view file)

@@ -1,21 +1,10 @@ (ns net.bowmap.stormbow.effect-execution   (:require-   [clojure.core.async :refer [put!]]-   [net.bowmap.protocol.client :as client]-   [net.bowmap.protocol.packet :as pk]-   [net.bowmap.protocol.packet.clientbound :as clientbound]    [net.bowmap.stormbow.effect :as effect]))  (defmulti execute-effect!   (fn [effect]     (::effect/id effect))) -(defmethod execute-effect! ::effect/send-server-list [effect]-  (let [{:keys! [::client/client server-list-response]} effect-        {::client/keys! [clientbound-packets]} client-        packet {::pk/id ::clientbound/status-response-                :response server-list-response}]-    (put! clientbound-packets packet)))- (defn execute-effects! [effects]   (run! execute-effect! effects))