Attempt to improve over all voice code.

This commit is contained in:
Storm Dragon
2026-08-11 19:47:01 -04:00
parent 30a02eba14
commit eae1d8b99a
17 changed files with 1198 additions and 130 deletions
+142
View File
@@ -144,3 +144,145 @@ func TestUpdateUserChannel(t *testing.T) {
t.Fatalf("expected disconnected user channel to be removed, got %#v", got)
}
}
func TestUserAudioChangeNotification(t *testing.T) {
current := &gumble.Channel{ID: 1, Name: "Current"}
other := &gumble.Channel{ID: 2, Name: "Other"}
self := &gumble.User{Session: 1, Name: "Username", Channel: current}
tests := []struct {
name string
user *gumble.User
previous userAudioState
remember bool
change gumble.UserChangeType
want userChangeNotification
wantOK bool
}{
{
name: "user mutes themselves",
user: &gumble.User{Session: 2, Name: "Guest", Channel: current, SelfMuted: true},
remember: true,
change: gumble.UserChangeAudio,
want: userChangeNotification{
event: "mute",
who: "Guest",
what: "Current",
line: "Guest muted themselves",
},
wantOK: true,
},
{
name: "user unmutes themselves",
user: &gumble.User{Session: 2, Name: "Guest", Channel: current},
previous: userAudioState{selfMuted: true},
remember: true,
change: gumble.UserChangeAudio,
want: userChangeNotification{
event: "unmute",
who: "Guest",
what: "Current",
line: "Guest unmuted themselves",
},
wantOK: true,
},
{
name: "deafen takes precedence over implied mute",
user: &gumble.User{Session: 2, Name: "Guest", Channel: current, SelfMuted: true, SelfDeafened: true},
remember: true,
change: gumble.UserChangeAudio,
want: userChangeNotification{
event: "deafen",
who: "Guest",
what: "Current",
line: "Guest deafened themselves",
},
wantOK: true,
},
{
name: "undeafen takes precedence over implied unmute",
user: &gumble.User{Session: 2, Name: "Guest", Channel: current},
previous: userAudioState{selfMuted: true, selfDeafened: true},
remember: true,
change: gumble.UserChangeAudio,
want: userChangeNotification{
event: "undeafen",
who: "Guest",
what: "Current",
line: "Guest undeafened themselves",
},
wantOK: true,
},
{
name: "self mute uses self wording",
user: &gumble.User{Session: 1, Name: "Username", Channel: current, SelfMuted: true},
remember: true,
change: gumble.UserChangeAudio,
want: userChangeNotification{
event: "mute",
who: "me",
what: "Current",
line: "You muted yourself",
},
wantOK: true,
},
{
name: "other channel is ignored",
user: &gumble.User{Session: 2, Name: "Guest", Channel: other, SelfMuted: true},
remember: true,
change: gumble.UserChangeAudio,
},
{
name: "initial state is remembered without notification",
user: &gumble.User{Session: 2, Name: "Guest", Channel: current, SelfMuted: true},
change: gumble.UserChangeConnected | gumble.UserChangeAudio,
},
{
name: "unrelated user change is ignored",
user: &gumble.User{Session: 2, Name: "Guest", Channel: current, SelfMuted: true},
remember: true,
change: gumble.UserChangeComment,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := &Barnard{
Client: &gumble.Client{Self: self},
}
if tt.remember {
b.userAudioStates = map[uint32]userAudioState{tt.user.Session: tt.previous}
}
got, ok := b.userAudioChangeNotification(&gumble.UserChangeEvent{
Client: b.Client,
Type: tt.change,
User: tt.user,
})
if ok != tt.wantOK {
t.Fatalf("expected ok %v, got %v", tt.wantOK, ok)
}
if got != tt.want {
t.Fatalf("expected %#v, got %#v", tt.want, got)
}
})
}
}
func TestUpdateUserAudioState(t *testing.T) {
user := &gumble.User{Session: 2, SelfMuted: true, SelfDeafened: true}
b := &Barnard{}
b.updateUserAudioState(&gumble.UserChangeEvent{User: user})
if got := b.userAudioStates[user.Session]; got != (userAudioState{selfMuted: true, selfDeafened: true}) {
t.Fatalf("unexpected remembered audio state: %#v", got)
}
b.updateUserAudioState(&gumble.UserChangeEvent{
Type: gumble.UserChangeDisconnected,
User: user,
})
if _, ok := b.userAudioStates[user.Session]; ok {
t.Fatal("expected disconnected user audio state to be removed")
}
}