First attempt didn't work.

This commit is contained in:
Storm Dragon
2026-09-06 01:13:31 -04:00
parent 2b5fe91d6c
commit 4ef8553c7d
6 changed files with 79 additions and 120 deletions
+5
View File
@@ -94,6 +94,11 @@ type UserChangeEvent struct {
Type UserChangeType
User *User
Actor *User
// SelfMute and SelfDeaf preserve the optional fields from the UserState
// packet. A nil pointer means the server did not include that state in
// this update.
SelfMute *bool
SelfDeaf *bool
String string
}
+2
View File
@@ -752,12 +752,14 @@ func (c *Client) handleUserState(buffer []byte) error {
user.Suppressed = *packet.Suppress
}
if packet.SelfMute != nil {
event.SelfMute = packet.SelfMute
if *packet.SelfMute != user.SelfMuted {
event.Type |= UserChangeAudio
}
user.SelfMuted = *packet.SelfMute
}
if packet.SelfDeaf != nil {
event.SelfDeaf = packet.SelfDeaf
if *packet.SelfDeaf != user.SelfDeafened {
event.Type |= UserChangeAudio
}
+43
View File
@@ -26,3 +26,46 @@ func TestUserStateUnknownChannelDoesNotDeadlock(t *testing.T) {
t.Fatal("volatile lock was left locked")
}
}
type userStateListener struct {
EventListener
event *UserChangeEvent
}
func (l *userStateListener) OnUserChange(event *UserChangeEvent) {
l.event = event
}
func TestUserStateEventPreservesSelfMuteAndDeafFields(t *testing.T) {
channel := &Channel{ID: 0, Users: make(Users)}
c := &Client{
Config: NewConfig(),
Users: make(Users),
Channels: Channels{0: channel},
state: uint32(StateSynced),
}
user := c.Users.create(1)
user.Channel = channel
channel.Users[user.Session] = user
listener := &userStateListener{}
c.Config.Attach(listener)
session, selfMute, selfDeaf := uint32(1), true, false
data, err := proto.Marshal(&MumbleProto.UserState{
Session: &session,
SelfMute: &selfMute,
SelfDeaf: &selfDeaf,
})
if err != nil {
t.Fatal(err)
}
if err := c.handleUserState(data); err != nil {
t.Fatal(err)
}
if listener.event == nil || listener.event.SelfMute == nil || listener.event.SelfDeaf == nil {
t.Fatalf("self state fields were not preserved: %#v", listener.event)
}
if !*listener.event.SelfMute || *listener.event.SelfDeaf {
t.Fatalf("unexpected self state values: mute=%t deaf=%t", *listener.event.SelfMute, *listener.event.SelfDeaf)
}
}