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