feat: api docs catchup part 2 (#3266)

* add guild safety | closes #3020

* Adds approx guild count | closes #3078

* Team member permissions | closes #3105

According to current documentation DiscordTeamMemberRole#Owner does not have a value anymore, in this commit it still had so it is included to be changed by a later commit

* Default thread ratelimit | closes #3216

* Entitlements and SKUs | closes #3219

The entitlements events needs testing for the typing

* Typing endpoint docs update | closes #3222

* Add guildScheduledEventId to CreateStageInstance | closes #3228

* Add listSkus helper

I did forget it in the commit before

* Update Application Endpoints | closes #3230

* Update documentation | closes #3233

* fix starting a thread in forum | closes #3234 & closes #3036

* Add fired events on get widget endpoint | closes #3235

* Add fired events on get widget endpoint pt2 | closes #3236

* Update SKU and Entitlement fields | closes #3238

* Split permissions for expressions and events | closes #3249

* Make GetEntitlements#excludeEnded more specific | closes #3251

* Fix thread/forum channel docs regression | closes #3252

* Another description change for GetEntitlements#excludeEnded | closes #3253

* Document applied_tags on Execute Webhook | closes #3265

* Fix entitlement event types
This commit is contained in:
Fleny
2023-12-06 16:18:29 +00:00
committed by GitHub
parent 81586743f7
commit 0af084d932
26 changed files with 676 additions and 104 deletions
+4
View File
@@ -13,6 +13,7 @@ import type { AutoModerationActionExecution } from './transformers/automodAction
import type { AutoModerationRule } from './transformers/automodRule.js'
import type { Channel } from './transformers/channel.js'
import type { Emoji } from './transformers/emoji.js'
import { type Entitlement } from './transformers/entitlement.js'
import type { Guild } from './transformers/guild.js'
import type { Integration } from './transformers/integration.js'
import type { Interaction } from './transformers/interaction.js'
@@ -225,4 +226,7 @@ export interface EventHandlers {
webhooksUpdate: (payload: { channelId: bigint; guildId: bigint }) => unknown
botUpdate: (user: User) => unknown
typingStart: (payload: { guildId: bigint | undefined; channelId: bigint; userId: bigint; timestamp: number; member: Member | undefined }) => unknown
entitlementCreate: (entitlement: Entitlement) => unknown
entitlementUpdate: (entitlement: Entitlement) => unknown
entitlementDelete: (entitlement: Entitlement) => unknown
}
+3
View File
@@ -66,6 +66,9 @@ export function createBotGatewayHandlers(
VOICE_SERVER_UPDATE: options.VOICE_SERVER_UPDATE ?? handlers.handleVoiceServerUpdate,
VOICE_STATE_UPDATE: options.VOICE_STATE_UPDATE ?? handlers.handleVoiceStateUpdate,
WEBHOOKS_UPDATE: options.WEBHOOKS_UPDATE ?? handlers.handleWebhooksUpdate,
ENTITLEMENT_CREATE: options.ENTITLEMENT_CREATE ?? handlers.handleEntitlementCreate,
ENTITLEMENT_UPDATE: options.ENTITLEMENT_UPDATE ?? handlers.handleEntitlementUpdate,
ENTITLEMENT_DELETE: options.ENTITLEMENT_DELETE ?? handlers.handleEntitlementDelete,
}
}
@@ -0,0 +1,9 @@
import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types'
import type { Bot } from '../../bot.js'
export async function handleEntitlementCreate(bot: Bot, data: DiscordGatewayPayload): Promise<void> {
if (!bot.events.entitlementCreate) return
const payload = data.d as DiscordEntitlement
bot.events.entitlementCreate(bot.transformers.entitlement(bot, payload))
}
@@ -0,0 +1,9 @@
import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types'
import type { Bot } from '../../bot.js'
export async function handleEntitlementDelete(bot: Bot, data: DiscordGatewayPayload): Promise<void> {
if (!bot.events.entitlementDelete) return
const payload = data.d as DiscordEntitlement
bot.events.entitlementDelete(bot.transformers.entitlement(bot, payload))
}
@@ -0,0 +1,9 @@
import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types'
import type { Bot } from '../../bot.js'
export async function handleEntitlementUpdate(bot: Bot, data: DiscordGatewayPayload): Promise<void> {
if (!bot.events.entitlementUpdate) return
const payload = data.d as DiscordEntitlement
bot.events.entitlementUpdate(bot.transformers.entitlement(bot, payload))
}
@@ -0,0 +1,3 @@
export * from './ENTITLEMENT_CREATE.js'
export * from './ENTITLEMENT_DELETE.js'
export * from './ENTITLEMENT_UPDATE.js'
+1
View File
@@ -1,5 +1,6 @@
export * from './channels/index.js'
export * from './emojis/index.js'
export * from './entitlements/index.js'
export * from './guilds/index.js'
export * from './integrations/index.js'
export * from './interactions/index.js'
@@ -1,8 +1,8 @@
import type { DiscordGatewayPayload, DiscordInviteCreate } from '@discordeno/types'
import type { Bot } from '../../index.js'
export async function handleInviteCreate(bot: Bot, data: DiscordGatewayPayload): Promise<void> {
export async function handleInviteCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise<void> {
if (!bot.events.inviteCreate) return
bot.events.inviteCreate(bot.transformers.invite(bot, data.d as DiscordInviteCreate))
bot.events.inviteCreate(bot.transformers.invite(bot, { invite: data.d as DiscordInviteCreate, shardId }))
}
+29 -3
View File
@@ -29,6 +29,7 @@ import type {
CreateApplicationCommand,
CreateAutoModerationRuleOptions,
CreateChannelInvite,
CreateEntitlement,
CreateForumPostWithMessage,
CreateGlobalApplicationCommandOptions,
CreateGuild,
@@ -44,7 +45,9 @@ import type {
CreateStageInstance,
CreateTemplate,
DeleteWebhookMessageOptions,
DiscordEntitlement,
DiscordMessage,
EditApplication,
EditAutoModerationRuleOptions,
EditBotMemberOptions,
EditChannelPermissionOverridesOptions,
@@ -58,6 +61,7 @@ import type {
ExecuteWebhook,
GetApplicationCommandPermissionOptions,
GetBans,
GetEntitlements,
GetGroupDmOptions,
GetGuildAuditLog,
GetGuildPruneCountQuery,
@@ -95,6 +99,7 @@ import type { ApplicationCommandPermission } from './transformers/applicationCom
import type { AutoModerationRule } from './transformers/automodRule.js'
import type { Channel } from './transformers/channel.js'
import type { Emoji } from './transformers/emoji.js'
import { type Entitlement } from './transformers/entitlement.js'
import type { Guild } from './transformers/guild.js'
import type { Integration } from './transformers/integration.js'
import type { Invite } from './transformers/invite.js'
@@ -103,6 +108,7 @@ import type { Message } from './transformers/message.js'
import type { GuildOnboarding } from './transformers/onboarding.js'
import type { Role } from './transformers/role.js'
import type { ScheduledEvent } from './transformers/scheduledEvent.js'
import type { Sku } from './transformers/sku.js'
import type { StageInstance } from './transformers/stageInstance.js'
import type { Sticker, StickerPack } from './transformers/sticker.js'
import type { Template } from './transformers/template.js'
@@ -252,7 +258,10 @@ export function createBotHelpers(bot: Bot): BotHelpers {
}
},
getApplicationInfo: async () => {
return bot.transformers.application(bot, snakelize(await bot.rest.getApplicationInfo()))
return bot.transformers.application(bot, { application: snakelize(await bot.rest.getApplicationInfo()), shardId: 0 })
},
editApplicationInfo: async (body) => {
return bot.transformers.application(bot, { application: snakelize(await bot.rest.editApplicationInfo(body)), shardId: 0 })
},
getCurrentAuthenticationInfo: async (bearerToken) => {
return await bot.rest.getCurrentAuthenticationInfo(bearerToken)
@@ -366,10 +375,10 @@ export function createBotHelpers(bot: Bot): BotHelpers {
)
},
getInvite: async (inviteCode, options) => {
return bot.transformers.invite(bot, snakelize(await bot.rest.getInvite(inviteCode, options)))
return bot.transformers.invite(bot, { invite: snakelize(await bot.rest.getInvite(inviteCode, options)), shardId: 0 })
},
getInvites: async (guildId) => {
return (await bot.rest.getInvites(guildId)).map((res) => bot.transformers.invite(bot, snakelize(res)))
return (await bot.rest.getInvites(guildId)).map((res) => bot.transformers.invite(bot, { invite: snakelize(res), shardId: 0 }))
},
getMessage: async (channelId, messageId) => {
return bot.transformers.message(bot, snakelize(await bot.rest.getMessage(channelId, messageId)))
@@ -686,6 +695,18 @@ export function createBotHelpers(bot: Bot): BotHelpers {
editGuildOnboarding: async (guildId, options, reason) => {
return bot.transformers.guildOnboarding(bot, snakelize(await bot.rest.editGuildOnboarding(guildId, options, reason)))
},
listEntitlements: async (applicationId, options) => {
return (await bot.rest.listEntitlements(applicationId, options)).map((entitlement) => bot.transformers.entitlement(bot, snakelize(entitlement)))
},
createTestEntitlement: async (applicationId, body) => {
return bot.transformers.entitlement(bot, snakelize(await bot.rest.createTestEntitlement(applicationId, body)) as DiscordEntitlement)
},
deleteTestEntitlement: async (applicationId, entitlementId) => {
await bot.rest.deleteTestEntitlement(applicationId, entitlementId)
},
listSkus: async (applicationId) => {
return (await bot.rest.listSkus(applicationId)).map((sku) => bot.transformers.sku(bot, snakelize(sku)))
},
}
}
@@ -756,6 +777,7 @@ export interface BotHelpers {
followAnnouncement: (sourceChannelId: BigString, targetChannelId: BigString) => Promise<CamelizedDiscordFollowedChannel>
getActiveThreads: (guildId: BigString) => Promise<{ threads: Channel[]; members: ThreadMember[] }>
getApplicationInfo: () => Promise<Application>
editApplicationInfo: (body: EditApplication) => Promise<Application>
getCurrentAuthenticationInfo: (bearerToken: string) => Promise<CamelizedDiscordCurrentAuthorization>
exchangeToken: (clientId: BigString, clientSecret: string, options: CamelizedDiscordTokenExchange) => Promise<CamelizedDiscordAccessTokenResponse>
revokeToken: (clientId: BigString, clientSecret: string, options: CamelizedDiscordTokenRevocation) => Promise<void>
@@ -905,4 +927,8 @@ export interface BotHelpers {
unpinMessage: (channelId: BigString, messageId: BigString, reason?: string) => Promise<void>
getGuildOnboarding: (guildId: BigString) => Promise<GuildOnboarding>
editGuildOnboarding: (guildId: BigString, options: EditGuildOnboarding, reason?: string) => Promise<GuildOnboarding>
listEntitlements: (applicationId: BigString, options?: GetEntitlements) => Promise<Entitlement[]>
createTestEntitlement: (applicationId: BigString, body: CreateEntitlement) => Promise<Partial<Entitlement>>
deleteTestEntitlement: (applicationId: BigString, entitlementId: BigString) => Promise<void>
listSkus: (applicationId: BigString) => Promise<Sku[]>
}
+58 -2
View File
@@ -16,6 +16,7 @@ import type {
DiscordCreateApplicationCommand,
DiscordEmbed,
DiscordEmoji,
DiscordEntitlement,
DiscordGetGatewayBot,
DiscordGuild,
DiscordGuildApplicationCommandPermissions,
@@ -33,6 +34,7 @@ import type {
DiscordPresenceUpdate,
DiscordRole,
DiscordScheduledEvent,
DiscordSku,
DiscordStageInstance,
DiscordSticker,
DiscordStickerPack,
@@ -61,6 +63,7 @@ import { transformChannel, type Channel } from './transformers/channel.js'
import { transformComponent, type Component } from './transformers/component.js'
import { transformEmbed, type Embed } from './transformers/embed.js'
import { transformEmoji, type Emoji } from './transformers/emoji.js'
import { transformEntitlement, type Entitlement } from './transformers/entitlement.js'
import { transformGatewayBot, type GetGatewayBot } from './transformers/gatewayBot.js'
import { transformGuild, type Guild } from './transformers/guild.js'
import {
@@ -88,6 +91,7 @@ import { transformCreateApplicationCommandToDiscordCreateApplicationCommand } fr
import { transformInteractionResponseToDiscordInteractionResponse } from './transformers/reverse/interactionResponse.js'
import { transformRole, type Role } from './transformers/role.js'
import { transformScheduledEvent, type ScheduledEvent } from './transformers/scheduledEvent.js'
import { transformSku, type Sku } from './transformers/sku.js'
import { transformStageInstance, type StageInstance } from './transformers/stageInstance.js'
import { transformInviteStageInstance, type InviteStageInstance } from './transformers/stageInviteInstance.js'
import { transformSticker, transformStickerPack, type Sticker, type StickerPack } from './transformers/sticker.js'
@@ -159,6 +163,8 @@ export interface Transformers {
) => any
template: (bot: Bot, payload: DiscordTemplate, template: Template) => any
guildOnboarding: (bot: Bot, payload: DiscordGuildOnboarding, onboarding: GuildOnboarding) => any
entitlement: (bot: Bot, payload: DiscordEntitlement, entitlement: Entitlement) => any
sku: (bot: Bot, payload: DiscordSku, sku: Sku) => any
}
desiredProperties: {
attachment: {
@@ -268,6 +274,7 @@ export interface Transformers {
rulesChannelId: boolean
publicUpdatesChannelId: boolean
premiumProgressBarEnabled: boolean
safetyAlertsChannelId: boolean
}
interaction: {
id: boolean
@@ -472,6 +479,25 @@ export interface Transformers {
enabled: boolean
mode: boolean
}
entitlement: {
id: boolean
skuId: boolean
userId: boolean
guildId: boolean
applicationId: boolean
type: boolean
deleted: boolean
startsAt: boolean
endsAt: boolean
}
sku: {
id: boolean
type: boolean
applicationId: boolean
name: boolean
slug: boolean
flags: boolean
}
}
reverse: {
allowedMentions: (bot: Bot, payload: AllowedMentions) => DiscordAllowedMentions
@@ -504,8 +530,8 @@ export interface Transformers {
interaction: (bot: Bot, payload: DiscordInteraction) => Interaction
interactionDataOptions: (bot: Bot, payload: DiscordInteractionDataOption) => InteractionDataOption
integration: (bot: Bot, payload: DiscordIntegrationCreateUpdate) => Integration
invite: (bot: Bot, invite: DiscordInviteCreate | DiscordInviteMetadata) => Invite
application: (bot: Bot, payload: DiscordApplication) => Application
invite: (bot: Bot, payload: { invite: DiscordInviteCreate | DiscordInviteMetadata; shardId: number }) => Invite
application: (bot: Bot, payload: { application: DiscordApplication; shardId: number }) => Application
team: (bot: Bot, payload: DiscordTeam) => Team
emoji: (bot: Bot, payload: DiscordEmoji) => Emoji
activity: (bot: Bot, payload: DiscordActivity) => Activity
@@ -533,6 +559,8 @@ export interface Transformers {
applicationCommandOptionChoice: (bot: Bot, payload: DiscordApplicationCommandOptionChoice) => ApplicationCommandOptionChoice
template: (bot: Bot, payload: DiscordTemplate) => Template
guildOnboarding: (bot: Bot, payload: DiscordGuildOnboarding) => GuildOnboarding
entitlement: (bot: Bot, payload: DiscordEntitlement) => Entitlement
sku: (bot: Bot, payload: DiscordSku) => Sku
}
export interface CreateTransformerOptions {
@@ -674,6 +702,12 @@ export function createTransformers(options: Partial<Transformers>, opts?: Create
guildOnboarding(bot, payload, onboarding) {
return onboarding
},
entitlement(bot, payload, entitlement) {
return entitlement
},
sku(bot, payload, sku) {
return sku
},
},
desiredProperties: {
attachment: {
@@ -783,6 +817,7 @@ export function createTransformers(options: Partial<Transformers>, opts?: Create
rulesChannelId: opts?.defaultDesiredPropertiesValue ?? false,
publicUpdatesChannelId: opts?.defaultDesiredPropertiesValue ?? false,
premiumProgressBarEnabled: opts?.defaultDesiredPropertiesValue ?? false,
safetyAlertsChannelId: opts?.defaultDesiredPropertiesValue ?? false,
},
interaction: {
id: opts?.defaultDesiredPropertiesValue ?? false,
@@ -987,6 +1022,25 @@ export function createTransformers(options: Partial<Transformers>, opts?: Create
type: opts?.defaultDesiredPropertiesValue ?? false,
},
},
entitlement: {
id: opts?.defaultDesiredPropertiesValue ?? false,
skuId: opts?.defaultDesiredPropertiesValue ?? false,
userId: opts?.defaultDesiredPropertiesValue ?? false,
guildId: opts?.defaultDesiredPropertiesValue ?? false,
applicationId: opts?.defaultDesiredPropertiesValue ?? false,
type: opts?.defaultDesiredPropertiesValue ?? false,
deleted: opts?.defaultDesiredPropertiesValue ?? false,
startsAt: opts?.defaultDesiredPropertiesValue ?? false,
endsAt: opts?.defaultDesiredPropertiesValue ?? false,
},
sku: {
id: opts?.defaultDesiredPropertiesValue ?? false,
type: opts?.defaultDesiredPropertiesValue ?? false,
applicationId: opts?.defaultDesiredPropertiesValue ?? false,
name: opts?.defaultDesiredPropertiesValue ?? false,
slug: opts?.defaultDesiredPropertiesValue ?? false,
flags: opts?.defaultDesiredPropertiesValue ?? false,
},
},
reverse: {
allowedMentions: options.reverse?.allowedMentions ?? transformAllowedMentionsToDiscordAllowedMentions,
@@ -1048,5 +1102,7 @@ export function createTransformers(options: Partial<Transformers>, opts?: Create
applicationCommandOptionChoice: options.applicationCommandOptionChoice ?? transformApplicationCommandOptionChoice,
template: options.template ?? transformTemplate,
guildOnboarding: options.guildOnboarding ?? transformGuildOnboarding,
entitlement: options.entitlement ?? transformEntitlement,
sku: options.sku ?? transformSku,
}
}
+41 -21
View File
@@ -1,31 +1,46 @@
import { iconHashToBigInt, type ApplicationFlags, type Bot, type DiscordApplication, type Team, type User } from '../index.js'
import {
iconHashToBigInt,
type ApplicationFlags,
type Bot,
type DiscordApplication,
type DiscordUser,
type Guild,
type Team,
type User,
} from '../index.js'
export function transformApplication(bot: Bot, payload: DiscordApplication): Application {
export function transformApplication(bot: Bot, payload: { application: DiscordApplication; shardId: number }): Application {
const application = {
name: payload.name,
description: payload.description,
rpcOrigins: payload.rpc_origins,
botPublic: payload.bot_public,
botRequireCodeGrant: payload.bot_require_code_grant,
termsOfServiceUrl: payload.terms_of_service_url,
privacyPolicyUrl: payload.privacy_policy_url,
verifyKey: payload.verify_key,
primarySkuId: payload.primary_sku_id,
slug: payload.slug,
coverImage: payload.cover_image ? iconHashToBigInt(payload.cover_image) : undefined,
flags: payload.flags,
name: payload.application.name,
description: payload.application.description,
rpcOrigins: payload.application.rpc_origins,
botPublic: payload.application.bot_public,
botRequireCodeGrant: payload.application.bot_require_code_grant,
termsOfServiceUrl: payload.application.terms_of_service_url,
privacyPolicyUrl: payload.application.privacy_policy_url,
verifyKey: payload.application.verify_key,
primarySkuId: payload.application.primary_sku_id,
slug: payload.application.slug,
coverImage: payload.application.cover_image ? iconHashToBigInt(payload.application.cover_image) : undefined,
flags: payload.application.flags,
id: bot.transformers.snowflake(payload.id),
icon: payload.icon ? iconHashToBigInt(payload.icon) : undefined,
owner: payload.owner
id: bot.transformers.snowflake(payload.application.id),
icon: payload.application.icon ? iconHashToBigInt(payload.application.icon) : undefined,
owner: payload.application.owner
? // @ts-expect-error the partial here wont break anything
bot.transformers.user(bot, payload.owner)
bot.transformers.user(bot, payload.application.owner)
: undefined,
team: payload.team ? bot.transformers.team(bot, payload.team) : undefined,
guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined,
team: payload.application.team ? bot.transformers.team(bot, payload.application.team) : undefined,
guildId: payload.application.guild_id ? bot.transformers.snowflake(payload.application.guild_id) : undefined,
// @ts-expect-error the partial here wont break anything
guild: payload.application.guild ? bot.transformers.guild(bot, { guild: payload.application.guild, shardId: payload.shardId }) : undefined,
approximateGuildCount: payload.application.approximate_guild_count,
bot: payload.application.bot ? bot.transformers.user(bot, payload.application.bot as DiscordUser) : undefined,
interactionsEndpointUrl: payload.application.interactions_endpoint_url,
redirectUris: payload.application.redirect_uris,
} as Application
return bot.transformers.customizers.application(bot, payload, application)
return bot.transformers.customizers.application(bot, payload.application, application)
}
export interface Application {
@@ -40,10 +55,15 @@ export interface Application {
owner?: User
team?: Team
guildId?: bigint
guild?: Guild
id: bigint
name: string
description: string
botPublic: boolean
botRequireCodeGrant: boolean
verifyKey: string
approximateGuildCount?: number
bot?: User
redirectUris?: string[]
interactionsEndpointUrl?: string
}
@@ -0,0 +1,40 @@
import type { DiscordEntitlement, DiscordEntitlementType } from '@discordeno/types'
import type { Bot } from '../index.js'
export function transformEntitlement(bot: Bot, payload: DiscordEntitlement): Entitlement {
const props = bot.transformers.desiredProperties.entitlement
const entitlement = {} as Entitlement
if (props.id && payload.id) entitlement.id = bot.transformers.snowflake(payload.id)
if (props.skuId && payload.sku_id) entitlement.skuId = bot.transformers.snowflake(payload.sku_id)
if (props.userId && payload.user_id) entitlement.userId = bot.transformers.snowflake(payload.user_id)
if (props.guildId && payload.guild_id) entitlement.guildId = bot.transformers.snowflake(payload.guild_id)
if (props.applicationId && payload.application_id) entitlement.applicationId = bot.transformers.snowflake(payload.application_id)
if (props.type && payload.type) entitlement.type = payload.type
if (props.deleted && payload.deleted) entitlement.deleted = payload.deleted
if (props.startsAt && payload.starts_at) entitlement.startsAt = Date.parse(payload.starts_at)
if (props.endsAt && payload.ends_at) entitlement.endsAt = Date.parse(payload.ends_at)
return bot.transformers.customizers.entitlement(bot, payload, entitlement)
}
export interface Entitlement {
/** ID of the entitlement */
id: bigint
/** ID of the SKU */
skuId: bigint
/** ID of the user that is granted access to the entitlement's sku */
userId?: bigint
/** ID of the guild that is granted access to the entitlement's sku */
guildId?: bigint
/** ID of the parent application */
applicationId: bigint
/** Type of entitlement */
type: DiscordEntitlementType
/** Entitlement was deleted */
deleted: boolean
/** Start date at which the entitlement is valid. Not present when using test entitlements */
startsAt?: number
/** Date at which the entitlement is no longer valid. Not present when using test entitlements */
endsAt?: number
}
+5 -1
View File
@@ -144,6 +144,8 @@ export function transformGuild(bot: Bot, payload: { guild: DiscordGuild } & { sh
if (props.iconHash && payload.guild.icon_hash) guild.iconHash = iconHashToBigInt(payload.guild.icon_hash)
if (props.presences && payload.guild.presences)
guild.presences = payload.guild.presences?.map((presence) => bot.transformers.presence(bot, presence as DiscordPresenceUpdate))
if (props.safetyAlertsChannelId && payload.guild.safety_alerts_channel_id)
guild.safetyAlertsChannelId = bot.transformers.snowflake(payload.guild.safety_alerts_channel_id)
return bot.transformers.customizers.guild(bot, payload.guild, guild)
}
@@ -251,6 +253,8 @@ export interface Guild {
welcomeScreen?: WelcomeScreen
/** Stage instances in the guild */
stageInstances?: StageInstance[]
/** custom guild stickers */
/** Custom guild stickers */
stickers?: Collection<bigint, Sticker>
/** The id of the channel where admins and moderators of Community guilds receive safety alerts from Discord */
safetyAlertsChannelId?: bigint
}
+34 -28
View File
@@ -2,48 +2,54 @@ import type { DiscordApplication, DiscordInviteCreate, DiscordInviteMetadata } f
import { isInviteWithMetadata, type Application, type Bot, type ScheduledEvent, type User } from '../index.js'
import type { InviteStageInstance } from './stageInviteInstance.js'
export function transformInvite(bot: Bot, payload: DiscordInviteCreate | DiscordInviteMetadata): Invite {
export function transformInvite(bot: Bot, payload: { invite: DiscordInviteCreate | DiscordInviteMetadata; shardId: number }): Invite {
const props = bot.transformers.desiredProperties.invite
const invite = {} as Invite
const hasMetadata = isInviteWithMetadata(payload)
if (props.code && payload.code) invite.code = payload.code
if (props.createdAt && payload.created_at) invite.createdAt = Date.parse(payload.created_at)
if (props.inviter && payload.inviter) invite.inviter = bot.transformers.user(bot, payload.inviter)
if (props.maxAge && payload.max_age) invite.maxAge = payload.max_age
if (props.maxUses && payload.max_uses) invite.maxUses = payload.max_uses
if (props.targetType && payload.target_type) invite.targetType = payload.target_type
if (props.targetUser && payload.target_user) invite.targetUser = bot.transformers.user(bot, payload.target_user)
if (props.targetApplication && payload.target_application)
invite.targetApplication = bot.transformers.application(bot, payload.target_application as DiscordApplication)
if (props.temporary && payload.temporary) invite.temporary = payload.temporary
if (props.uses && payload.uses) invite.uses = payload.uses
if (props.code && payload.invite.code) invite.code = payload.invite.code
if (props.createdAt && payload.invite.created_at) invite.createdAt = Date.parse(payload.invite.created_at)
if (props.inviter && payload.invite.inviter) invite.inviter = bot.transformers.user(bot, payload.invite.inviter)
if (props.maxAge && payload.invite.max_age) invite.maxAge = payload.invite.max_age
if (props.maxUses && payload.invite.max_uses) invite.maxUses = payload.invite.max_uses
if (props.targetType && payload.invite.target_type) invite.targetType = payload.invite.target_type
if (props.targetUser && payload.invite.target_user) invite.targetUser = bot.transformers.user(bot, payload.invite.target_user)
if (props.targetApplication && payload.invite.target_application)
invite.targetApplication = bot.transformers.application(bot, {
application: payload.invite.target_application as DiscordApplication,
shardId: payload.shardId,
})
if (props.temporary && payload.invite.temporary) invite.temporary = payload.invite.temporary
if (props.uses && payload.invite.uses) invite.uses = payload.invite.uses
if (hasMetadata) {
if (props.channelId && payload.channel?.id) invite.channelId = bot.transformers.snowflake(payload.channel.id)
if (props.guildId && payload.guild?.id) invite.guildId = bot.transformers.snowflake(payload.guild.id)
if (props.approximateMemberCount && payload.approximate_member_count) invite.approximateMemberCount = payload.approximate_member_count
if (props.approximatePresenceCount && payload.approximate_presence_count) invite.approximatePresenceCount = payload.approximate_presence_count
if (props.guildScheduledEvent && payload.guild_scheduled_event) {
invite.guildScheduledEvent = payload.guild_scheduled_event ? bot.transformers.scheduledEvent(bot, payload.guild_scheduled_event) : undefined
if (isInviteWithMetadata(payload.invite)) {
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)
if (props.approximateMemberCount && payload.invite.approximate_member_count)
invite.approximateMemberCount = payload.invite.approximate_member_count
if (props.approximatePresenceCount && payload.invite.approximate_presence_count)
invite.approximatePresenceCount = payload.invite.approximate_presence_count
if (props.guildScheduledEvent && payload.invite.guild_scheduled_event) {
invite.guildScheduledEvent = payload.invite.guild_scheduled_event
? bot.transformers.scheduledEvent(bot, payload.invite.guild_scheduled_event)
: undefined
}
if (props.stageInstance && invite.guildId && payload.stage_instance) {
invite.stageInstance = payload.stage_instance
if (props.stageInstance && invite.guildId && payload.invite.stage_instance) {
invite.stageInstance = payload.invite.stage_instance
? bot.transformers.inviteStageInstance(bot, {
...payload.stage_instance,
...payload.invite.stage_instance,
guildId: invite.guildId,
})
: undefined
}
if (props.expiresAt && payload.expires_at) {
invite.expiresAt = Date.parse(payload.expires_at)
if (props.expiresAt && payload.invite.expires_at) {
invite.expiresAt = Date.parse(payload.invite.expires_at)
}
} else {
if (props.channelId && payload.channel_id) invite.channelId = bot.transformers.snowflake(payload.channel_id)
if (props.guildId && payload.guild_id) invite.guildId = bot.transformers.snowflake(payload.guild_id)
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)
}
return bot.transformers.customizers.invite(bot, payload, invite)
return bot.transformers.customizers.invite(bot, payload.invite, invite)
}
export interface Invite {
@@ -13,9 +13,9 @@ export function transformTeamToDiscordTeam(bot: Bot, payload: Team): DiscordTeam
owner_user_id: payload.ownerUserId.toString(),
members: payload.members.map((member) => ({
membership_state: member.membershipState,
permissions: member.permissions,
team_id: id,
user: bot.transformers.reverse.user(bot, member.user),
role: member.role,
})),
}
}
+31
View File
@@ -0,0 +1,31 @@
import type { DiscordSku, DiscordSkuFlag, DiscordSkuType } from '@discordeno/types'
import type { Bot } from '../index.js'
export function transformSku(bot: Bot, payload: DiscordSku): Sku {
const props = bot.transformers.desiredProperties.sku
const sku = {} as Sku
if (props.id && payload.id) sku.id = bot.transformers.snowflake(payload.id)
if (props.type && payload.type) sku.type = payload.type
if (props.applicationId && payload.application_id) sku.applicationId = bot.transformers.snowflake(payload.application_id)
if (props.name && payload.name) sku.name = payload.name
if (props.slug && payload.slug) sku.slug = payload.slug
if (props.flags && payload.flags) sku.flags = payload.flags
return bot.transformers.customizers.sku(bot, payload, sku)
}
export interface Sku {
/** ID of SKU */
id: bigint
/** Type of SKU */
type: DiscordSkuType
/** ID of the parent application */
applicationId: bigint
/** Customer-facing name of your premium offering */
name: string
/** System-generated URL slug based on the SKU's name */
slug: string
/** SKU flags combined as a bitfield */
flags: DiscordSkuFlag
}
+3 -3
View File
@@ -1,4 +1,4 @@
import type { DiscordTeam, TeamMembershipStates } from '@discordeno/types'
import type { DiscordTeam, DiscordTeamMemberRole, TeamMembershipStates } from '@discordeno/types'
import { iconHashToBigInt, type Bot, type User } from '../index.js'
export function transformTeam(bot: Bot, payload: DiscordTeam): Team {
@@ -11,9 +11,9 @@ export function transformTeam(bot: Bot, payload: DiscordTeam): Team {
ownerUserId: bot.transformers.snowflake(payload.owner_user_id),
members: payload.members.map((member) => ({
membershipState: member.membership_state,
permissions: member.permissions,
teamId: id,
user: bot.transformers.user(bot, member.user),
role: member.role,
})),
} as Team
@@ -27,8 +27,8 @@ export interface Team {
ownerUserId: bigint
members: Array<{
membershipState: TeamMembershipStates
permissions: Array<'*'>
teamId: bigint
user: User
role: DiscordTeamMemberRole
}>
}
+3
View File
@@ -204,6 +204,9 @@ export interface BotGatewayHandlerOptions {
INTEGRATION_CREATE: typeof handlers.handleIntegrationCreate
INTEGRATION_UPDATE: typeof handlers.handleIntegrationUpdate
INTEGRATION_DELETE: typeof handlers.handleIntegrationDelete
ENTITLEMENT_CREATE: typeof handlers.handleEntitlementCreate
ENTITLEMENT_UPDATE: typeof handlers.handleEntitlementUpdate
ENTITLEMENT_DELETE: typeof handlers.handleEntitlementDelete
}
export enum MessageFlags {