2b2t-queue-tracker/main.go
2025-06-29 12:42:41 +02:00

112 lines
2.7 KiB
Go

package main
import (
"database/sql"
"embed"
"fmt"
"log"
"net/http"
"os"
"git.1e99.eu/1e99/2b2t/routes"
_ "github.com/mattn/go-sqlite3"
)
var migrations = []string{
`CREATE TABLE player_count (
time INTEGER PRIMARY KEY,
playing INTEGER,
normal_queue INTEGER,
priority_queue INTEGER
);
CREATE TABLE worker (
id INTEGER PRIMARY KEY,
name TEXT,
token TEXT
);`,
}
//go:embed static/*
var embedFS embed.FS
func main() {
logger := log.New(os.Stdout, "", log.Flags())
logger.Printf(` ___ ____ ___ _______ __ __ _ `)
logger.Printf(`|__ \| _ \__ \__ __| | \/ | | | `)
logger.Printf(` ) | |_) | ) | | | | \ / | __ _ ___| |_ ___ _ __ `)
logger.Printf(` / /| _ < / / | | | |\/| |/ _' / __| __/ _ \ '__|`)
logger.Printf(` / /_| |_) / /_ | | | | | | (_| \__ \ || __/ | `)
logger.Printf(`|____|____/____| |_| |_| |_|\__,_|___/\__\___|_| `)
logger.Printf(` `)
dsn, found := os.LookupEnv("MASTER_DATABASE")
if !found {
logger.Printf("No \"MASTER_DATABASE\", defaulting to \"./data.sqlite\"")
dsn = "./data.sqlite"
}
address, found := os.LookupEnv("MASTER_ADDRESS")
if !found {
logger.Printf("No \"MASTER_ADDRESS\", defaulting to \":3000\"")
address = ":3000"
}
// Requires tags "sqlite_math_functions"
db, err := sql.Open("sqlite3", dsn)
if err != nil {
logger.Printf("Failed to open database: %s", err)
os.Exit(1)
}
defer db.Close()
err = migrateDB(db, migrations)
if err != nil {
logger.Printf("Failed to migrate database: %s", err)
os.Exit(1)
}
mux := http.NewServeMux()
mux.Handle("GET /api/player-count", routes.GetPlayerCounts(db, logger))
mux.Handle("PUT /api/player-count", routes.SubmitPlayerCounts(db, logger))
mux.Handle("GET /", routes.FileServerSubFS(embedFS, "static"))
logger.Printf("Listening on %s", address)
err = http.ListenAndServe(address, routes.Logger(mux, logger))
if err != nil {
logger.Printf("Failed to listen: %s", err)
os.Exit(1)
}
}
func migrateDB(db *sql.DB, migrations []string) error {
row := db.QueryRow(`PRAGMA user_version`)
var version int
err := row.Scan(&version)
if err != nil {
return fmt.Errorf("get user_version: %w", err)
}
for migrationVer, sql := range migrations {
// Add 1 due to 0-based array indexing
if version >= (migrationVer + 1) {
continue
}
_, err = db.Exec(sql)
if err != nil {
return fmt.Errorf("migrate to v%d: %s", migrationVer+1, err)
}
version = migrationVer + 1
}
sql := fmt.Sprintf(`PRAGMA user_version = %d;`, version)
_, err = db.Exec(sql)
if err != nil {
return fmt.Errorf("set user_version: %w", err)
}
return nil
}