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 }