hide private voice state tokens from whole guild

This commit is contained in:
dank074 2025-04-25 00:28:49 -05:00
parent bbcd690620
commit bf8a88d07b
7 changed files with 51 additions and 10 deletions

View File

@ -93,7 +93,7 @@ router.patch(
voice_state.save(), voice_state.save(),
emitEvent({ emitEvent({
event: "VOICE_STATE_UPDATE", event: "VOICE_STATE_UPDATE",
data: voice_state, data: voice_state.toPublicVoiceState(),
guild_id, guild_id,
} as VoiceStateUpdateEvent), } as VoiceStateUpdateEvent),
]); ]);

View File

@ -490,7 +490,9 @@ export async function onIdentify(this: WebSocket, data: Payload) {
guilds.filter((guild) => !guild.unavailable) as Guild[] guilds.filter((guild) => !guild.unavailable) as Guild[]
).map((guild) => { ).map((guild) => {
return { return {
voice_states: guild.voice_states, voice_states: guild.voice_states.map((state) =>
state.toPublicVoiceState(),
),
id: guild.id, id: guild.id,
embedded_activities: [], embedded_activities: [],
}; };

View File

@ -120,7 +120,7 @@ export async function onStreamCreate(this: WebSocket, data: Payload) {
await emitEvent({ await emitEvent({
event: "VOICE_STATE_UPDATE", event: "VOICE_STATE_UPDATE",
data: { ...voiceState }, data: voiceState.toPublicVoiceState(),
guild_id: voiceState.guild_id, guild_id: voiceState.guild_id,
channel_id: voiceState.channel_id, channel_id: voiceState.channel_id,
} as VoiceStateUpdateEvent); } as VoiceStateUpdateEvent);

View File

@ -59,7 +59,7 @@ export async function onStreamDelete(this: WebSocket, data: Payload) {
await emitEvent({ await emitEvent({
event: "VOICE_STATE_UPDATE", event: "VOICE_STATE_UPDATE",
data: { ...voiceState }, data: voiceState.toPublicVoiceState(),
guild_id: guildId, guild_id: guildId,
channel_id: channelId, channel_id: channelId,
} as VoiceStateUpdateEvent); } as VoiceStateUpdateEvent);

View File

@ -68,7 +68,7 @@ export async function onVoiceStateUpdate(this: WebSocket, data: Payload) {
) { ) {
await emitEvent({ await emitEvent({
event: "VOICE_STATE_UPDATE", event: "VOICE_STATE_UPDATE",
data: { ...voiceState, channel_id: null }, data: { ...voiceState.toPublicVoiceState(), channel_id: null },
guild_id: voiceState.guild_id, guild_id: voiceState.guild_id,
}); });
} }
@ -96,7 +96,11 @@ export async function onVoiceStateUpdate(this: WebSocket, data: Payload) {
) { ) {
await emitEvent({ await emitEvent({
event: "VOICE_STATE_UPDATE", event: "VOICE_STATE_UPDATE",
data: { ...voiceState, channel_id: null, guild_id: null }, data: {
...voiceState.toPublicVoiceState(),
channel_id: null,
guild_id: null,
},
guild_id: prevState?.guild_id, guild_id: prevState?.guild_id,
channel_id: prevState?.channel_id, channel_id: prevState?.channel_id,
}); });
@ -117,13 +121,16 @@ export async function onVoiceStateUpdate(this: WebSocket, data: Payload) {
voiceState.token = genVoiceToken(); voiceState.token = genVoiceToken();
voiceState.session_id = this.session_id; voiceState.session_id = this.session_id;
const { id, member, ...newObj } = voiceState; const { member } = voiceState;
await Promise.all([ await Promise.all([
voiceState.save(), voiceState.save(),
emitEvent({ emitEvent({
event: "VOICE_STATE_UPDATE", event: "VOICE_STATE_UPDATE",
data: { ...newObj, member: member?.toPublicMember() }, data: {
...voiceState.toPublicVoiceState(),
member: member?.toPublicMember(),
},
guild_id: voiceState.guild_id, guild_id: voiceState.guild_id,
channel_id: voiceState.channel_id, channel_id: voiceState.channel_id,
user_id: voiceState.user_id, user_id: voiceState.user_id,

View File

@ -24,6 +24,29 @@ import { Member } from "./Member";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database"; import { dbEngine } from "../util/Database";
export enum PublicVoiceStateEnum {
user_id,
suppress,
session_id,
self_video,
self_mute,
self_deaf,
self_stream,
request_to_speak_timestamp,
mute,
deaf,
channel_id,
guild_id,
}
export type PublicVoiceStateKeys = keyof typeof PublicVoiceStateEnum;
export const PublicVoiceStateProjection = Object.values(
PublicVoiceStateEnum,
).filter((x) => typeof x === "string") as PublicVoiceStateKeys[];
export type PublicVoiceState = Pick<VoiceState, PublicVoiceStateKeys>;
//https://gist.github.com/vassjozsef/e482c65df6ee1facaace8b3c9ff66145#file-voice_state-ex //https://gist.github.com/vassjozsef/e482c65df6ee1facaace8b3c9ff66145#file-voice_state-ex
@Entity({ @Entity({
name: "voice_states", name: "voice_states",
@ -96,4 +119,13 @@ export class VoiceState extends BaseClass {
@Column({ nullable: true, default: null }) @Column({ nullable: true, default: null })
request_to_speak_timestamp?: Date; request_to_speak_timestamp?: Date;
toPublicVoiceState() {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const voiceState: any = {};
PublicVoiceStateProjection.forEach((x) => {
voiceState[x] = this[x];
});
return voiceState as PublicVoiceState;
}
} }

View File

@ -21,7 +21,6 @@ import {
ConnectedAccount, ConnectedAccount,
Interaction, Interaction,
ApplicationCommand, ApplicationCommand,
VoiceState,
Message, Message,
PartialEmoji, PartialEmoji,
Invite, Invite,
@ -43,6 +42,7 @@ import {
ReadyPrivateChannel, ReadyPrivateChannel,
GuildOrUnavailable, GuildOrUnavailable,
GuildCreateResponse, GuildCreateResponse,
PublicVoiceState,
} from "@spacebar/util"; } from "@spacebar/util";
export interface Event { export interface Event {
@ -431,7 +431,7 @@ export interface UserConnectionsUpdateEvent extends Event {
export interface VoiceStateUpdateEvent extends Event { export interface VoiceStateUpdateEvent extends Event {
event: "VOICE_STATE_UPDATE"; event: "VOICE_STATE_UPDATE";
data: VoiceState & { data: PublicVoiceState & {
member: PublicMember; member: PublicMember;
}; };
} }