4b8254b

Branches > facts > 4b8254b > files / src

Don't call fact handlers in a transaction by default

Grahp, 2026-08-22

Commit: 4b8254bd0601a8846c427cf1e4d14afee6abe57b
Parent: 12040a7

1 changed file:

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

@@ -1,38 +1,34 @@ (ns net.bowmap.server.logic   (:require-   [net.bowmap.server.player :as player]-   [net.bowmap.server.server :as server]-   [net.bowmap.stormbow.fact :as fact]-   [net.bowmap.stormbow.effect :as effect]))+    [net.bowmap.server.player :as player]+    [net.bowmap.server.server :as server]+    [net.bowmap.stormbow.fact :as fact]+    [net.bowmap.stormbow.effect :as effect])) -(defmulti handler+(defmulti handle-fact   (fn [fact]     (::fact/id fact))) -(defmethod handler ::fact/server-list-requested [_]-  [{::effect/id ::effect/send-server-list-    :server-list-response {:version {:name "26.2"-                                     :protocol 776}-                           :players {:online (count @server/players)-                                     :max server/max-player-count}-                           :description {:text "Bowmap!"}-                           :enforcesSecureChat false}}])+(defmethod handle-fact ::fact/server-list-requested [_]+  (dosync+    [{::effect/id ::effect/send-server-list+      :server-list-response {:version {:name "26.2"+                                       :protocol 776}+                             :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 handler ::fact/player-joined [{::player/keys! [player]}]-  (let [{::player/keys! [uuid]} player]-    (if (@server/players uuid)-      (throw (Exception. "Player tried to join with an existing UUID"))-      (commute server/players assoc uuid (ref player)))+(defmethod handle-fact ::fact/player-joined [{::player/keys! [player]}]+  (dosync+    (let [{::player/keys! [uuid]} player]+      (if (@server/players uuid)+        (throw (Exception. "Player tried to join with an existing UUID"))+        (commute server/players assoc uuid (ref player)))+      [])))++(defmethod handle-fact ::fact/player-left [{:keys! [::player/uuid]}]+  (dosync+    (commute server/players dissoc uuid)     []))--(defmethod handler ::fact/player-left [{:keys! [::player/uuid]}]-  (commute server/players dissoc uuid)-  [])--; Returns a seq of effects-; And document that this is not called synchronously (hence the transactions as well)-(defn handle-fact [fact]-  ; TODO I think this is fine because it has to be run within a transaction anyway?-  ; All though I suppose not all fact handling needs to be in a transaction some is trivial so idk.-  (dosync (handler fact)))