From b3014466ac54633b3d98b2be652ccc731497e089 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Mon, 7 Apr 2025 14:04:30 -0700 Subject: [PATCH] build --- .gitignore | 2 +- gambo.go | 4 +- loot.go | 116 ++++++++++++++++++++++++++++++++++++++++++++------- loot_test.go | 14 +++++++ main.go | 5 ++- parser.go | 2 +- 6 files changed, 123 insertions(+), 20 deletions(-) create mode 100644 loot_test.go diff --git a/.gitignore b/.gitignore index b2b4cad..34fcb54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ WoWChatLog.txt .idea config.toml -testloot.csv \ No newline at end of file +*.csv \ No newline at end of file diff --git a/gambo.go b/gambo.go index 99b1106..d7ccb3d 100644 --- a/gambo.go +++ b/gambo.go @@ -27,8 +27,8 @@ func gambo() { } for _, game := range games { - //err = uploadGambo(game, "https://forcek.in/game") - err = uploadGamboTest(game) + err = uploadGambo(game, "https://forcek.in/game") + //err = uploadGamboTest(game) if err != nil { log.Fatal(err) } diff --git a/loot.go b/loot.go index 8049d30..9f410f2 100644 --- a/loot.go +++ b/loot.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "github.com/sqweek/dialog" + "io" "log" "net/http" "os" @@ -15,6 +16,11 @@ import ( "time" ) +type LootUpload struct { + Loot []LootRecord `json:"loot"` + Players []string `json:"players"` +} + type LootRecord struct { Name string `json:"player"` ItemID int `json:"item_id"` @@ -24,25 +30,62 @@ type LootRecord struct { } func loot() { + loots, err := parseLoot() + if err != nil { + log.Fatal(err) + } + + fmt.Print("Enter the matching warcraft logs report id:") + var reportID string + _, err = fmt.Scanln(&reportID) + if err != nil { + log.Fatal(err) + } + + players, err := getAttendance(reportID) + if err != nil { + log.Fatal(err) + } + + upload := LootUpload{ + Loot: loots, + Players: players, + } + + err = uploadLoot(upload, "https://forcek.in/loot") + //err = uploadLootTest(upload) + if err != nil { + log.Fatal(err) + } +} + +func parseLoot() ([]LootRecord, error) { csvPath, err := dialog.File().Title("Select the csv file").Load() if err != nil { if errors.Is(err, dialog.ErrCancelled) { - log.Fatalf("Cancelled dialog box, exiting") + return nil, fmt.Errorf("cancelled dialog box, exiting") } else { - log.Fatal(err) + return nil, err } } csvFile, err := os.Open(csvPath) if err != nil { - log.Fatal(err) + return nil, err } defer csvFile.Close() - csvReader := csv.NewReader(csvFile) + data, err := io.ReadAll(csvFile) + if err != nil { + return nil, err + } + + data = bytes.ReplaceAll(data, []byte("[\"Bullet-Proof\" Vestplate]"), []byte("[Bullet-Proof Vestplate]")) + + csvReader := csv.NewReader(bytes.NewReader(data)) records, err := csvReader.ReadAll() if err != nil { - log.Fatalf("Failed to parse csv: %v\n", err) + return nil, fmt.Errorf("failed to parse csv: %v\n", err) } loots := make([]LootRecord, 0) @@ -80,16 +123,61 @@ func loot() { loots = append(loots, l) } - for _, l := range loots { - err = uploadLoot(l, "https://forcek.in/loot") - //err = uploadLootTest(l) - if err != nil { - log.Fatal(err) - } - } + return loots, nil } -func uploadLoot(l LootRecord, endpoint string) error { +type WarcraftLog struct { + Lang string `json:"lang"` + Fights any `json:"fights"` + CompleteRaids any `json:"complete_raids"` + Friendlies any `json:"friendlies"` + Enemies any `json:"enemies"` + FriendlyPets any `json:"friendly_pets"` + EnemyPets any `json:"enemyPets"` + LogVersion int `json:"logVersion"` + GameVersion int `json:"gameVersion"` + Phases any `json:"phases"` + Title string `json:"title"` + Owner string `json:"owner"` + Start int64 `json:"start"` + End int64 `json:"end"` + Zone int `json:"zone"` + ExportedCharacters []struct { + ID int `json:"id"` + Name string `json:"name"` + Server string `json:"server"` + Region string `json:"region"` + } `json:"exportedCharacters"` +} + +func getAttendance(reportID string) ([]string, error) { + logUrl := fmt.Sprintf("https://www.warcraftlogs.com:443/v1/report/fights/%s?api_key=%s", reportID, config.WarcraftLogsApiKey) + resp, err := http.Get(logUrl) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var wlog WarcraftLog + err = json.Unmarshal(body, &wlog) + if err != nil { + return nil, err + } + + players := make([]string, 0) + for _, p := range wlog.ExportedCharacters { + players = append(players, p.Name) + } + + return players, nil +} + +func uploadLoot(l LootUpload, endpoint string) error { marshalled, err := json.Marshal(l) if err != nil { return err @@ -113,6 +201,6 @@ func uploadLoot(l LootRecord, endpoint string) error { return nil } -func uploadLootTest(l LootRecord) error { +func uploadLootTest(l LootUpload) error { return uploadLoot(l, "http://localhost:3000/loot") } diff --git a/loot_test.go b/loot_test.go new file mode 100644 index 0000000..77d4461 --- /dev/null +++ b/loot_test.go @@ -0,0 +1,14 @@ +package main + +import "testing" + +func TestWarcraftLogs(t *testing.T) { + setupConfig() + players, err := getAttendance("VFy1BaAJ2pjKG8N6") + if err != nil { + t.Fatal(err) + } + if len(players) != 17 { + t.Fatalf("Wrong number of players: %d", len(players)) + } +} diff --git a/main.go b/main.go index b961efa..135e9b0 100644 --- a/main.go +++ b/main.go @@ -10,8 +10,9 @@ import ( ) type Config struct { - Log string - Apikey string + Log string + Apikey string + WarcraftLogsApiKey string } var config Config diff --git a/parser.go b/parser.go index 680c274..eeffe44 100644 --- a/parser.go +++ b/parser.go @@ -26,7 +26,7 @@ type Game struct { } var ( - reTimeStamp = regexp.MustCompile(`(\d/\d \d+:\d+:\d+.\d+)`) + reTimeStamp = regexp.MustCompile(`(\d+/\d+ \d+:\d+:\d+\.\d+)`) reGameStart = regexp.MustCompile(`WoWGoldGambler: A new game has been started`) reWager = regexp.MustCompile(`Game Mode - ([A-Z]+) - Wager - ([\d,]+)g$`) reSignup = regexp.MustCompile(`([\p{L}']+)-[\p{L}'0-9]+: (1|-1)`)