Skip to content

Commit f8f623d

Browse files
committed
No more printing to stderr, add WarnHandler
We don't wanna clutter up the end users logs unless it's their choice
1 parent 590f3b5 commit f8f623d

File tree

8 files changed

+57
-22
lines changed

8 files changed

+57
-22
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func main() {
3535
log.Fatal(err)
3636
}
3737

38-
p := dem.NewParser(f)
38+
p := dem.NewParser(f, dem.WarnToStdErr)
3939

4040
// Parse header
4141
p.ParseHeader()

common/common.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@
88
package common
99

1010
import (
11-
"fmt"
12-
"os"
1311
"strings"
1412
)
1513

1614
// MapEquipment creates an EquipmentElement from the name of the weapon / equipment.
1715
func MapEquipment(eqName string) EquipmentElement {
1816
eqName = strings.TrimPrefix(eqName, weaponPrefix)
1917

20-
wep := EqUnknown
18+
var wep EquipmentElement
2119

2220
if strings.Contains(eqName, "knife") || strings.Contains(eqName, "bayonet") {
2321
wep = EqKnife
@@ -191,7 +189,8 @@ func MapEquipment(eqName string) EquipmentElement {
191189
case "worldspawn":
192190

193191
default:
194-
fmt.Fprintf(os.Stderr, "WARNING: Unknown weapon / equipment %q\n", eqName)
192+
// TODO: This is really bad imo but we can't access Parser.warn here :/
193+
wep = EqUnknown
195194
}
196195
}
197196
return wep

demoinfocs_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestDemoInfoCs(t *testing.T) {
3232
t.Fatal(err)
3333
}
3434

35-
p := dem.NewParser(f)
35+
p := dem.NewParser(f, dem.WarnToStdErr)
3636

3737
fmt.Println("Parsing header")
3838
p.RegisterEventHandler(func(e events.HeaderParsedEvent) {
@@ -89,7 +89,7 @@ func TestCancelParseToEnd(t *testing.T) {
8989
t.Fatal(err)
9090
}
9191

92-
p := dem.NewParser(f)
92+
p := dem.NewParser(f, nil)
9393
err = p.ParseHeader()
9494
if err != nil {
9595
t.Fatal(err)
@@ -119,7 +119,7 @@ func TestConcurrent(t *testing.T) {
119119
f, _ := os.Open(defaultDemPath)
120120
defer f.Close()
121121

122-
p := dem.NewParser(f)
122+
p := dem.NewParser(f, nil)
123123
err := p.ParseHeader()
124124
if err != nil {
125125
t.Fatal(err)
@@ -166,7 +166,7 @@ func TestDemoSet(t *testing.T) {
166166
}
167167
}()
168168

169-
p := dem.NewParser(f)
169+
p := dem.NewParser(f, nil)
170170
err = p.ParseHeader()
171171
if err != nil {
172172
t.Fatal(err)
@@ -187,7 +187,7 @@ func BenchmarkDemoInfoCs(b *testing.B) {
187187
b.Fatal(err)
188188
}
189189

190-
p := dem.NewParser(f)
190+
p := dem.NewParser(f, nil)
191191
err = p.ParseHeader()
192192
if err != nil {
193193
b.Fatal(err)
@@ -219,7 +219,7 @@ func BenchmarkInMemory(b *testing.B) {
219219

220220
b.ResetTimer()
221221
for i := 0; i < b.N; i++ {
222-
p := dem.NewParser(bytes.NewReader(d))
222+
p := dem.NewParser(bytes.NewReader(d), nil)
223223
err = p.ParseHeader()
224224
if err != nil {
225225
b.Fatal(err)

demopacket.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,21 @@ func (p *Parser) parsePacket() {
6666
m = new(msg.CSVCMsg_UserMessage)
6767

6868
default:
69-
// We don't care about anything else for now
69+
if p.warn != nil {
70+
var name string
71+
if cmd < 8 || cmd >= 100 {
72+
name = msg.NET_Messages_name[int32(cmd)]
73+
} else {
74+
name = msg.SVC_Messages_name[int32(cmd)]
75+
}
76+
if name == "" {
77+
// Send a warning if the command is unknown
78+
// This might mean our proto files are out of date
79+
p.warn(fmt.Sprintf("Unknown message command %q", cmd))
80+
}
81+
}
82+
83+
// On to the next one
7084
p.bitReader.EndChunk()
7185
continue
7286
}

example_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func TestExample(t *testing.T) {
1818
t.Fatal(err)
1919
}
2020

21-
p := dem.NewParser(f)
21+
p := dem.NewParser(f, dem.WarnToStdErr)
2222

2323
// Parse header
2424
p.ParseHeader()

packet_handlers.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package demoinfocs
33
import (
44
"bytes"
55
"fmt"
6-
"os"
76
"strconv"
87

98
r3 "github.com/golang/geo/r3"
@@ -71,6 +70,8 @@ func (p *Parser) readEnterPVS(reader *bit.BitReader, entityID int) *st.Entity {
7170
r := bit.NewSmallBitReader(bytes.NewReader(p.instanceBaselines[scID]))
7271
newEntity.ApplyUpdate(r)
7372
r.Pool()
73+
// TODO: Unregister PropertyUpdateHandlers from CollectProperties()
74+
// PropertyUpdateHandlers would have to be registered as pointers for that to work
7475
}
7576
p.preprocessedBaselines[scID] = ppBase
7677
}
@@ -473,7 +474,9 @@ func (p *Parser) handleGameEvent(ge *msg.CSVCMsg_GameEvent) {
473474
case "hltv_fixed": // Dunno
474475
case "cs_match_end_restart": // Yawn
475476
default:
476-
fmt.Fprintf(os.Stderr, "WARNING: Unknown event %q\n", d.Name)
477+
if p.warn != nil {
478+
p.warn(fmt.Sprintf("Unknown event %q", d.Name))
479+
}
477480
}
478481
}
479482

@@ -618,8 +621,9 @@ func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
618621
case msg.ECstrike15UserMessages_CS_UM_SayText:
619622
st := new(msg.CCSUsrMsg_SayText)
620623
err := st.Unmarshal(um.MsgData)
621-
if err != nil {
622-
panic(fmt.Sprintf("Failed to decode SayText message: %s", err.Error()))
624+
if err != nil && p.warn != nil {
625+
// Just send a warning, chat messages aren't that important
626+
p.warn(fmt.Sprintf("Failed to decode SayText message: %s", err.Error()))
623627
}
624628

625629
p.eventDispatcher.Dispatch(events.SayTextEvent{
@@ -632,8 +636,8 @@ func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
632636
case msg.ECstrike15UserMessages_CS_UM_SayText2:
633637
st := new(msg.CCSUsrMsg_SayText2)
634638
err := st.Unmarshal(um.MsgData)
635-
if err != nil {
636-
panic(fmt.Sprintf("Failed to decode SayText2 message: %s", err.Error()))
639+
if err != nil && p.warn != nil {
640+
p.warn(fmt.Sprintf("Failed to decode SayText2 message: %s", err.Error()))
637641
}
638642

639643
sender := p.players[int(st.EntIdx)]
@@ -654,7 +658,11 @@ func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
654658
Text: st.Params[1],
655659
IsChatAll: st.Textallchat,
656660
})
661+
657662
default:
663+
if p.warn != nil {
664+
p.warn(fmt.Sprintf("Skipped sending ChatMessageEvent for SayText2 with unknown MsgName %q", st.MsgName))
665+
}
658666
}
659667

660668
default:

parser.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package demoinfocs
22

33
import (
4+
"fmt"
45
"io"
6+
"os"
57

68
dp "github.com/markus-wa/godispatch"
79

@@ -45,6 +47,7 @@ type Parser struct {
4547
gehDescriptors map[int32]*msg.CSVCMsg_GameEventListDescriptorT
4648
stringTables []*msg.CSVCMsg_CreateStringTable
4749
cancelChan chan struct{}
50+
warn WarnHandler
4851
}
4952

5053
// Map returns the map name. E.g. de_dust2 or de_inferno.
@@ -159,9 +162,19 @@ func (ts TeamState) Flag() string {
159162
return ts.flag
160163
}
161164

165+
// WarnHandler is a function that handles warnings of a Parser.
166+
type WarnHandler func(string)
167+
168+
// WarnToStdErr is a WarnHandler that prints all warnings to standard error output.
169+
func WarnToStdErr(warning string) {
170+
fmt.Fprintln(os.Stderr, warning)
171+
}
172+
162173
// NewParser creates a new Parser on the basis of an io.Reader
163174
// - like os.File or bytes.Reader - that reads demo data.
164-
func NewParser(demostream io.Reader) *Parser {
175+
// Any warnings that don't stop the Parser from doing it's job
176+
// will be passed to the warnHandler if it's not nil.
177+
func NewParser(demostream io.Reader, warnHandler WarnHandler) *Parser {
165178
var p Parser
166179
// Init parser
167180
p.bitReader = bit.NewLargeBitReader(demostream)
@@ -173,6 +186,7 @@ func NewParser(demostream io.Reader) *Parser {
173186
p.connectedPlayers = make(map[int]*common.Player)
174187
p.entities = make(map[int]*st.Entity)
175188
p.cancelChan = make(chan struct{}, 1)
189+
p.warn = warnHandler
176190

177191
// Attach proto msg handlers
178192
p.msgDispatcher.RegisterHandler(p.handlePacketEntities)

parsing.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package demoinfocs
33
import (
44
"errors"
55
"fmt"
6-
"os"
76

87
common "github.com/markus-wa/demoinfocs-golang/common"
98
events "github.com/markus-wa/demoinfocs-golang/events"
@@ -153,7 +152,8 @@ func (p *Parser) parseFrame() bool {
153152
p.parsePacket()
154153

155154
case dcCustomData:
156-
fmt.Fprintf(os.Stderr, "WARNING: Found CustomData but not handled\n")
155+
// Might as well panic since we'll be way off if we dont skip the whole thing
156+
panic("Found CustomData but not handled")
157157

158158
default:
159159
panic(fmt.Sprintf("Canny handle it anymoe (command %v unknown)", cmd))

0 commit comments

Comments
 (0)