From e565f1f8d84a1e4ec1705c77bc01c8b31cc4af9b Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:03:33 -0700 Subject: [PATCH] cli to play --- .gitignore | 1 + cmd/cli/main.go | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 cmd/cli/main.go diff --git a/.gitignore b/.gitignore index e64c058..74893b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/*.sw* /src/state/fsm/template /pkg/state/fsm/template +/cmd/cli/cli diff --git a/cmd/cli/main.go b/cmd/cli/main.go new file mode 100644 index 0000000..62845a9 --- /dev/null +++ b/cmd/cli/main.go @@ -0,0 +1,108 @@ +package main + +import ( + "context" + "gitea/price-is-wrong/pkg/lib/db" + "gitea/price-is-wrong/pkg/state/lobby" + "gitea/price-is-wrong/pkg/state/priceiswrong" + "io" + "log" + "os" + "os/signal" + "strconv" + "syscall" +) + +func main() { + ctx, can := signal.NotifyContext(context.Background(), syscall.SIGINT) + defer can() + + if err := run( + ctx, + envOr("GAME_DB_DRIVER", "sqlite"), + envOr("GAME_DB_CONN", "/tmp/game.db"), + envOr("GAME_SESSION", "session"), + os.Args[1:], + ); err != nil { + panic(err) + } +} + +func envOr(k, v string) string { + if v := os.Getenv(k); v != "" { + return v + } + return v +} + +func run(ctx context.Context, dbDriver, dbConn, session string, args []string) error { + b, err := db.New(ctx, dbDriver, dbConn) + if err != nil { + return err + } + defer b.Close() + ctx = db.Inject(ctx, b) + + l, err := lobby.Open(ctx, session) + if err != nil { + return err + } + + if !l.Closed { + if len(args) == 0 { + log.Printf("lobby | %+v", *l) + return nil + } + switch args[0] { + case "join": + return l.Join(ctx, mustParseInt(args[1])) + case "leave": + return l.Leave(ctx, mustParseInt(args[1])) + case "close": + return l.Close(ctx) + } + } + + p, err := priceiswrong.Open(ctx, session) + if err != nil { + return err + } else if len(p.Contestants) > 0 { + } else if err := p.SetPlayers(ctx, l.Players); err != nil { + return err + } + + if len(args) == 0 { + log.Printf("priceiswrong | %+v", *p) + return nil + } + + defer func() { + log.Printf("priceiswrong | %+v", *p) + }() + switch args[0] { + case "guess": + return p.Guess(ctx, mustParseInt(args[1]), args[2]) + case "score": + return p.Score(ctx, mustParseInt(args[1]), mustParseInt(args[2])) + case "sethost": + return p.SetHost(ctx, mustParseInt(args[1])) + case "setitem": + return p.SetItem(ctx, args[1], args[2], args[3], args[4]) + case "setplayers": + ids := []int{} + for _, id := range args[1:] { + ids = append(ids, mustParseInt(id)) + } + return p.SetPlayers(ctx, ids) + } + + return io.EOF +} + +func mustParseInt(a string) int { + i, err := strconv.Atoi(a) + if err != nil { + panic(err) + } + return i +}