summary refs log tree commit diff
path: root/api/src/util
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-09-04 12:18:49 +0200
committerGitHub <noreply@github.com>2021-09-04 12:18:49 +0200
commitbfdd9c10d82760f0cadc2d59aa2b467cdf14b02a (patch)
tree5477dcf75a9abf3d5d5124b319e9251728744fd1 /api/src/util
parent:bug: fix ReadyEventData (diff)
parent:pencil: added comments and updated type (diff)
downloadserver-bfdd9c10d82760f0cadc2d59aa2b467cdf14b02a.tar.xz
Merge pull request #320 from AlTech98/master
Added /guilds/:id/voice-states/ apis, VOICE_SERVER_UPDATE fix
Diffstat (limited to 'api/src/util')
-rw-r--r--api/src/util/VoiceState.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/api/src/util/VoiceState.ts b/api/src/util/VoiceState.ts
new file mode 100644

index 00000000..07022ec9 --- /dev/null +++ b/api/src/util/VoiceState.ts
@@ -0,0 +1,54 @@ +import { Channel, ChannelType, DiscordApiErrors, emitEvent, getPermission, VoiceState, VoiceStateUpdateEvent } from "@fosscord/util"; +import { VoiceStateUpdateSchema } from "../schema"; + + +//TODO need more testing when community guild and voice stage channel are working +export async function updateVoiceState(vsuSchema: VoiceStateUpdateSchema, guildId: string, userId: string, targetUserId?: string) { + const perms = await getPermission(userId, guildId, vsuSchema.channel_id); + + /* + From https://discord.com/developers/docs/resources/guild#modify-current-user-voice-state + You must have the MUTE_MEMBERS permission to unsuppress yourself. You can always suppress yourself. + You must have the REQUEST_TO_SPEAK permission to request to speak. You can always clear your own request to speak. + */ + if (targetUserId !== undefined || (vsuSchema.suppress !== undefined && !vsuSchema.suppress)) { + perms.hasThrow("MUTE_MEMBERS"); + } + if (vsuSchema.request_to_speak_timestamp !== undefined && vsuSchema.request_to_speak_timestamp !== "") { + perms.hasThrow("REQUEST_TO_SPEAK") + } + + if (!targetUserId) { + targetUserId = userId; + } else { + if (vsuSchema.suppress !== undefined && vsuSchema.suppress) + vsuSchema.request_to_speak_timestamp = "" //Need to check if empty string is the right value + } + + //TODO assumed that empty string means clean, need to test if it's right + let voiceState + try { + voiceState = await VoiceState.findOneOrFail({ + guild_id: guildId, + channel_id: vsuSchema.channel_id, + user_id: targetUserId + }); + } catch (error) { + throw DiscordApiErrors.UNKNOWN_VOICE_STATE; + } + + voiceState.assign(vsuSchema); + const channel = await Channel.findOneOrFail({ guild_id: guildId, id: vsuSchema.channel_id }) + if (channel.type !== ChannelType.GUILD_STAGE_VOICE) { + throw DiscordApiErrors.CANNOT_EXECUTE_ON_THIS_CHANNEL_TYPE; + } + + await Promise.all([ + voiceState.save(), + emitEvent({ + event: "VOICE_STATE_UPDATE", + data: voiceState, + guild_id: guildId + } as VoiceStateUpdateEvent)]); + return; +} \ No newline at end of file