From 6599636dbced30339e0541ba44a2707775710e13 Mon Sep 17 00:00:00 2001 From: Ayyan Date: Tue, 26 Jan 2021 19:20:06 +0400 Subject: [PATCH] feat(handlers): add Membership Screening (#449) * feat(handlers): support membership screening feature * s --- src/api/handlers/guild.ts | 68 +++++++++++++++++++++++++++++++++++++++ src/types/guild.ts | 30 ++++++++++++++++- src/util/constants.ts | 2 ++ 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/src/api/handlers/guild.ts b/src/api/handlers/guild.ts index ce40a2110..9757dd2d6 100644 --- a/src/api/handlers/guild.ts +++ b/src/api/handlers/guild.ts @@ -26,6 +26,8 @@ import { ImageSize, Intents, MemberCreatePayload, + MembershipScreeningFieldTypes, + MembershipScreeningPayload, Overwrite, PositionSwap, PruneOptions, @@ -1021,3 +1023,69 @@ export async function editGuildTemplate( return structures.createTemplate(template); } + +function createMembershipObj( + { form_fields: formFields, ...props }: MembershipScreeningPayload, +) { + return { + ...props, + formFields: formFields.map(({ field_type, ...rest }) => ({ + ...rest, + fieldType: field_type, + })), + }; +} + +export type MembershipScreening = ReturnType; + +/** Get the membership screening form of a guild. */ +export async function getGuildMembershipScreeningForm(guildID: string) { + const membershipScreeningPayload = await RequestManager.get( + endpoints.GUILD_MEMBER_VERIFICATION(guildID), + ) as MembershipScreeningPayload; + + return createMembershipObj(membershipScreeningPayload); +} + +/** Edit the guild's Membership Screening form. Requires the `MANAGE_GUILD` permission. */ +export async function editGuildMembershipScreeningForm( + guildID: string, + options?: EditGuildMembershipScreeningForm, +) { + const membershipScreeningFormPayload = await RequestManager.patch( + endpoints.GUILD_MEMBER_VERIFICATION(guildID), + { + ...options, + form_fields: JSON.stringify( + options?.formFields?.map(({ fieldType, ...props }) => ({ + ...props, + field_type: fieldType, + })), + ), + }, + ) as MembershipScreeningPayload; + + return createMembershipObj( + membershipScreeningFormPayload, + ); +} + +export interface EditGuildMembershipScreeningForm { + /** whether Membership Screening is enabled */ + enabled?: boolean; + /** array of field objects */ + formFields?: MembershipScreeningField[]; + /** the steps in the screening form */ + description?: string; +} + +export interface MembershipScreeningField { + /** the type of field */ + fieldType: MembershipScreeningFieldTypes; + /** the title of the field */ + label: string; + /** the list of rules */ + values?: string[]; + /** whether the user has to fill out this field */ + required: boolean; +} diff --git a/src/types/guild.ts b/src/types/guild.ts index 33d723165..9b43877b7 100644 --- a/src/types/guild.ts +++ b/src/types/guild.ts @@ -174,7 +174,11 @@ export type GuildFeatures = | "DISCOVERABLE" | "FEATURABLE" | "ANIMATED_ICON" - | "BANNER"; + | "BANNER" + /** guild has enabled Membership Screening */ + | "MEMBER_VERIFICATION_GATE_ENABLED" + /** guild can be previewed before joining via Membership Screening or the directory */ + | "PREVIEW_ENABLED"; export interface VoiceRegion { /** unique ID for the region */ @@ -675,3 +679,27 @@ export interface EditGuildTemplate { /** description for the template (0-120 characters) */ description?: string | null; } + +export interface MembershipScreeningPayload { + /** when the fields were last updated */ + version: string; + /** the steps in the screening form */ + form_fields: MembershipScreeningFieldPayload[]; + /** the server description shown in the screening form */ + description: string | null; +} + +export interface MembershipScreeningFieldPayload { + /** the type of field */ + field_type: MembershipScreeningFieldTypes; + /** the title of the field */ + label: string; + /** the list of rules */ + values?: string[]; + /** whether the user has to fill out this field */ + required: boolean; +} + +export type MembershipScreeningFieldTypes = + /** Server Rules */ + "TERMS"; diff --git a/src/util/constants.ts b/src/util/constants.ts index afad4433c..c48fc2e03 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -116,6 +116,8 @@ export const endpoints = { `${baseEndpoints.BASE_URL}/guilds/templates/${code}`, GUILD_TEMPLATES: (guildID: string) => `${GUILDS_BASE(guildID)}/templates`, GUILD_PREVIEW: (guildID: string) => `${GUILDS_BASE(guildID)}/preview`, + GUILD_MEMBER_VERIFICATION: (guildID: string) => + `${GUILDS_BASE(guildID)}/member-verification`, // Voice VOICE_REGIONS: `${baseEndpoints.BASE_URL}/voice/regions`,