Files
mmaschedule/src/main.go
T
guy176251 007e45f06b - added docker image and compose file
- switched sqlite driver to modernc.org/sqlite
2026-05-23 19:04:26 -05:00

126 lines
2.5 KiB
Go

package main
import (
"database/sql"
"embed"
"flag"
"fmt"
"io"
"log"
"log/slog"
"os"
"path"
_ "modernc.org/sqlite"
"mmaschedule-go/event"
"github.com/pressly/goose/v3"
)
//go:embed migrations/*.sql
var migrations embed.FS
const POSITIONAL_ARGS_HELP = `
Valid commands:
runserver: Runs the web server.
scrape: Runs the web scraper.
`
func main() {
host := flag.String("host", "127.0.0.1:8000", "Set the web server host address.")
debug := flag.Bool("debug", false, "Enable debug mode.")
no_tapology := flag.Bool("no-tapology", false, "Disable scraping tapology")
no_scraping := flag.Bool("no-scraping", false, "Disable scraping on runserver")
data_dir := flag.String("data-dir", "", "Directory for storing data")
cmd := flag.String("cmd", "runserver", "Command to run [runserver, scrape]")
flag.Parse()
if *data_dir != "" {
err := os.MkdirAll(*data_dir, 0666)
if err != nil {
fmt.Printf("Error creating data dir: %s\n", err)
os.Exit(1)
}
}
if *debug {
slog.SetLogLoggerLevel(slog.LevelDebug)
} else {
slog.SetLogLoggerLevel(slog.LevelInfo)
}
log_path := path.Join(*data_dir, "mmaschedule.log")
f, err := os.OpenFile(log_path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("Failed opening log file", err)
os.Exit(1)
}
defer f.Close()
w := io.MultiWriter(f, os.Stdout)
log.SetOutput(w)
client := NewScraperClient()
db_path := path.Join(*data_dir, "db.sqlite")
db, err := InitDb(db_path)
if err != nil {
slog.Error("Failed initializing database", "error", err)
return
}
slog.Info(
"Starting app",
"command", *cmd,
"host", *host,
"data_dir", *data_dir,
"log_path", log_path,
"db_path", db_path,
)
switch *cmd {
case "runserver":
if !*no_scraping {
slog.Debug("Starting scraping loop")
go ScrapeEventsLoop(db, client, !*no_tapology)
}
err = RunServer(*host, db)
if err != nil {
slog.Error("Error starting web server:", "error", err)
}
case "scrape":
ScrapeEvents(db, client, !*no_tapology)
default:
fmt.Print(POSITIONAL_ARGS_HELP)
os.Exit(1)
}
}
func InitDb(name string) (*event.Queries, error) {
db, err := sql.Open("sqlite", name)
if err != nil {
return nil, err
}
_, err = db.Exec("PRAGMA journal_mode = WAL")
if err != nil {
return nil, err
}
goose.SetBaseFS(migrations)
if err := goose.SetDialect("sqlite3"); err != nil {
return nil, err
}
if err := goose.Up(db, "migrations"); err != nil {
return nil, err
}
queries := event.New(db)
return queries, nil
}