4b8254b
Branches > facts > 4b8254b > files / src
Don't call fact handlers in a transaction by default
Commit: 4b8254bd0601a8846c427cf1e4d14afee6abe57b
Parent: 12040a7
1 changed file:
src/net/bowmap/server/logic.clj 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)))