Files
fluxer/fluxer_app/src/features/voice/engine/VoiceEffectiveAudioState.ts
T

66 lines
2.1 KiB
TypeScript

// SPDX-License-Identifier: AGPL-3.0-or-later
import {
getVoiceConnectionContextFromMediaEngine,
getVoiceStateByConnectionIdFromMediaEngine,
} from '@app/features/voice/engine/VoiceMediaEngineBridge';
import LocalVoiceState from '@app/features/voice/state/LocalVoiceState';
import {isVoicePermissionMuteActive} from '@app/features/voice/utils/VoicePermissionUtils';
export interface EffectiveAudioState {
selfMute: boolean;
selfDeaf: boolean;
serverMute: boolean;
serverDeaf: boolean;
effectiveMute: boolean;
effectiveDeaf: boolean;
}
interface ComputeEffectiveAudioStateParams {
selfMute: boolean;
selfDeaf: boolean;
serverMute?: boolean;
serverDeaf?: boolean;
}
interface EffectiveAudioStateOptions {
connectionId?: string | null;
selfMute?: boolean;
selfDeaf?: boolean;
serverMute?: boolean;
serverDeaf?: boolean;
}
export function computeEffectiveAudioState(params: ComputeEffectiveAudioStateParams): EffectiveAudioState {
const serverMute = params.serverMute ?? false;
const serverDeaf = params.serverDeaf ?? false;
return {
selfMute: params.selfMute,
selfDeaf: params.selfDeaf,
serverMute,
serverDeaf,
effectiveMute: serverMute || serverDeaf || params.selfMute || params.selfDeaf,
effectiveDeaf: serverDeaf || params.selfDeaf,
};
}
export function getEffectiveAudioState(options?: EffectiveAudioStateOptions): EffectiveAudioState {
const selfMute = options?.selfMute ?? LocalVoiceState.getSelfMute();
const selfDeaf = options?.selfDeaf ?? LocalVoiceState.getSelfDeaf();
const connectionContext = getVoiceConnectionContextFromMediaEngine();
const connectionId = options?.connectionId ?? connectionContext?.connectionId;
const serverVoiceState = getVoiceStateByConnectionIdFromMediaEngine(connectionId);
const permissionMuted = isVoicePermissionMuteActive(
serverVoiceState,
connectionContext?.guildId,
connectionContext?.channelId,
);
const serverMute = options?.serverMute ?? serverVoiceState?.mute ?? false;
return computeEffectiveAudioState({
selfMute,
selfDeaf,
serverMute: serverMute || permissionMuted,
serverDeaf: options?.serverDeaf ?? serverVoiceState?.deaf ?? false,
});
}