109 lines
2.0 KiB
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
|
|
}
|