// NGnius 2020-01-30 package main // leadercraft-server import ( "flag" "fmt" "net/http" "os" "os/signal" "encoding/json" "strconv" ) const ( // Version the current version Version = "0.1" // Name the program name Name = "leadercraft-shopper" ) var ( isClosing bool printVersionAndExit bool ) type Criteria struct { Location [][]float64 GameID int64 Coefficient int64 ScoreMode string } func defaultCriteria() Criteria { return Criteria { Location: [][]float64 {[]float64{-10000,-10000, -10000}, []float64{10000,10000,10000}}, GameID: 0, Coefficient: 1_000_000_000, ScoreMode: "time", } } func init() { initArgs() } func main() { parseArgs() sqlInitErr := sqlInit() if sqlInitErr != nil { fmt.Printf("Failed to initialise SQL connection: %s\n", sqlInitErr) os.Exit(1) } // handle interrupt (terminate) signal signalChan := make(chan os.Signal) signal.Notify(signalChan, os.Interrupt) go func() { s := <-signalChan fmt.Println("Received terminate signal " + s.String()) isClosing = true sqlClose() }() // get popular games for page := 1; page < 10; page++ { url := fmt.Sprintf("https://api.steampowered.com/IPublishedFileService/QueryFiles/v1/?key=%s&page=%d&numperpage=%d&appid=%d&requiredtags=%s&return_short_description=true", os.Getenv("STEAM_TOKEN"), page, 100, 1078000, "[\"featured\",\"game\"]") resp, err := http.Get(url) if err != nil { fmt.Println(err) return } if resp.StatusCode != 200 { fmt.Println(resp.Status) return } gamesJSON := make(map[string]interface{}) decoder := json.NewDecoder(resp.Body) decErr := decoder.Decode(&gamesJSON) if decErr != nil { fmt.Println(decErr) return } resp.Body.Close() games := gamesJSON["response"].(map[string]interface{})["publishedfiledetails"].([]interface{}) //fmt.Println(len(games)) //fmt.Println(gamesJSON["response"].(map[string]interface{})["total"].(float64)) folderErr := os.MkdirAll("criterias/", os.ModeDir | os.ModePerm) if folderErr != nil { fmt.Println(folderErr) } for _, genGame := range games { game := genGame.(map[string]interface{}) id, _ := strconv.Atoi(game["publishedfileid"].(string)) id64 := int64(id) title := game["title"].(string) desc := game["short_description"].(string) //fmt.Printf("Game ID:%d title:'%s' desc:'%s'\n", id, title, desc) gameBoard := LoadBoard(id64) if gameBoard == nil { // create new board gameBoard = &Board{ ID: id64, Name: title, Description: desc, } gameBoard.Commit() // create new criteria crit := defaultCriteria() crit.GameID = id64 file, createErr := os.Create(fmt.Sprintf("criterias/criteria-%d.json", id64)) if createErr != nil { fmt.Println(createErr) } else { encoder := json.NewEncoder(file) encoder.Encode(&crit) file.Close() } fmt.Printf("Created new Board ID:%d Name:'%s'\n", id, title) } else if id64 > 2 { fmt.Printf("Found existing Board ID:%d Name:'%s'\n", id, gameBoard.Name) if gameBoard.Name != title || gameBoard.Description != desc { gameBoard.Name = title gameBoard.Description = desc } gameBoard.Commit() } } } } func initArgs() { flag.BoolVar(&printVersionAndExit, "version", false, "Print version and exit") flag.StringVar(&sqlConnection, "conn", sqlConnectionDefault, "Database connection string") flag.StringVar(&sqlServer, "sql", sqlServerDefault, "SQL Database type") } func parseArgs() { flag.Parse() if printVersionAndExit { fmt.Println(Name + " v" + Version) os.Exit(0) } }