package main import ( "database/sql" "io" "log" "net/http" "os" "sevenkeys/database" "sevenkeys/database/operations" "sevenkeys/scryfall/methods" "sevenkeys/scryfall/types" ) const CACHE_DIR string = "cache" const SET_ICON_CACHE_DIR string = CACHE_DIR + "/seticons/" const SET_ICON_FILE_EXTENSION string = ".svg" const ALL_CARDS_CACHE_FILENAME = CACHE_DIR + "/all-cards.json" func check(err error) { if err != nil { log.Fatal(err) } } func createCacheDirectories() error { err := os.Mkdir(CACHE_DIR, os.ModePerm) if err != nil && !os.IsExist(err) { return err } err = os.Mkdir(SET_ICON_CACHE_DIR, os.ModePerm) if err != nil && !os.IsExist(err) { return err } return nil } func importSets(db *sql.DB, sets []types.Set) error { for _, set := range sets { // We're only interested in paper cards, so skip importing // any sets that were only released in a video game if set.Digital { continue } log.Println("Importing " + set.Code) err = operations.InsertOrUpdateSet(db, set) if err != nil { return err } log.Println("Downloading logo for " + set.Code) response, err := http.Get(set.IconSvgUri) defer response.Body.Close() if err != nil { return err } iconFilename := SET_ICON_CACHE_DIR + set.Code + SET_ICON_FILE_EXTENSION iconFile, err := os.Create(iconFilename) if err != nil { return err } io.Copy(iconFile, response.Body) log.Println("Finished importing " + set.Code) } } func main() { log.Println("Connecting to database...") db := database.GetDatabaseFromConfig("config.json") log.Println("Connected.") log.Println("Creating cache directories...") err = createCacheDirectories() check(err) log.Println("Created cache directories.") log.Println("Downloading set data from Scryfall...") sets, err := methods.GetSets() check(err) log.Println("Downloaded set data.") // Loop through sets, import set data into database and download icons // TODO: Only download icon if we don't already have the file log.Println("Importing set data...") err = importSets() check(err) log.Println("Imported sets.") // Check whether card data has been updated since last download // If yes, redownload and recache the bulk data // Unmarshal cached file into Golang struct // Import cards into database }