shotgun/main.go

60 lines
1.3 KiB
Go

package main
import (
"context"
"log/slog"
"net/http"
"os"
"github.com/go-chi/chi/v5"
"gitlab.com/zephyrtronium/sq"
"nhooyr.io/websocket"
"git.sunturtle.xyz/studio/shotgun/lobby"
"git.sunturtle.xyz/studio/shotgun/player"
"git.sunturtle.xyz/studio/shotgun/serve"
_ "modernc.org/sqlite"
)
var (
addr = os.Getenv("SHOTGUN_HTTP")
public = os.Getenv("SHOTGUN_PUBLIC")
dsn = os.Getenv("SHOTGUN_DB")
)
func main() {
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{AddSource: true})))
db, err := sq.Open("sqlite", dsn)
if err != nil {
panic(err)
}
if err := db.Ping(context.Background()); err != nil {
panic(err)
}
if len(os.Args) > 1 && os.Args[1] == "init" {
if err := player.InitSessions(context.Background(), db); err != nil {
panic(err)
}
if err := player.InitUsers(context.Background(), db); err != nil {
panic(err)
}
return
}
s := Server{
l: lobby.New(),
creds: db,
sessions: db,
pp: map[player.ID]*websocket.Conn{},
}
r := chi.NewRouter()
r.Post("/user/register", s.Register)
r.Post("/user/login", s.Login)
r.With(serve.WithSession(db)).Get("/user/me", s.Me)
r.With(serve.WithSession(db)).Get("/queue", s.Queue)
r.Method("GET", "/*", http.FileServer(http.Dir(public)))
slog.Info("listening", "addr", addr, "public", public)
http.ListenAndServe(addr, r)
}