blob: 94e022297bffe64c82dcc31ffe8f1d63135d2be4 [file] [log] [blame]
package main
import (
"errors"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"path/filepath"
"syscall"
"github.com/frc971/971-Robot-Code/scouting/db"
"github.com/frc971/971-Robot-Code/scouting/scraping"
"github.com/frc971/971-Robot-Code/scouting/webserver/requests"
"github.com/frc971/971-Robot-Code/scouting/webserver/server"
"github.com/frc971/971-Robot-Code/scouting/webserver/static"
)
func getDefaultDatabasePath() string {
// If using `bazel run`, let's create the database in the root of the
// workspace.
workspaceDir := os.Getenv("BUILD_WORKSPACE_DIRECTORY")
if workspaceDir != "" {
return filepath.Join(workspaceDir, "scouting.db")
}
// If we're inside a `bazel test`, then we will create the database in
// a temporary directory.
testTempDir := os.Getenv("TEST_TMPDIR")
if testTempDir != "" {
tempDir, err := ioutil.TempDir(testTempDir, "db")
if err != nil {
log.Fatal("Failed to create temporary directory in TEST_TMPDIR: ", err)
}
return filepath.Join(tempDir, "scouting.db")
}
return filepath.Join(".", "scouting.db")
}
func main() {
portPtr := flag.Int("port", 8080, "The port number to bind to.")
dirPtr := flag.String("directory", ".", "The directory to serve at /.")
dbPathPtr := flag.String("database", getDefaultDatabasePath(), "The path to the database.")
blueAllianceConfigPtr := flag.String("tba_config", "",
"The path to your The Blue Alliance JSON config. "+
"It needs an \"api_key\" field with your TBA API key. "+
"Optionally, it can have a \"url\" field with the TBA API base URL.")
flag.Parse()
database, err := db.NewDatabase(*dbPathPtr)
if err != nil {
log.Fatal("Failed to connect to database: ", err)
}
scrapeMatchList := func(year int32, eventCode string) ([]scraping.Match, error) {
if *blueAllianceConfigPtr == "" {
return nil, errors.New("Cannot scrape TBA's match list without a config file.")
}
return scraping.AllMatches(year, eventCode, *blueAllianceConfigPtr)
}
scoutingServer := server.NewScoutingServer()
static.ServePages(scoutingServer, *dirPtr)
requests.HandleRequests(database, scrapeMatchList, scoutingServer)
scoutingServer.Start(*portPtr)
fmt.Println("Serving", *dirPtr, "on port", *portPtr)
// Block until the user hits Ctrl-C.
sigint := make(chan os.Signal, 1)
signal.Notify(sigint, syscall.SIGINT)
fmt.Println("Waiting for CTRL-C or SIGINT.")
<-sigint
fmt.Println("Shutting down.")
scoutingServer.Stop()
fmt.Println("Successfully shut down.")
}