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() { 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) }