From 82440b7670098e507a598af03d43374d027096e9 Mon Sep 17 00:00:00 2001 From: "Brandon McGinty (chatgpt)" Date: Sun, 9 Aug 2026 14:21:52 -0400 Subject: [PATCH] Use server counters for user statistics --- gumble/gumble/handlers.go | 6 ++--- gumble/gumble/userstats_regression_test.go | 26 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 gumble/gumble/userstats_regression_test.go diff --git a/gumble/gumble/handlers.go b/gumble/gumble/handlers.go index 9445314..0e14d83 100644 --- a/gumble/gumble/handlers.go +++ b/gumble/gumble/handlers.go @@ -1239,13 +1239,13 @@ func (c *Client) handleUserStats(buffer []byte) error { if packet.FromServer.Good != nil { stats.FromServer.Good = *packet.FromServer.Good } - if packet.FromClient.Late != nil { + if packet.FromServer.Late != nil { stats.FromServer.Late = *packet.FromServer.Late } - if packet.FromClient.Lost != nil { + if packet.FromServer.Lost != nil { stats.FromServer.Lost = *packet.FromServer.Lost } - if packet.FromClient.Resync != nil { + if packet.FromServer.Resync != nil { stats.FromServer.Resync = *packet.FromServer.Resync } } diff --git a/gumble/gumble/userstats_regression_test.go b/gumble/gumble/userstats_regression_test.go new file mode 100644 index 0000000..4367b64 --- /dev/null +++ b/gumble/gumble/userstats_regression_test.go @@ -0,0 +1,26 @@ +package gumble + +import ( + "testing" + + "git.stormux.org/storm/barnard/gumble/gumble/MumbleProto" + "google.golang.org/protobuf/proto" +) + +// Regression: FromServer loss counters were accidentally copied from +// FromClient, hiding the server-to-client packet-loss condition. +func TestUserStatsUsesFromServerCounters(t *testing.T) { + c := &Client{Config: NewConfig(), Users: make(Users)} + u := c.Users.create(7) + session := uint32(7) + clientLate, serverLate := uint32(1), uint32(9) + data, _ := proto.Marshal(&MumbleProto.UserStats{Session: &session, + FromClient: &MumbleProto.UserStats_Stats{Late: &clientLate}, + FromServer: &MumbleProto.UserStats_Stats{Late: &serverLate}}) + if err := c.handleUserStats(data); err != nil { + t.Fatal(err) + } + if u.Stats.FromServer.Late != serverLate { + t.Fatalf("got %d, want %d", u.Stats.FromServer.Late, serverLate) + } +}