init
This commit is contained in:
commit
544f40fa63
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
WoWChatLog.txt
|
||||||
|
.idea
|
35
main.go
Normal file
35
main.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
b, err := os.ReadFile("WoWChatLog.txt")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Strip carriage returns because Windows is retarded
|
||||||
|
b = bytes.ReplaceAll(b, []byte("\r"), []byte(""))
|
||||||
|
|
||||||
|
lines := strings.Split(string(b), "\n")
|
||||||
|
|
||||||
|
games, err := parseGames(lines)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, game := range games {
|
||||||
|
j, err := json.Marshal(game)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(j))
|
||||||
|
}
|
||||||
|
}
|
143
parser.go
Normal file
143
parser.go
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
gameTypeUnknown = iota
|
||||||
|
gameTypeClassic
|
||||||
|
)
|
||||||
|
|
||||||
|
type Game struct {
|
||||||
|
Timestamp time.Time `json:"timestamp"`
|
||||||
|
GameType int `json:"game_type"`
|
||||||
|
Wager int `json:"wager"`
|
||||||
|
Winner string `json:"winner"`
|
||||||
|
Loser string `json:"loser"`
|
||||||
|
HighRoll int `json:"high_roll"`
|
||||||
|
LowRoll int `json:"low_roll"`
|
||||||
|
Payout int `json:"payout"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
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)`)
|
||||||
|
reRoll = regexp.MustCompile(`([\p{L}']+) rolls (\d+) \(1-(\d+)\)$`)
|
||||||
|
reEnd = regexp.MustCompile(`([\p{L}']+) owes ([\p{L}']+) ([\d,]+) gold!`)
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseGames(lines []string) ([]Game, error) {
|
||||||
|
games := make([]Game, 0)
|
||||||
|
var err error
|
||||||
|
|
||||||
|
i := 0
|
||||||
|
for i < len(lines) {
|
||||||
|
if reGameStart.MatchString(lines[i]) {
|
||||||
|
var game Game
|
||||||
|
game, i, err = parse(lines, i)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
games = append(games, game)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
|
return games, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parse(lines []string, i int) (Game, int, error) {
|
||||||
|
var (
|
||||||
|
g Game
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
// Timestamp
|
||||||
|
ts := reTimeStamp.FindString(lines[i])
|
||||||
|
if ts == "" {
|
||||||
|
return g, i, fmt.Errorf("failed to extract timestamp from %s", lines[i])
|
||||||
|
}
|
||||||
|
g.Timestamp, err = time.Parse("1/2 15:04:05.000", ts)
|
||||||
|
if err != nil {
|
||||||
|
return g, i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wager
|
||||||
|
i++
|
||||||
|
matches := reWager.FindStringSubmatch(lines[i])
|
||||||
|
switch matches[1] {
|
||||||
|
case "CLASSIC":
|
||||||
|
g.GameType = gameTypeClassic
|
||||||
|
default:
|
||||||
|
g.GameType = gameTypeUnknown
|
||||||
|
}
|
||||||
|
g.Wager, err = strconv.Atoi(strings.ReplaceAll(matches[2], ",", ""))
|
||||||
|
if err != nil {
|
||||||
|
return g, i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Registration
|
||||||
|
for {
|
||||||
|
if strings.Contains(lines[i], "Registration has ended") {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
|
// Capture Rolls
|
||||||
|
rolls := make(map[string]int)
|
||||||
|
for {
|
||||||
|
if reEnd.MatchString(lines[i]) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
rollMatches := reRoll.FindStringSubmatch(lines[i])
|
||||||
|
if rollMatches == nil {
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := strconv.Atoi(rollMatches[3])
|
||||||
|
if err != nil {
|
||||||
|
return g, i, err
|
||||||
|
}
|
||||||
|
if v != g.Wager {
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignore extra rolls
|
||||||
|
if _, ok := rolls[rollMatches[1]]; !ok {
|
||||||
|
val, err := strconv.Atoi(rollMatches[2])
|
||||||
|
if err != nil {
|
||||||
|
return g, i, err
|
||||||
|
}
|
||||||
|
rolls[rollMatches[1]] = val
|
||||||
|
}
|
||||||
|
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
|
endMatches := reEnd.FindStringSubmatch(lines[i])
|
||||||
|
p := strings.ReplaceAll(endMatches[3], ",", "")
|
||||||
|
payout, err := strconv.Atoi(p)
|
||||||
|
if err != nil {
|
||||||
|
return g, i, err
|
||||||
|
}
|
||||||
|
g.Payout = payout
|
||||||
|
|
||||||
|
g.Winner = endMatches[2]
|
||||||
|
g.HighRoll = rolls[g.Winner]
|
||||||
|
|
||||||
|
g.Loser = endMatches[1]
|
||||||
|
g.LowRoll = rolls[g.Loser]
|
||||||
|
|
||||||
|
return g, i, nil
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user