Skip to content

Commit 590f3b5

Browse files
committed
Hook up chat message events
1 parent 1cf286c commit 590f3b5

File tree

4 files changed

+73
-5
lines changed

4 files changed

+73
-5
lines changed

demopacket.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ func (p *Parser) parsePacket() {
6262
case int(msg.SVC_Messages_svc_UpdateStringTable):
6363
m = new(msg.CSVCMsg_UpdateStringTable)
6464

65+
case int(msg.SVC_Messages_svc_UserMessage):
66+
m = new(msg.CSVCMsg_UserMessage)
67+
6568
default:
6669
// We don't care about anything else for now
6770
p.bitReader.EndChunk()

events/events.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,24 +237,38 @@ type PlayerDisconnectEvent struct {
237237
Player *common.Player
238238
}
239239

240-
// SayTextEvent signals a chat message. Not sure what the
241-
// difference between this and SayText2Event is.
240+
// SayTextEvent signals a chat message. It contains the raw
241+
// network message data for admin / console messages.
242+
// EntityIndex will probably always be 0
243+
// See ChatMessageEvent and SayText2Event for player chat messages.
242244
type SayTextEvent struct {
243245
EntityIndex int
244246
Text string
245247
IsChat bool
246248
IsChatAll bool
247249
}
248250

249-
// SayText2Event signals a chat message. Not sure what the
250-
// difference between this and SayTextEvent is.
251+
// SayText2Event signals a chat message. It just contains the raw network message
252+
// for player chat messages, ChatMessageEvent may be more interesting.
253+
// Team chat is generally not recorded so IsChatAll will probably always be false.
254+
// See SayTextEvent for admin / console messages.
251255
type SayText2Event struct {
252256
Sender *common.Player
253-
Text string
257+
MsgName string
258+
Params []string
254259
IsChat bool
255260
IsChatAll bool
256261
}
257262

263+
// ChatMessageEvent signals a player generated chat message.
264+
// Since team chat is generally not recorded IsChatAll will probably always be false.
265+
// See SayTextEvent for admin / console messages and SayText2Event for raw network packages.
266+
type ChatMessageEvent struct {
267+
Sender *common.Player
268+
Text string
269+
IsChatAll bool
270+
}
271+
258272
// RankUpdateEvent signals the new rank. Not sure if this
259273
// only occurs if the rank changed.
260274
type RankUpdateEvent struct {

packet_handlers.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,3 +612,53 @@ func (p *Parser) handleCreateStringTable(tab *msg.CSVCMsg_CreateStringTable) {
612612
p.stringTables = append(p.stringTables, tab)
613613
br.Pool()
614614
}
615+
616+
func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
617+
switch msg.ECstrike15UserMessages(um.MsgType) {
618+
case msg.ECstrike15UserMessages_CS_UM_SayText:
619+
st := new(msg.CCSUsrMsg_SayText)
620+
err := st.Unmarshal(um.MsgData)
621+
if err != nil {
622+
panic(fmt.Sprintf("Failed to decode SayText message: %s", err.Error()))
623+
}
624+
625+
p.eventDispatcher.Dispatch(events.SayTextEvent{
626+
EntityIndex: int(st.EntIdx),
627+
IsChat: st.Chat,
628+
IsChatAll: st.Textallchat,
629+
Text: st.Text,
630+
})
631+
632+
case msg.ECstrike15UserMessages_CS_UM_SayText2:
633+
st := new(msg.CCSUsrMsg_SayText2)
634+
err := st.Unmarshal(um.MsgData)
635+
if err != nil {
636+
panic(fmt.Sprintf("Failed to decode SayText2 message: %s", err.Error()))
637+
}
638+
639+
sender := p.players[int(st.EntIdx)]
640+
p.eventDispatcher.Dispatch(events.SayText2Event{
641+
Sender: sender,
642+
IsChat: st.Chat,
643+
IsChatAll: st.Textallchat,
644+
MsgName: st.MsgName,
645+
Params: st.Params,
646+
})
647+
648+
switch st.MsgName {
649+
case "Cstrike_Chat_All":
650+
fallthrough
651+
case "Cstrike_Chat_AllDead":
652+
p.eventDispatcher.Dispatch(events.ChatMessageEvent{
653+
Sender: sender,
654+
Text: st.Params[1],
655+
IsChatAll: st.Textallchat,
656+
})
657+
default:
658+
}
659+
660+
default:
661+
// TODO: handle more user messages (if they are interesting)
662+
// Maybe msg.ECstrike15UserMessages_CS_UM_RadioText
663+
}
664+
}

parser.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ func NewParser(demostream io.Reader) *Parser {
180180
p.msgDispatcher.RegisterHandler(p.handleGameEvent)
181181
p.msgDispatcher.RegisterHandler(p.handleCreateStringTable)
182182
p.msgDispatcher.RegisterHandler(p.handleUpdateStringTable)
183+
p.msgDispatcher.RegisterHandler(p.handleUserMessage)
183184

184185
p.msgDispatcher.AddQueues(p.msgQueue)
185186
return &p

0 commit comments

Comments
 (0)