price-is-wrong/cmd/cli/main.go

109 lines
2.0 KiB
Go

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
}