/
single.go
94 lines (85 loc) · 2.63 KB
/
single.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package mtga
import (
"encoding/json"
"fmt"
panic "log"
"regexp"
"strconv"
"strings"
"github.com/di-wu/mtga/thread/single"
)
// Single is a structure that holds the parser's single line callbacks.
type Single struct {
onSkinSeen func(skins single.Skins)
onCardNotExist func(card single.NotExist)
onNullEntity func(null single.NullEntity)
onStateChange func(from, to string)
}
func (parser *Parser) parseSingleTreadLog(log string) {
switch {
case strings.HasPrefix(log, "Skins seen:"):
if parser.onSkinSeen != nil {
s := strings.Split(strings.TrimPrefix(log, "Skins seen:"), " ")
skins := make(single.Skins)
for _, v := range s {
split := strings.Split(v, "=")
if len(split) != 2 {
continue
}
id, err := strconv.Atoi(split[0])
if err != nil {
panic.Fatalln(err)
}
txt := split[1]
skins[id] = txt
}
parser.onSkinSeen(skins)
}
case strings.HasPrefix(log, "Card #"):
if parser.onCardNotExist != nil {
str := regexp.MustCompile(`#([0-9]*?) \(\"([a-zA-Z ,\'-]*?)\"\) had ParentID #([0-9]*?) `).FindStringSubmatch(log)
cardID, _ := strconv.Atoi(str[1])
parentID, _ := strconv.Atoi(str[3])
parser.onCardNotExist(single.NotExist{
CardID: cardID,
CardName: str[2],
ParentID: parentID,
})
}
case strings.HasPrefix(log, "NULL entity on"):
if parser.onNullEntity != nil {
raw := []byte(strings.TrimPrefix(log, "NULL entity on"))
var null single.NullEntity
err := json.Unmarshal(raw, &null)
if err != nil {
panic.Fatalln(err)
}
parser.onNullEntity(null)
}
case strings.HasPrefix(log, "STATE CHANGED"):
if parser.onStateChange != nil {
str := strings.Split(strings.TrimPrefix(log, "STATE CHANGED "), " -> ")
parser.onStateChange(str[0], str[1])
}
default:
if parser.onUnknownLog != nil {
parser.onUnknownLog(fmt.Sprintf("Unparsed single log: %s", log))
}
}
}
// OnSkinsSeen attaches the given callback, which will be called on seeing skins.
func (single *Single) OnSkinsSeen(callback func(skins single.Skins)) {
single.onSkinSeen = callback
}
// OnCardNotExist attaches the given callback, which will be called on a not existing card.
func (single *Single) OnCardNotExist(callback func(card single.NotExist)) {
single.onCardNotExist = callback
}
// OnNullEntity attaches the given callback, which will be called on a null entity.
func (single *Single) OnNullEntity(callback func(null single.NullEntity)) {
single.onNullEntity = callback
}
// OnStateChange attaches the given callback, which will be called on a the state change.
func (single *Single) OnStateChange(callback func(from, to string)) {
single.onStateChange = callback
}