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 }