007e45f06b
- switched sqlite driver to modernc.org/sqlite
126 lines
2.5 KiB
Go
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
|
|
}
|