diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-08-17 15:16:01 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 15:57:39 +0200 |
| commit | 9463ec4cb063f0bde03d0e1b2a650f5887ad29ff (patch) | |
| tree | 035af855f260b7a9d4e63d0b5ad67000ad6e8ea1 | |
| parent | 5f97fb7a1606908e99be97d67e5871d55067dac7 (diff) | |
| download | muhqs-game-9463ec4cb063f0bde03d0e1b2a650f5887ad29ff.tar.gz muhqs-game-9463ec4cb063f0bde03d0e1b2a650f5887ad29ff.zip | |
use slog and add game log handler callback
| -rw-r--r-- | go/Makefile | 2 | ||||
| -rw-r--r-- | go/game/ai.go | 4 | ||||
| -rw-r--r-- | go/game/card.go | 4 | ||||
| -rw-r--r-- | go/game/cardImplementations_test.go | 2 | ||||
| -rw-r--r-- | go/game/cardParsing.go | 11 | ||||
| -rw-r--r-- | go/game/cardParsing_test.go | 2 | ||||
| -rw-r--r-- | go/game/costs.go | 7 | ||||
| -rw-r--r-- | go/game/draft.go | 9 | ||||
| -rw-r--r-- | go/game/kraken.go | 7 | ||||
| -rw-r--r-- | go/game/map.go | 4 | ||||
| -rw-r--r-- | go/game/permanent.go | 4 | ||||
| -rw-r--r-- | go/game/set.go | 4 | ||||
| -rw-r--r-- | go/game/state.go | 5 | ||||
| -rw-r--r-- | go/log/log.go | 61 |
14 files changed, 94 insertions, 32 deletions
diff --git a/go/Makefile b/go/Makefile index cac5071e..ced2e223 100644 --- a/go/Makefile +++ b/go/Makefile @@ -1,4 +1,4 @@ -PACKAGES := activities assets game server client dummy-ui +PACKAGES := activities assets client dummy-ui game log server SHELL := bash diff --git a/go/game/ai.go b/go/game/ai.go index f24a62a1..b1365baa 100644 --- a/go/game/ai.go +++ b/go/game/ai.go @@ -3,7 +3,6 @@ package game import ( "errors" "fmt" - "log" "math/rand" "strconv" "strings" @@ -12,6 +11,7 @@ import ( "golang.org/x/exp/slices" "github.com/RyanCarrier/dijkstra" + "muhq.space/muhqs-game/go/log" ) type UnitAI struct { @@ -439,7 +439,7 @@ func fullAction(ai *UnitAI) Action { if a.Targets() != nil && a.Targets().RequireSelection() { err := selectRandomTargets(ai.s.Rand, a.Targets()) if err != nil { - log.Println("ai full action error:", err) + log.Warn("ai full action error", "error", err) return nil } } diff --git a/go/game/card.go b/go/game/card.go index 438fb384..bae13f36 100644 --- a/go/game/card.go +++ b/go/game/card.go @@ -3,7 +3,6 @@ package game import ( "errors" "io" - "log" "net/http" "path" "strconv" @@ -12,6 +11,7 @@ import ( "golang.org/x/exp/slices" "gopkg.in/yaml.v3" "muhq.space/muhqs-game/go/assets" + "muhq.space/muhqs-game/go/log" ) type CardType int @@ -198,7 +198,7 @@ var ErrUnknownCardPath = errors.New("unknown card path") func retrieveCardDefinition(cardPath string) ([]byte, error) { url := assets.PROTOCOL + path.Join(assets.BASE_URL, CARD_DATA_URL, cardPath+".yml") - log.Printf("loading card from %s\n", url) + log.Debug("loading card from", "url", url) resp, err := http.Get(url) if err != nil { return nil, err diff --git a/go/game/cardImplementations_test.go b/go/game/cardImplementations_test.go index 5cef65ca..6b63b049 100644 --- a/go/game/cardImplementations_test.go +++ b/go/game/cardImplementations_test.go @@ -1,7 +1,6 @@ package game import ( - "log" "strings" "testing" @@ -34,7 +33,6 @@ symbols: a := p.FullActions[0] opts := a.Target().Options() if len(opts) != 11 { - log.Printf("%q\n", opts) t.Fatal("expexted 11 targets to neutralize") } diff --git a/go/game/cardParsing.go b/go/game/cardParsing.go index c08a241f..99369f06 100644 --- a/go/game/cardParsing.go +++ b/go/game/cardParsing.go @@ -1,10 +1,11 @@ package game import ( - "log" "regexp" "strconv" "strings" + + "muhq.space/muhqs-game/go/log" ) type dynamicCardImplementation struct { @@ -175,7 +176,7 @@ func parseUnitConstrain(constrain string) func(ctx any, u *Unit) bool { return p.IsEnemy(e.Controller()) } } else { - log.Println("Only enemy unit constrains are implemented yet") + log.Error("Only enemy unit constrains are implemented yet") } return nil @@ -238,7 +239,7 @@ func parseLocation(location string) func(any, *LocalState) []*Tile { } } } - log.Println("Only unit location constrains are implemented yet") + log.Error("Only unit location constrains are implemented yet") return nil } @@ -249,10 +250,10 @@ func (impl *dynamicCardImplementation) parsePlayModification(effect string) { if locationFunc := parseLocation(how); locationFunc != nil { impl.spawnTilesFunc = func(p *LocalState, s *Player) []*Tile { return locationFunc(s, p) } } else { - log.Println("Play modification other than locations are not implemented ") + log.Error("Play modification other than locations are not implemented ") } } else { - log.Println("Play modification for other cards are not implemented") + log.Error("Play modification for other cards are not implemented") } } diff --git a/go/game/cardParsing_test.go b/go/game/cardParsing_test.go index 2ef7429e..cbf5902e 100644 --- a/go/game/cardParsing_test.go +++ b/go/game/cardParsing_test.go @@ -2,7 +2,6 @@ package game import ( "errors" - "log" "testing" ) @@ -24,7 +23,6 @@ func TestCloak(t *testing.T) { pa := NewPlayAction(p, die) err := pa.Target().AddSelection(a) - log.Println(pa.Target().desc, err) if !errors.Is(err, ErrTargetHasShroud) { t.Fatal("shrouded archer targeted") } diff --git a/go/game/costs.go b/go/game/costs.go index bb6562ea..38064e8c 100644 --- a/go/game/costs.go +++ b/go/game/costs.go @@ -1,9 +1,10 @@ package game import ( - "log" "strconv" "strings" + + "muhq.space/muhqs-game/go/log" ) type ResourceCosts struct { @@ -43,10 +44,10 @@ func (c *ResourceCosts) Costs(s *LocalState, choosenVariadicCosts ...int) int { if vc >= 0 { costs = costs + c.variadicComponents*vc } else { - log.Println("Invalid variadic costs choosen") + log.Debug("Invalid variadic costs choosen") } } else { - log.Println("Unambigous variadic costs choosen") + log.Debug("Unambigous variadic costs choosen") } return costs } diff --git a/go/game/draft.go b/go/game/draft.go index 997e676f..878838a7 100644 --- a/go/game/draft.go +++ b/go/game/draft.go @@ -3,9 +3,10 @@ package game import ( "errors" "fmt" - "log" "strings" "sync" + + "muhq.space/muhqs-game/go/log" ) // A Draft coordinating drafting among multiple players and bots. @@ -48,7 +49,7 @@ func NewDraftFromDesc(players []*Player, desc string) (*Draft, error) { func NewDraft(players []*Player, desc string, sets []SetIdentifier) (*Draft, error) { d := &Draft{players: players, sets: sets} err := d.parseDesc(desc) - log.Printf("created new draft %v\n", d) + log.Debug("created new draft", "desc", d) return d, err } @@ -130,7 +131,7 @@ func (d *Draft) DealRound(i, j int, packs []PileOfCards) { go func() { pack := packs[i*nPlayers+(k+j)%nPlayers] pickPrompt := newDraftPickPrompt(pack) - log.Printf("prompt %s for a pick from pack %d\n", player.Name, i*nPlayers+(k+j)%nPlayers) + log.Debug("prompt for pick ", "player", player.Name, "pack", i*nPlayers+(k+j)%nPlayers) pick, err := prompt(player.Ctrl, pickPrompt) // select a random card on error if err != nil { @@ -148,7 +149,7 @@ func (d *Draft) DealRound(i, j int, packs []PileOfCards) { func (d *Draft) Run() { packs := d.PreparePacks() nPlayers := len(d.players) - log.Printf("%d %d %d\n", d.packsPerPlayer, d.cardsPerPack, len(d.players)) + log.Debug("run draft", "packs", d.packsPerPlayer, "cards", d.cardsPerPack, "players", len(d.players)) for i := range d.packsPerPlayer { for j := range d.cardsPerPack * nPlayers { d.DealRound(i, j, packs) diff --git a/go/game/kraken.go b/go/game/kraken.go index 5f8f2612..8e4ee6f7 100644 --- a/go/game/kraken.go +++ b/go/game/kraken.go @@ -1,9 +1,10 @@ package game import ( - "log" "strings" "sync" + + "muhq.space/muhqs-game/go/log" ) const ( @@ -120,7 +121,7 @@ func (ctrl *KrakenControl) krakenTurn() { costs := c.BuyCosts.Costs(s) if costs > kraken.Resource { - log.Println("Kraken discards", c.Name, "because resource to low", kraken.Resource) + log.Info("Kraken discards because insufficient resource", "card", c.Name, "resource", kraken.Resource) kraken.DiscardPile.AddCard(c) break } @@ -134,7 +135,7 @@ func (ctrl *KrakenControl) krakenTurn() { a := NewPlayAction(kraken, c, costFunc) err := selectRandomTargets(s.Rand, a.Targets()) if err != nil { - log.Println("No target available for", c.Name) + log.Info("Diacard because no target for", "card", c.Name) kraken.DiscardPile.AddCard(c) continue } diff --git a/go/game/map.go b/go/game/map.go index 48ec8be3..f2cf1c53 100644 --- a/go/game/map.go +++ b/go/game/map.go @@ -3,7 +3,6 @@ package game import ( "fmt" "io" - "log" "math/rand" "net/http" "os" @@ -15,6 +14,7 @@ import ( "gopkg.in/yaml.v3" "muhq.space/muhqs-game/go/assets" + "muhq.space/muhqs-game/go/log" ) const ( @@ -195,7 +195,7 @@ func (m *Map) FindFortificationConnections(x int, y int) (connections int, left, // GetMap creates a new map from the definition retrieved for the map's name. func GetMap(name string) (*Map, error) { url := path.Join(assets.BASE_URL, MAP_URL_PART, name+".yml") - log.Printf("loading map from %s\n", url) + log.Info("loading map", "url", url) resp, err := http.Get(assets.PROTOCOL + url) if err != nil { log.Fatal(err) diff --git a/go/game/permanent.go b/go/game/permanent.go index 5c105724..5e42973a 100644 --- a/go/game/permanent.go +++ b/go/game/permanent.go @@ -2,11 +2,11 @@ package game import ( "fmt" - "log" "strings" "golang.org/x/exp/slices" + "muhq.space/muhqs-game/go/log" "muhq.space/muhqs-game/go/utils" ) @@ -187,7 +187,7 @@ func (p *permanentBase) XEffect(effect string) (int, error) { } for _, e := range p.tmpEffects { - log.Println(effect, e) + log.Debug("tmp xEffect", "effect", effect, "tmpEffect", e) if !strings.Contains(e, effect) { continue } diff --git a/go/game/set.go b/go/game/set.go index e4a08f3b..a85bf577 100644 --- a/go/game/set.go +++ b/go/game/set.go @@ -2,13 +2,13 @@ package game import ( "errors" - "log" "net/http" "path" "strings" "golang.org/x/net/html" "muhq.space/muhqs-game/go/assets" + "muhq.space/muhqs-game/go/log" ) type SetIdentifier int @@ -88,7 +88,7 @@ var SetNames = map[string]SetIdentifier{ func (set SetIdentifier) CardPaths() []string { url := assets.PROTOCOL + path.Join(assets.BASE_URL, CARD_DATA_URL, set.String()) - log.Printf("loading set from %s\n", url) + log.Debug("loading set", "url", url) resp, err := http.Get(url) if err != nil { log.Fatal(err) diff --git a/go/game/state.go b/go/game/state.go index ad3ea815..0d8066c0 100644 --- a/go/game/state.go +++ b/go/game/state.go @@ -3,13 +3,14 @@ package game import ( "errors" "fmt" - "log" "math/rand" "strconv" "strings" "time" "golang.org/x/exp/slices" + + "muhq.space/muhqs-game/go/log" ) type State interface { @@ -539,7 +540,7 @@ func (s *LocalState) allPassing(skipFirst bool) (bool, []*Player) { switch a := _a.(type) { case *PassPriority: - log.Printf("%s passed %d/%d\n", p.Name, i+1, nPlayers) + log.Info("priority passed\n", "player", p.Name, "passed", fmt.Sprintf("%d/%d", i+1, nPlayers)) case nil: log.Fatal("received nil action from ", p.Name, " at ", s.activePhase) default: diff --git a/go/log/log.go b/go/log/log.go new file mode 100644 index 00000000..ff090425 --- /dev/null +++ b/go/log/log.go @@ -0,0 +1,61 @@ +package log + +import ( + "context" + "fmt" + "log" + "log/slog" + "os" +) + +const GameLogLevel = 99 + +var handleGameRecord func(any) + +func init() { + // TODO: allow to specify the value and the file + l := slog.New(slog.NewTextHandler( + os.Stdout, + &slog.HandlerOptions{AddSource: true})) + slog.SetDefault(l) +} + +func Game(obj any) { + if handleGameRecord != nil { + handleGameRecord(obj) + } + msg := fmt.Sprintf("%s", obj) + slog.Log(context.Background(), GameLogLevel, msg) +} + +func Debug(msg string, args ...any) { + slog.Debug(msg, args...) +} + +func Info(msg string, args ...any) { + slog.Info(msg, args...) +} + +func Warn(msg string, args ...any) { + slog.Warn(msg, args...) +} + +func Error(msg string, args ...any) { + slog.Error(msg, args...) +} + +func Fatal(args ...any) { + log.Fatal(args...) +} + +func Fatalf(msg string, args ...any) { + log.Fatalf(msg, args...) +} + +func Panic(args ...any) { + log.Panic(args...) +} + +func Panicf(msg string, args ...any) { + log.Panicf(msg, args...) +} |
