112 lines
2.7 KiB
Go
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
|
|
}
|