feat!: Add invite flags for guest invites (#4237)

* sort GuildFeatures

* Add invite flags for guest invites

* fix desired props type error
This commit is contained in:
Fleny
2025-07-12 09:42:21 +02:00
committed by GitHub
parent 03734ea6a1
commit 76e64ce748
7 changed files with 35 additions and 6 deletions

View File

@@ -480,6 +480,7 @@ export function createDesiredPropertiesObject<T extends RecursivePartial<Transfo
guildScheduledEvent: defaultValue,
stageInstance: defaultValue,
expiresAt: defaultValue,
flags: defaultValue,
...desiredProperties.invite,
},
member: {

View File

@@ -1,5 +1,5 @@
import type { DiscordApplication, DiscordInviteCreate, DiscordInviteMetadata } from '@discordeno/types'
import { type InternalBot, type Invite, isInviteWithMetadata } from '../index.js'
import { type InternalBot, type Invite, ToggleBitfield, isInviteWithMetadata } from '../index.js'
export function transformInvite(
bot: InternalBot,
@@ -42,6 +42,7 @@ export function transformInvite(
if (props.expiresAt && payload.invite.expires_at) {
invite.expiresAt = Date.parse(payload.invite.expires_at)
}
if (props.flags && payload.invite.flags) invite.flags = new ToggleBitfield(payload.invite.flags)
} else {
if (props.channelId && payload.invite.channel_id) invite.channelId = bot.transformers.snowflake(payload.invite.channel_id)
if (props.guildId && payload.invite.guild_id) invite.guildId = bot.transformers.snowflake(payload.invite.guild_id)

View File

@@ -26,7 +26,7 @@ export function transformMemberToDiscordMember(bot: InternalBot, payload: Member
return {
nick: payload.nick ?? undefined,
roles: payload.roles.map((id) => 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(),

View File

@@ -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')

View File

@@ -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. */

View File

@@ -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. */

View File

@@ -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 */