First attempt didn't work.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user