mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 04:55:42 +09:00
fix(voice): stop stale mute echoes from toggling mute (#3268)
This commit is contained in:
1 parent
e218ba21de
commit
c51c222c47
2 files changed
+57
-3
No files matched your search
@@ -265,6 +265,7 @@ describe('shouldApplyGatewayVoiceStateEcho', () => {
|
|||||||
|
|
||||||
it('applies the echo when it matches the pending local write', () => {
|
it('applies the echo when it matches the pending local write', () => {
|
||||||
const snapshot = connectedSnapshot({
|
const snapshot = connectedSnapshot({
|
||||||
|
desiredVoiceState: desired({selfMute: false}),
|
||||||
desiredVoiceStateWrite: {
|
desiredVoiceStateWrite: {
|
||||||
guildId: 'guild-1',
|
guildId: 'guild-1',
|
||||||
channelId: 'channel-1',
|
channelId: 'channel-1',
|
||||||
@@ -279,6 +280,7 @@ describe('shouldApplyGatewayVoiceStateEcho', () => {
|
|||||||
|
|
||||||
it('rejects a stale echo that differs from the pending local write', () => {
|
it('rejects a stale echo that differs from the pending local write', () => {
|
||||||
const snapshot = connectedSnapshot({
|
const snapshot = connectedSnapshot({
|
||||||
|
desiredVoiceState: desired({selfMute: false}),
|
||||||
desiredVoiceStateWrite: {
|
desiredVoiceStateWrite: {
|
||||||
guildId: 'guild-1',
|
guildId: 'guild-1',
|
||||||
channelId: 'channel-1',
|
channelId: 'channel-1',
|
||||||
@@ -290,4 +292,55 @@ describe('shouldApplyGatewayVoiceStateEcho', () => {
|
|||||||
});
|
});
|
||||||
expect(shouldApplyGatewayVoiceStateEcho(snapshot, reported({selfMute: true}))).toBe(false);
|
expect(shouldApplyGatewayVoiceStateEcho(snapshot, reported({selfMute: true}))).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('rejects the echo of a pending write the user has already reverted', () => {
|
||||||
|
const snapshot = connectedSnapshot({
|
||||||
|
selfVoiceState: reported({selfMute: false}),
|
||||||
|
desiredVoiceState: desired({selfMute: false}),
|
||||||
|
desiredVoiceStateWrite: {
|
||||||
|
guildId: 'guild-1',
|
||||||
|
channelId: 'channel-1',
|
||||||
|
selfMute: true,
|
||||||
|
selfDeaf: false,
|
||||||
|
selfVideo: false,
|
||||||
|
selfStream: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(shouldApplyGatewayVoiceStateEcho(snapshot, reported({selfMute: true}))).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('settles on the last intent after a mute and unmute faster than the echo', () => {
|
||||||
|
let snapshot = connectedSnapshot({selfVoiceState: reported({selfMute: false})});
|
||||||
|
const muted = transitionVoiceEngineV2(snapshot, {
|
||||||
|
type: 'gateway.desiredVoiceStateChanged',
|
||||||
|
desired: desired({selfMute: true}),
|
||||||
|
});
|
||||||
|
expect(muted.commands).toMatchObject([{type: 'gateway.voiceState.write', options: {selfMute: true}}]);
|
||||||
|
snapshot = transitionVoiceEngineV2(muted.snapshot, {
|
||||||
|
type: 'gateway.voiceStateWriteSucceeded',
|
||||||
|
operationId: muted.snapshot.gateway.operationId as number,
|
||||||
|
}).snapshot;
|
||||||
|
const unmuted = transitionVoiceEngineV2(snapshot, {
|
||||||
|
type: 'gateway.desiredVoiceStateChanged',
|
||||||
|
desired: desired({selfMute: false}),
|
||||||
|
});
|
||||||
|
expect(unmuted.commands).toEqual([]);
|
||||||
|
snapshot = unmuted.snapshot;
|
||||||
|
|
||||||
|
const staleEcho = reported({selfMute: true});
|
||||||
|
expect(shouldApplyGatewayVoiceStateEcho(snapshot, staleEcho)).toBe(false);
|
||||||
|
snapshot = transitionVoiceEngineV2(snapshot, {type: 'gateway.voiceStateUpdated', voiceState: staleEcho}).snapshot;
|
||||||
|
const corrective = transitionVoiceEngineV2(snapshot, {type: 'gateway.voiceStateReconcileRequested'});
|
||||||
|
expect(corrective.commands).toMatchObject([{type: 'gateway.voiceState.write', options: {selfMute: false}}]);
|
||||||
|
snapshot = transitionVoiceEngineV2(corrective.snapshot, {
|
||||||
|
type: 'gateway.voiceStateWriteSucceeded',
|
||||||
|
operationId: corrective.snapshot.gateway.operationId as number,
|
||||||
|
}).snapshot;
|
||||||
|
|
||||||
|
const finalEcho = reported({selfMute: false});
|
||||||
|
expect(shouldApplyGatewayVoiceStateEcho(snapshot, finalEcho)).toBe(true);
|
||||||
|
snapshot = transitionVoiceEngineV2(snapshot, {type: 'gateway.voiceStateUpdated', voiceState: finalEcho}).snapshot;
|
||||||
|
expect(snapshot.gateway.desiredVoiceStateWrite).toBeNull();
|
||||||
|
expect(transitionVoiceEngineV2(snapshot, {type: 'gateway.voiceStateReconcileRequested'}).commands).toEqual([]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
@@ -226,9 +226,10 @@ export function shouldApplyGatewayVoiceStateEcho(
|
|||||||
): boolean {
|
): boolean {
|
||||||
assert.ok(snapshot != null, 'shouldApplyGatewayVoiceStateEcho snapshot must not be null');
|
assert.ok(snapshot != null, 'shouldApplyGatewayVoiceStateEcho snapshot must not be null');
|
||||||
assert.ok(echo != null, 'shouldApplyGatewayVoiceStateEcho echo must not be null');
|
assert.ok(echo != null, 'shouldApplyGatewayVoiceStateEcho echo must not be null');
|
||||||
const pending = snapshot.gateway.desiredVoiceStateWrite;
|
if (snapshot.gateway.desiredVoiceStateWrite == null) return true;
|
||||||
if (pending == null) return true;
|
const desired = deriveVoiceEngineV2DesiredGatewayVoiceState(snapshot);
|
||||||
return gatewayVoiceStateWriteMatchesReported(pending, echo);
|
if (desired == null) return false;
|
||||||
|
return gatewayVoiceStateWriteMatchesReported(desired, echo);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function gatewayVoiceStateWriteMatchesReported(
|
export function gatewayVoiceStateWriteMatchesReported(
|
||||||
|
|||||||
Reference in new issue
Block a user