cli to play
parent
e35ddef4b7
commit
e565f1f8d8
|
|
@ -1,3 +1,4 @@
|
|||
**/*.sw*
|
||||
/src/state/fsm/template
|
||||
/pkg/state/fsm/template
|
||||
/cmd/cli/cli
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
Loading…
Reference in New Issue