Skip to content

Commit 14c6b60

Browse files
authored
core: index players by steam-ID for rank updates (#322)
fixes #320
1 parent e7bb0d2 commit 14c6b60

File tree

6 files changed

+47
-19
lines changed

6 files changed

+47
-19
lines changed

go.sum

-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ github.com/markus-wa/go-heatmap v1.0.0 h1:UT3+9Re6Fr6h4Qs7y0QmVjlvbu+92E9tnuqKEh
2222
github.com/markus-wa/go-heatmap v1.0.0/go.mod h1:mUE6YBiMclq9MYXCb8fLbiWvyZtGglLrfMJ+LSHrlPA=
2323
github.com/markus-wa/go-unassert v0.1.2 h1:uXWlMDa8JVtc4RgNq4XJIjyRejv9MOVuy/E0VECPxxo=
2424
github.com/markus-wa/go-unassert v0.1.2/go.mod h1:XEvrxR+trvZeMDfXcZPvzqGo6eumEtdk5VjNRuvvzxQ=
25-
github.com/markus-wa/gobitread v0.2.3-0.20210710124713-58959e776f8b h1:iYFgASuNE8XtbTxjWq1AoO2uYJ4knR1AgsGfrW6byz4=
26-
github.com/markus-wa/gobitread v0.2.3-0.20210710124713-58959e776f8b/go.mod h1:PcWXMH4gx7o2CKslbkFkLyJB/aHW7JVRG3MRZe3PINg=
2725
github.com/markus-wa/gobitread v0.2.3 h1:COx7dtYQ7Q+77hgUmD+O4MvOcqG7y17RP3Z7BbjRvPs=
2826
github.com/markus-wa/gobitread v0.2.3/go.mod h1:PcWXMH4gx7o2CKslbkFkLyJB/aHW7JVRG3MRZe3PINg=
2927
github.com/markus-wa/godispatch v1.4.1 h1:Cdff5x33ShuX3sDmUbYWejk7tOuoHErFYMhUc2h7sLc=

pkg/demoinfocs/datatables.go

+2
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ func (p *parser) getOrCreatePlayer(entityID int, rp *playerInfo) (isNew bool, pl
185185
player.SteamID64 = rp.xuid
186186
player.IsBot = rp.isFakePlayer || rp.guid == "BOT"
187187
player.UserID = rp.userID
188+
189+
p.gameState.indexPlayerBySteamID(player)
188190
}
189191
} else {
190192
// see #162.

pkg/demoinfocs/game_state.go

+8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type gameState struct {
2121
ctState common.TeamState
2222
playersByUserID map[int]*common.Player // Maps user-IDs to players
2323
playersByEntityID map[int]*common.Player // Maps entity-IDs to players
24+
playersBySteamID32 map[uint32]*common.Player // Maps 32-bit-steam-IDs to players
2425
playerResourceEntity st.Entity // CCSPlayerResource entity instance, contains scoreboard info and more
2526
grenadeProjectiles map[int]*common.GrenadeProjectile // Maps entity-IDs to active nade-projectiles. That's grenades that have been thrown, but have not yet detonated.
2627
infernos map[int]*common.Inferno // Maps entity-IDs to active infernos.
@@ -52,6 +53,12 @@ func (gs *gameState) handleIngameTickNumber(n ingameTickNumber) {
5253
debugIngameTick(gs.ingameTick)
5354
}
5455

56+
func (gs *gameState) indexPlayerBySteamID(pl *common.Player) {
57+
if !pl.IsBot && pl.SteamID64 > 0 {
58+
gs.playersBySteamID32[common.ConvertSteamID64To32(pl.SteamID64)] = pl
59+
}
60+
}
61+
5562
// IngameTick returns the latest actual tick number of the server during the game.
5663
//
5764
// Watch out, I've seen this return wonky negative numbers at the start of demos.
@@ -179,6 +186,7 @@ func newGameState(demoInfo demoInfoProvider) *gameState {
179186
gs := &gameState{
180187
playersByEntityID: make(map[int]*common.Player),
181188
playersByUserID: make(map[int]*common.Player),
189+
playersBySteamID32: make(map[uint32]*common.Player),
182190
grenadeProjectiles: make(map[int]*common.GrenadeProjectile),
183191
infernos: make(map[int]*common.Inferno),
184192
weapons: make(map[int]*common.Equipment),

pkg/demoinfocs/stringtables.go

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ func (p *parser) updatePlayerFromRawIfExists(index int, raw *playerInfo) {
6767
pl.SteamID64 = raw.xuid
6868
pl.IsBot = raw.isFakePlayer
6969

70+
p.gameState.indexPlayerBySteamID(pl)
71+
7072
if nameChanged {
7173
p.eventDispatcher.Dispatch(events.PlayerNameChange{
7274
Player: pl,

pkg/demoinfocs/user_messages.go

+28-17
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55

66
unassert "github.com/markus-wa/go-unassert"
77

8-
common "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/common"
98
events "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/events"
109
msg "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/msg"
1110
)
@@ -60,8 +59,10 @@ func (umh userMessageHandler) sayText(um *msg.CSVCMsg_UserMessage) {
6059
err := st.Unmarshal(um.MsgData)
6160

6261
if err != nil {
63-
umh.dispatch(events.ParserWarn{Message: fmt.Sprintf("failed to decode SayText message: %s", err.Error())})
64-
unassert.Error("failed to decode SayText message: %s", err.Error())
62+
errMsg := fmt.Sprintf("failed to decode SayText message: %s", err.Error())
63+
64+
umh.dispatch(events.ParserWarn{Message: errMsg})
65+
unassert.Error(errMsg)
6566
}
6667

6768
umh.dispatch(events.SayText{
@@ -77,8 +78,10 @@ func (umh userMessageHandler) sayText2(um *msg.CSVCMsg_UserMessage) {
7778
err := st.Unmarshal(um.MsgData)
7879

7980
if err != nil {
80-
umh.dispatch(events.ParserWarn{Message: fmt.Sprintf("failed to decode SayText2 message: %s", err.Error())})
81-
unassert.Error("failed to decode SayText2 message: %s", err.Error())
81+
errMsg := fmt.Sprintf("failed to decode SayText2 message: %s", err.Error())
82+
83+
umh.dispatch(events.ParserWarn{Message: errMsg})
84+
unassert.Error(errMsg)
8285
}
8386

8487
umh.dispatch(events.SayText2{
@@ -110,8 +113,10 @@ func (umh userMessageHandler) sayText2(um *msg.CSVCMsg_UserMessage) {
110113
case "Cstrike_Chat_CT_Dead":
111114

112115
default:
113-
umh.dispatch(events.ParserWarn{Message: fmt.Sprintf("skipped sending ChatMessageEvent for SayText2 with unknown MsgName %q", st.MsgName)})
114-
unassert.Error("skipped sending ChatMessageEvent for SayText2 with unknown MsgName %q", st.MsgName)
116+
errMsg := fmt.Sprintf("skipped sending ChatMessageEvent for SayText2 with unknown MsgName %q", st.MsgName)
117+
118+
umh.dispatch(events.ParserWarn{Message: errMsg})
119+
unassert.Error(errMsg)
115120
}
116121
}
117122

@@ -120,17 +125,21 @@ func (umh userMessageHandler) rankUpdate(um *msg.CSVCMsg_UserMessage) {
120125
err := st.Unmarshal(um.MsgData)
121126

122127
if err != nil {
123-
umh.dispatch(events.ParserWarn{Message: fmt.Sprintf("failed to decode ServerRankUpdate message: %s", err.Error())})
124-
unassert.Error("failed to decode ServerRankUpdate message: %s", err.Error())
128+
errMsg := fmt.Sprintf("failed to decode ServerRankUpdate message: %s", err.Error())
129+
130+
umh.dispatch(events.ParserWarn{Message: errMsg})
131+
unassert.Error(errMsg)
125132
}
126133

127134
for _, v := range st.RankUpdate {
128-
// find player (if he hasn't disconnected already)
129-
var player *common.Player
130-
for _, pl := range umh.parser.gameState.playersByUserID { //nolint:wsl
131-
if pl.SteamID32() == uint32(v.AccountId) {
132-
player = pl
133-
}
135+
// find player (or old instance if he has disconnected already)
136+
steamID32 := uint32(v.AccountId)
137+
player, ok := umh.parser.gameState.playersBySteamID32[steamID32]
138+
if !ok {
139+
errMsg := fmt.Sprintf("rank update for unknown player with SteamID32=%d", steamID32)
140+
141+
umh.dispatch(events.ParserWarn{Message: errMsg})
142+
unassert.Error(errMsg)
134143
}
135144

136145
umh.dispatch(events.RankUpdate{
@@ -149,8 +158,10 @@ func (umh userMessageHandler) roundImpactScoreData(um *msg.CSVCMsg_UserMessage)
149158
err := impactData.Unmarshal(um.MsgData)
150159

151160
if err != nil {
152-
umh.dispatch(events.ParserWarn{Message: fmt.Sprintf("failed to decode RoundImpactScoreData message: %s", err.Error())})
153-
unassert.Error("failed to decode RoundImpactScoreData message: %s", err.Error())
161+
errMsg := fmt.Sprintf("failed to decode RoundImpactScoreData message: %s", err.Error())
162+
163+
umh.dispatch(events.ParserWarn{Message: errMsg})
164+
unassert.Error(errMsg)
154165
}
155166

156167
umh.dispatch(events.RoundImpactScoreData{

pkg/demoinfocs/user_messages_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ func Test_UserMessages_ServerRankUpdate(t *testing.T) {
3636

3737
p := NewParser(new(DevNullReader)).(*parser)
3838

39+
plA := newPlayer()
40+
plB := newPlayer()
41+
p.gameState.playersBySteamID32[123] = plA
42+
p.gameState.playersBySteamID32[456] = plB
43+
3944
var evs []events.RankUpdate
4045
p.RegisterEventHandler(func(update events.RankUpdate) {
4146
evs = append(evs, update)
@@ -49,12 +54,14 @@ func Test_UserMessages_ServerRankUpdate(t *testing.T) {
4954
RankNew: 2,
5055
WinCount: 5,
5156
RankChange: 1,
57+
Player: plA,
5258
}, {
5359
SteamID32: 456,
5460
RankOld: 2,
5561
RankNew: 3,
5662
WinCount: 6,
5763
RankChange: 2,
64+
Player: plB,
5865
}}
5966
assert.Equal(t, expected, evs)
6067
}

0 commit comments

Comments
 (0)