From 76e64ce74828d49b3bbceeaaf564e20b3aba52d6 Mon Sep 17 00:00:00 2001 From: Fleny Date: Sat, 12 Jul 2025 09:42:21 +0200 Subject: [PATCH] feat!: Add invite flags for guest invites (#4237) * sort GuildFeatures * Add invite flags for guest invites * fix desired props type error --- packages/bot/src/desiredProperties.ts | 1 + packages/bot/src/transformers/invite.ts | 3 ++- packages/bot/src/transformers/reverse/member.ts | 2 +- packages/bot/src/transformers/toggles/guild.ts | 10 +++++++++- packages/bot/src/transformers/types.ts | 4 +++- packages/types/src/discord/guild.ts | 9 +++++++-- packages/types/src/discord/invite.ts | 12 ++++++++++++ 7 files changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/bot/src/desiredProperties.ts b/packages/bot/src/desiredProperties.ts index e96eebb05..b269ce3b4 100644 --- a/packages/bot/src/desiredProperties.ts +++ b/packages/bot/src/desiredProperties.ts @@ -480,6 +480,7 @@ export function createDesiredPropertiesObject id.toString()), - joined_at: new Date(payload.joinedAt).toISOString(), + joined_at: payload.joinedAt ? new Date(payload.joinedAt).toISOString() : null, premium_since: payload.premiumSince ? new Date(payload.premiumSince).toISOString() : undefined, avatar: payload.avatar ? iconBigintToHash(payload.avatar) : undefined, permissions: payload.permissions?.toString(), diff --git a/packages/bot/src/transformers/toggles/guild.ts b/packages/bot/src/transformers/toggles/guild.ts index 1f865791e..6d289c823 100644 --- a/packages/bot/src/transformers/toggles/guild.ts +++ b/packages/bot/src/transformers/toggles/guild.ts @@ -30,6 +30,7 @@ const featureNames = [ 'verified', 'vipRegions', 'welcomeScreenEnabled', + 'guestsEnabled', 'enhancedRoleColors', ] as const @@ -46,7 +47,6 @@ export const GuildToggle = { premiumProgressBarEnabled: 1n << 4n, // GUILD FEATURES ARE BELOW THIS - // MISSING VALUES IN THE BITFIELD: 36+ /** Whether the guild has access to set an animated guild banner image */ animatedBanner: 1n << 11n, @@ -106,6 +106,8 @@ export const GuildToggle = { vipRegions: 1n << 6n, /** Whether the guild has enabled the welcome screen */ welcomeScreenEnabled: 1n << 18n, + /** Whether the guild has access to guest invites */ + guestsEnabled: 1n << 26n, /** Whether the guild is able to set gradient colors to roles */ enhancedRoleColors: 1n << 35n, } @@ -155,6 +157,7 @@ export class GuildToggles extends ToggleBitfieldBigint { if (guild.features.includes(GuildFeatures.Verified)) this.add(GuildToggle.verified) if (guild.features.includes(GuildFeatures.VipRegions)) this.add(GuildToggle.vipRegions) if (guild.features.includes(GuildFeatures.WelcomeScreenEnabled)) this.add(GuildToggle.welcomeScreenEnabled) + if (guild.features.includes(GuildFeatures.GuestsEnabled)) this.add(GuildToggle.guestsEnabled) if (guild.features.includes(GuildFeatures.EnhancedRoleColors)) this.add(GuildToggle.enhancedRoleColors) } } @@ -341,6 +344,11 @@ export class GuildToggles extends ToggleBitfieldBigint { return this.has('soundboard') } + /** Whether the guild has access to guest invites */ + get guestsEnabled(): boolean { + return this.has('guestsEnabled') + } + /** Whether the guild is able to set gradient colors to roles */ get enhancedRoleColors(): boolean { return this.has('enhancedRoleColors') diff --git a/packages/bot/src/transformers/types.ts b/packages/bot/src/transformers/types.ts index 6f986407d..e85deaff2 100644 --- a/packages/bot/src/transformers/types.ts +++ b/packages/bot/src/transformers/types.ts @@ -1081,6 +1081,8 @@ export interface Invite { guildScheduledEvent?: ScheduledEvent /** Approximate count of online members (only present when target_user is set) */ approximatePresenceCount?: number + /** Guild invite flags for guild invites. */ + flags?: ToggleBitfield } export interface Member { @@ -1106,7 +1108,7 @@ export interface Member { /** Array of role object ids */ roles: bigint[] /** When the user joined the guild */ - joinedAt: number + joinedAt?: number /** When the user started boosting the guild */ premiumSince?: number /** The permissions this member has in the guild. Only present on interaction events. */ diff --git a/packages/types/src/discord/guild.ts b/packages/types/src/discord/guild.ts index d016c7488..d4601717f 100644 --- a/packages/types/src/discord/guild.ts +++ b/packages/types/src/discord/guild.ts @@ -260,6 +260,8 @@ export enum GuildFeatures { VipRegions = 'VIP_REGIONS', /** Guild has enabled the welcome screen */ WelcomeScreenEnabled = 'WELCOME_SCREEN_ENABLED', + /** Guild has access to guest invites */ + GuestsEnabled = 'GUESTS_ENABLED', /** Guild is able to set gradient colors to roles */ EnhancedRoleColors = 'ENHANCED_ROLE_COLORS', } @@ -340,8 +342,11 @@ export interface DiscordMember { banner?: string /** Array of role object ids */ roles: string[] - /** When the user joined the guild */ - joined_at: string + /** + * When the user joined the guild + * @remarks Member objects retrieved from `VOICE_STATE_UPDATE` events will have `joined_at` set as `null` if the member was invited as a guest. + */ + joined_at: string | null /** When the user started boosting the guild */ premium_since?: string | null /** The permissions this member has in the guild. Only present on interaction events and OAuth2 current member fetch. */ diff --git a/packages/types/src/discord/invite.ts b/packages/types/src/discord/invite.ts index 7d90c9d76..fbcd51407 100644 --- a/packages/types/src/discord/invite.ts +++ b/packages/types/src/discord/invite.ts @@ -34,6 +34,12 @@ export interface DiscordInvite { stage_instance?: DiscordInviteStageInstance /** guild scheduled event data */ guild_scheduled_event?: DiscordScheduledEvent + /** + * Guild invite flags for guild invites. + * + * @see {@link DiscordGuildInviteFlags} + */ + flags?: number } /** https://discord.com/developers/docs/resources/invite#invite-object-invite-types */ @@ -49,6 +55,12 @@ export enum TargetTypes { EmbeddedApplication, } +/** https://discord.com/developers/docs/resources/invite#invite-object-guild-invite-flags */ +export enum DiscordGuildInviteFlags { + /** This invite is a guest invite for a voice channel */ + isGuestInvite = 1 << 0, +} + /** https://discord.com/developers/docs/resources/invite#invite-metadata-object-invite-metadata-structure */ export interface DiscordInviteMetadata extends DiscordInvite { /** Number of times this invite has been used */