Skip to content

Commit a06d41a

Browse files
committed
Add ParserWarnEvent (#16)
1 parent 53fa336 commit a06d41a

File tree

7 files changed

+38
-54
lines changed

7 files changed

+38
-54
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func main() {
4343
log.Fatal(err)
4444
}
4545

46-
p := dem.NewParser(f, dem.WarnToStdErr)
46+
p := dem.NewParser(f)
4747

4848
// Parse header
4949
h, err := p.ParseHeader()

demoinfocs_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func TestDemoInfoCs(t *testing.T) {
3636
}
3737
defer f.Close()
3838

39-
p := dem.NewParser(f, dem.WarnToStdErr)
39+
p := dem.NewParser(f)
4040

4141
fmt.Println("Parsing header")
4242
h, err := p.ParseHeader()
@@ -140,7 +140,7 @@ func TestUnexpectedEndOfDemo(t *testing.T) {
140140
}
141141
defer f.Close()
142142

143-
p := dem.NewParser(f, nil)
143+
p := dem.NewParser(f)
144144
_, err = p.ParseHeader()
145145
if err != nil {
146146
t.Fatal(err)
@@ -159,7 +159,7 @@ func TestCancelParseToEnd(t *testing.T) {
159159
}
160160
defer f.Close()
161161

162-
p := dem.NewParser(f, nil)
162+
p := dem.NewParser(f)
163163
_, err = p.ParseHeader()
164164
if err != nil {
165165
t.Fatal(err)
@@ -195,7 +195,7 @@ func TestConcurrent(t *testing.T) {
195195
}
196196
defer f.Close()
197197

198-
p := dem.NewParser(f, nil)
198+
p := dem.NewParser(f)
199199

200200
_, err = p.ParseHeader()
201201
if err != nil {
@@ -248,7 +248,7 @@ func TestDemoSet(t *testing.T) {
248248
}
249249
}()
250250

251-
p := dem.NewParser(f, nil)
251+
p := dem.NewParser(f)
252252
_, err = p.ParseHeader()
253253
if err != nil {
254254
t.Error(err)
@@ -274,7 +274,7 @@ func BenchmarkDemoInfoCs(b *testing.B) {
274274
}
275275
defer f.Close()
276276

277-
p := dem.NewParser(f, nil)
277+
p := dem.NewParser(f)
278278

279279
_, err = p.ParseHeader()
280280
if err != nil {
@@ -313,7 +313,7 @@ func BenchmarkInMemory(b *testing.B) {
313313

314314
b.ResetTimer()
315315
for i := 0; i < b.N; i++ {
316-
p := dem.NewParser(bytes.NewReader(d), nil)
316+
p := dem.NewParser(bytes.NewReader(d))
317317

318318
_, err = p.ParseHeader()
319319
if err != nil {

demopacket.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
proto "github.com/gogo/protobuf/proto"
88

9+
"github.com/markus-wa/demoinfocs-golang/events"
910
msg "github.com/markus-wa/demoinfocs-golang/msg"
1011
)
1112

@@ -53,23 +54,21 @@ func (p *Parser) parsePacket() {
5354
m = new(msg.CSVCMsg_UserMessage)
5455

5556
default:
56-
if p.warn != nil || isDebug {
57-
var name string
58-
if cmd < 8 || cmd >= 100 {
59-
name = msg.NET_Messages_name[int32(cmd)]
60-
} else {
61-
name = msg.SVC_Messages_name[int32(cmd)]
62-
}
57+
var name string
58+
if cmd < 8 || cmd >= 100 {
59+
name = msg.NET_Messages_name[int32(cmd)]
60+
} else {
61+
name = msg.SVC_Messages_name[int32(cmd)]
62+
}
6363

64+
if isDebug {
6465
debugUnhandledMessage(cmd, name)
66+
}
6567

66-
if p.warn != nil {
67-
if name == "" {
68-
// Send a warning if the command is unknown
69-
// This might mean our proto files are out of date
70-
p.warn(fmt.Sprintf("Unknown message command %q", cmd))
71-
}
72-
}
68+
if name == "" {
69+
// Send a warning if the command is unknown
70+
// This might mean our proto files are out of date
71+
p.eventDispatcher.Dispatch(events.ParserWarnEvent{Message: fmt.Sprintf("Unknown message command %q", cmd)})
7372
}
7473

7574
// On to the next one

events/events.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,3 +309,9 @@ type DataTablesParsedEvent struct{}
309309
type StringTableCreatedEvent struct {
310310
TableName string
311311
}
312+
313+
// ParserWarnEvent signals that a non-fatal problem occurred during parsing.
314+
// This is a beta feature, it may be replaced or changed without notice.
315+
type ParserWarnEvent struct {
316+
Message string
317+
}

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
}
1919
defer f.Close()
2020

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

2323
// Parse header
2424
h, err := p.ParseHeader()

game_events.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (p *Parser) handleGameEvent(ge *msg.CSVCMsg_GameEvent) {
2828
}()
2929

3030
if p.gameEventDescs == nil {
31-
p.warn("Received GameEvent but event descriptors are missing")
31+
p.eventDispatcher.Dispatch(events.ParserWarnEvent{Message: "Received GameEvent but event descriptors are missing"})
3232
return
3333
}
3434

@@ -405,9 +405,7 @@ func (p *Parser) handleGameEvent(ge *msg.CSVCMsg_GameEvent) {
405405
case "cs_match_end_restart": // Yawn
406406

407407
default:
408-
if p.warn != nil {
409-
p.warn(fmt.Sprintf("Unknown event %q", d.Name))
410-
}
408+
p.eventDispatcher.Dispatch(events.ParserWarnEvent{Message: fmt.Sprintf("Unknown event %q", d.Name)})
411409
}
412410
}
413411

@@ -459,9 +457,8 @@ func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
459457
case msg.ECstrike15UserMessages_CS_UM_SayText:
460458
st := new(msg.CCSUsrMsg_SayText)
461459
err := st.Unmarshal(um.MsgData)
462-
if err != nil && p.warn != nil {
463-
// Just send a warning, chat messages aren't that important
464-
p.warn(fmt.Sprintf("Failed to decode SayText message: %s", err.Error()))
460+
if err != nil {
461+
p.eventDispatcher.Dispatch(events.ParserWarnEvent{Message: fmt.Sprintf("Failed to decode SayText message: %s", err.Error())})
465462
}
466463

467464
p.eventDispatcher.Dispatch(events.SayTextEvent{
@@ -474,8 +471,8 @@ func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
474471
case msg.ECstrike15UserMessages_CS_UM_SayText2:
475472
st := new(msg.CCSUsrMsg_SayText2)
476473
err := st.Unmarshal(um.MsgData)
477-
if err != nil && p.warn != nil {
478-
p.warn(fmt.Sprintf("Failed to decode SayText2 message: %s", err.Error()))
474+
if err != nil {
475+
p.eventDispatcher.Dispatch(events.ParserWarnEvent{Message: fmt.Sprintf("Failed to decode SayText2 message: %s", err.Error())})
479476
}
480477

481478
sender := p.gameState.players[int(st.EntIdx)]
@@ -501,9 +498,7 @@ func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
501498
case "#CSGO_Coach_Join_CT":
502499

503500
default:
504-
if p.warn != nil {
505-
p.warn(fmt.Sprintf("Skipped sending ChatMessageEvent for SayText2 with unknown MsgName %q", st.MsgName))
506-
}
501+
p.eventDispatcher.Dispatch(events.ParserWarnEvent{Message: fmt.Sprintf("Skipped sending ChatMessageEvent for SayText2 with unknown MsgName %q", st.MsgName)})
507502
}
508503

509504
default:

parser.go

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

33
import (
4-
"fmt"
54
"io"
6-
"os"
75
"sync"
86

97
r3 "github.com/golang/geo/r3"
@@ -44,7 +42,6 @@ type Parser struct {
4442
gameEventDescs map[int32]*msg.CSVCMsg_GameEventListDescriptorT
4543
stringTables []*msg.CSVCMsg_CreateStringTable
4644
cancelChan chan struct{}
47-
warn WarnHandler
4845
err error
4946
errLock sync.Mutex
5047
}
@@ -129,24 +126,12 @@ func (p *Parser) setError(err error) {
129126
}
130127
}
131128

132-
// TODO: Maybe we should use a channel instead of that WarnHandler stuff
133-
134-
// WarnHandler is a function that handles warnings of a Parser.
135-
type WarnHandler func(string)
136-
137-
// WarnToStdErr is a WarnHandler that prints all warnings to standard error output.
138-
func WarnToStdErr(warning string) {
139-
fmt.Fprintln(os.Stderr, warning)
140-
}
141-
142129
// TODO: Change the New* methods (names + parameters)
143130

144131
// NewParser creates a new Parser on the basis of an io.Reader
145132
// - like os.File or bytes.Reader - that reads demo data.
146-
// Any warnings that don't stop the Parser from doing it's job
147-
// will be passed to the warnHandler if it's not nil.
148-
func NewParser(demostream io.Reader, warnHandler WarnHandler) *Parser {
149-
return NewParserWithBufferSize(demostream, -1, warnHandler)
133+
func NewParser(demostream io.Reader) *Parser {
134+
return NewParserWithBufferSize(demostream, -1)
150135
}
151136

152137
// NewParserWithBufferSize returns a new Parser with a custom msgQueue buffer size.
@@ -155,7 +140,7 @@ func NewParser(demostream io.Reader, warnHandler WarnHandler) *Parser {
155140
// A negative value will make the Parser automatically decide the buffer size during ParseHeader()
156141
// based on the number of ticks in the demo (nubmer of ticks = buffer size).
157142
// See also: NewParser()
158-
func NewParserWithBufferSize(demostream io.Reader, msgQueueBufferSize int, warnHandler WarnHandler) *Parser {
143+
func NewParserWithBufferSize(demostream io.Reader, msgQueueBufferSize int) *Parser {
159144
var p Parser
160145
// Init parser
161146
p.bitReader = bit.NewLargeBitReader(demostream)
@@ -168,7 +153,6 @@ func NewParserWithBufferSize(demostream io.Reader, msgQueueBufferSize int, warnH
168153
p.triggers = make(map[int]*boundingBoxInformation)
169154
p.cancelChan = make(chan struct{}, 1)
170155
p.gameState = newGameState()
171-
p.warn = warnHandler
172156

173157
// Attach proto msg handlers
174158
p.msgDispatcher.RegisterHandler(p.handlePacketEntities)

0 commit comments

Comments
 (0)