Files
discordeno/packages/bot/src/transformers.ts

784 lines
44 KiB
TypeScript

import type {
AllowedMentions,
BigString,
DiscordActivity,
DiscordActivityAssets,
DiscordActivityEmoji,
DiscordActivityInstance,
DiscordActivityLocation,
DiscordAllowedMentions,
DiscordApplication,
DiscordApplicationCommand,
DiscordApplicationCommandOption,
DiscordApplicationCommandOptionChoice,
DiscordApplicationCommandPermissions,
DiscordAttachment,
DiscordAuditLogEntry,
DiscordAutoModerationAction,
DiscordAutoModerationActionExecution,
DiscordAutoModerationActionMetadata,
DiscordAutoModerationRule,
DiscordAutoModerationRuleTriggerMetadata,
DiscordAvatarDecorationData,
DiscordChannel,
DiscordCollectibles,
DiscordDefaultReactionEmoji,
DiscordEmbed,
DiscordEmbedAuthor,
DiscordEmbedFooter,
DiscordEmbedImage,
DiscordEmbedVideo,
DiscordEmoji,
DiscordEntitlement,
DiscordForumTag,
DiscordGetGatewayBot,
DiscordGuild,
DiscordGuildApplicationCommandPermissions,
DiscordGuildOnboarding,
DiscordGuildOnboardingPrompt,
DiscordGuildOnboardingPromptOption,
DiscordGuildWidget,
DiscordGuildWidgetSettings,
DiscordIncidentsData,
DiscordIntegrationAccount,
DiscordIntegrationApplication,
DiscordIntegrationCreateUpdate,
DiscordInteraction,
DiscordInteractionCallback,
DiscordInteractionCallbackResponse,
DiscordInteractionDataOption,
DiscordInteractionDataResolved,
DiscordInteractionResource,
DiscordInviteMetadata,
DiscordInviteStageInstance,
DiscordLobby,
DiscordLobbyInvite,
DiscordLobbyMember,
DiscordLobbyMessage,
DiscordMediaGalleryItem,
DiscordMember,
DiscordMessage,
DiscordMessageCall,
DiscordMessageComponent,
DiscordMessageComponentFromModalInteractionResponse,
DiscordMessageInteractionMetadata,
DiscordMessagePin,
DiscordMessageSnapshot,
DiscordNameplate,
DiscordOptionalAuditEntryInfo,
DiscordPoll,
DiscordPollMedia,
DiscordPresenceUpdate,
DiscordRole,
DiscordRoleColors,
DiscordScheduledEvent,
DiscordScheduledEventRecurrenceRule,
DiscordSessionStartLimit,
DiscordSharedClientTheme,
DiscordSku,
DiscordSoundboardSound,
DiscordStageInstance,
DiscordSticker,
DiscordStickerPack,
DiscordSubscription,
DiscordTeam,
DiscordTeamMember,
DiscordTemplate,
DiscordThreadMember,
DiscordThreadMemberGuildCreate,
DiscordUnfurledMediaItem,
DiscordUser,
DiscordUserPrimaryGuild,
DiscordVoiceRegion,
DiscordVoiceState,
DiscordWebhook,
DiscordWelcomeScreen,
RecursivePartial,
} from '@discordeno/types';
import { bigintToSnowflake, snowflakeToBigint } from '@discordeno/utils';
import type { Bot } from './bot.js';
import {
createDesiredPropertiesObject,
type DesiredPropertiesBehavior,
type SetupDesiredProps,
type TransformersDesiredProperties,
} from './desiredProperties.js';
import {
transformActivity,
transformActivityAssets,
transformActivityEmoji,
transformActivityInstance,
transformActivityLocation,
} from './transformers/activity.js';
import { transformApplication } from './transformers/application.js';
import { transformApplicationCommand } from './transformers/applicationCommand.js';
import { transformApplicationCommandOption } from './transformers/applicationCommandOption.js';
import { transformApplicationCommandOptionChoice } from './transformers/applicationCommandOptionChoice.js';
import { transformApplicationCommandPermissions, transformGuildApplicationCommandPermissions } from './transformers/applicationCommandPermission.js';
import { transformAttachment } from './transformers/attachment.js';
import { transformAuditLogEntry, transformOptionalAuditEntryInfo } from './transformers/auditLogEntry.js';
import {
transformAutoModerationAction,
transformAutoModerationActionExecution,
transformAutoModerationActionMetadata,
} from './transformers/automodActionExecution.js';
import { transformAutoModerationRule, transformautoModerationRuleTriggerMetadata } from './transformers/automodRule.js';
import { transformAvatarDecorationData } from './transformers/avatarDecorationData.js';
import { transformChannel, transformForumTag } from './transformers/channel.js';
import { transformComponent, transformMediaGalleryItem, transformUnfurledMediaItem } from './transformers/component.js';
import { transformEmbed, transformEmbedAuthor, transformEmbedFooter, transformEmbedImage, transformEmbedVideo } from './transformers/embed.js';
import { transformDefaultReactionEmoji, transformEmoji } from './transformers/emoji.js';
import { transformEntitlement } from './transformers/entitlement.js';
import { transformGatewayBot, transformSessionStartLimit } from './transformers/gatewayBot.js';
import { transformGuild } from './transformers/guild.js';
import { transformIncidentsData } from './transformers/incidentsData.js';
import { transformIntegration, transformIntegrationAccount, transformIntegrationApplication } from './transformers/integration.js';
import {
transformInteraction,
transformInteractionCallback,
transformInteractionCallbackResponse,
transformInteractionDataOption,
transformInteractionDataResolved,
transformInteractionResource,
} from './transformers/interaction.js';
import { transformInvite } from './transformers/invite.js';
import { transformLobby, transformLobbyInvite, transformLobbyMember, transformLobbyMessage } from './transformers/lobby.js';
import { transformMember } from './transformers/member.js';
import {
transformMessage,
transformMessageCall,
transformMessageInteractionMetadata,
transformMessagePin,
transformMessageSnapshot,
transformSharedClientTheme,
} from './transformers/message.js';
import { transformGuildOnboarding, transformGuildOnboardingPrompt, transformGuildOnboardingPromptOption } from './transformers/onboarding.js';
import { transformPoll, transformPollMedia } from './transformers/poll.js';
import { transformPresence } from './transformers/presence.js';
import { transformActivityAssetsToDiscordActivityAssets, transformActivityToDiscordActivity } from './transformers/reverse/activity.js';
import { transformAllowedMentionsToDiscordAllowedMentions } from './transformers/reverse/allowedMentions.js';
import { transformApplicationToDiscordApplication } from './transformers/reverse/application.js';
import { transformApplicationCommandToDiscordApplicationCommand } from './transformers/reverse/applicationCommand.js';
import { transformApplicationCommandOptionToDiscordApplicationCommandOption } from './transformers/reverse/applicationCommandOption.js';
import { transformApplicationCommandOptionChoiceToDiscordApplicationCommandOptionChoice } from './transformers/reverse/applicationCommandOptionChoice.js';
import { transformAttachmentToDiscordAttachment } from './transformers/reverse/attachment.js';
import {
transformComponentToDiscordComponent,
transformMediaGalleryItemToDiscordMediaGalleryItem,
transformUnfurledMediaItemToDiscordUnfurledMediaItem,
} from './transformers/reverse/component.js';
import { transformEmbedToDiscordEmbed } from './transformers/reverse/embed.js';
import { transformMemberToDiscordMember, transformUserToDiscordUser } from './transformers/reverse/member.js';
import { transformTeamToDiscordTeam } from './transformers/reverse/team.js';
import { transformCollectiblesToDiscordCollectibles, transformNameplateToDiscordNameplate } from './transformers/reverse/user.js';
import { transformRole, transformRoleColors } from './transformers/role.js';
import { transformScheduledEvent, transformScheduledEventRecurrenceRule } from './transformers/scheduledEvent.js';
import { transformSku } from './transformers/sku.js';
import { transformSoundboardSound } from './transformers/soundboardSound.js';
import { transformStageInstance } from './transformers/stageInstance.js';
import { transformInviteStageInstance } from './transformers/stageInviteInstance.js';
import { transformSticker, transformStickerPack } from './transformers/sticker.js';
import { transformSubscription } from './transformers/subscription.js';
import { transformTeam, transformTeamMember } from './transformers/team.js';
import { transformTemplate } from './transformers/template.js';
import { type ThreadMemberTransformerExtra, transformThreadMember, transformThreadMemberGuildCreate } from './transformers/threadMember.js';
import type {
Activity,
ActivityAssets,
ActivityEmoji,
ActivityInstance,
ActivityLocation,
Application,
ApplicationCommand,
ApplicationCommandOption,
ApplicationCommandOptionChoice,
ApplicationCommandPermissions,
Attachment,
AuditLogEntry,
AutoModerationAction,
AutoModerationActionExecution,
AutoModerationActionMetadata,
AutoModerationRule,
AutoModerationRuleTriggerMetadata,
AvatarDecorationData,
Channel,
Collectibles,
Component,
DefaultReactionEmoji,
Embed,
EmbedAuthor,
EmbedFooter,
EmbedImage,
EmbedVideo,
Emoji,
Entitlement,
ForumTag,
GetGatewayBot,
Guild,
GuildApplicationCommandPermissions,
GuildOnboarding,
GuildOnboardingPrompt,
GuildOnboardingPromptOption,
GuildWidget,
GuildWidgetSettings,
IncidentsData,
Integration,
IntegrationAccount,
IntegrationApplication,
Interaction,
InteractionCallback,
InteractionCallbackResponse,
InteractionDataOption,
InteractionDataResolved,
InteractionResource,
Invite,
InviteStageInstance,
Lobby,
LobbyInvite,
LobbyMember,
LobbyMessage,
MediaGalleryItem,
Member,
Message,
MessageCall,
MessageInteractionMetadata,
MessagePin,
MessageSnapshot,
Nameplate,
OptionalAuditEntryInfo,
Poll,
PollMedia,
PresenceUpdate,
Role,
RoleColors,
ScheduledEvent,
ScheduledEventRecurrenceRule,
SessionStartLimit,
SharedClientTheme,
Sku,
SoundboardSound,
StageInstance,
Sticker,
StickerPack,
Subscription,
Team,
TeamMember,
Template,
ThreadMember,
ThreadMemberGuildCreate,
UnfurledMediaItem,
User,
UserPrimaryGuild,
VoiceRegion,
VoiceState,
Webhook,
WelcomeScreen,
} from './transformers/types.js';
import { transformCollectibles, transformNameplate, transformUser, transformUserPrimaryGuild } from './transformers/user.js';
import { transformVoiceRegion } from './transformers/voiceRegion.js';
import { transformVoiceState } from './transformers/voiceState.js';
import { transformWebhook } from './transformers/webhook.js';
import { transformWelcomeScreen } from './transformers/welcomeScreen.js';
import { transformWidget } from './transformers/widget.js';
import { transformWidgetSettings } from './transformers/widgetSettings.js';
export type TransformerInformations = {
activity: TransformerInformation<DiscordActivity, Activity, true>;
activityAssets: TransformerInformation<DiscordActivityAssets, ActivityAssets, true>;
activityEmoji: TransformerInformation<DiscordActivityEmoji, ActivityEmoji, true>;
activityInstance: TransformerInformation<DiscordActivityInstance, ActivityInstance, true>;
activityLocation: TransformerInformation<DiscordActivityLocation, ActivityLocation, true>;
application: TransformerInformation<DiscordApplication, Application, true, { shardId?: number }>;
applicationCommand: TransformerInformation<DiscordApplicationCommand, ApplicationCommand, true>;
applicationCommandOption: TransformerInformation<DiscordApplicationCommandOption, ApplicationCommandOption, true>;
applicationCommandOptionChoice: TransformerInformation<DiscordApplicationCommandOptionChoice, ApplicationCommandOptionChoice, true>;
applicationCommandPermissions: TransformerInformation<DiscordApplicationCommandPermissions, ApplicationCommandPermissions, true>;
attachment: TransformerInformation<DiscordAttachment, Attachment, true>;
auditLogEntry: TransformerInformation<DiscordAuditLogEntry, AuditLogEntry, true>;
autoModerationAction: TransformerInformation<DiscordAutoModerationAction, AutoModerationAction, true>;
autoModerationActionExecution: TransformerInformation<DiscordAutoModerationActionExecution, AutoModerationActionExecution, true>;
autoModerationActionMetadata: TransformerInformation<DiscordAutoModerationActionMetadata, AutoModerationActionMetadata, true>;
autoModerationRule: TransformerInformation<DiscordAutoModerationRule, AutoModerationRule, true>;
autoModerationRuleTriggerMetadata: TransformerInformation<DiscordAutoModerationRuleTriggerMetadata, AutoModerationRuleTriggerMetadata, true>;
avatarDecorationData: TransformerInformation<DiscordAvatarDecorationData, AvatarDecorationData, true>;
channel: TransformerInformation<DiscordChannel, Channel, true, { guildId?: BigString }>;
collectibles: TransformerInformation<DiscordCollectibles, Collectibles, true>;
component: TransformerInformation<DiscordMessageComponent | DiscordMessageComponentFromModalInteractionResponse, Component, true>;
defaultReactionEmoji: TransformerInformation<DiscordDefaultReactionEmoji, DefaultReactionEmoji, true>;
embed: TransformerInformation<DiscordEmbed, Embed, true>;
embedAuthor: TransformerInformation<DiscordEmbedAuthor, EmbedAuthor, true>;
embedFooter: TransformerInformation<DiscordEmbedFooter, EmbedFooter, true>;
embedImage: TransformerInformation<DiscordEmbedImage, EmbedImage, true>;
embedVideo: TransformerInformation<DiscordEmbedVideo, EmbedVideo, true>;
emoji: TransformerInformation<DiscordEmoji, Emoji, true>;
entitlement: TransformerInformation<DiscordEntitlement, Entitlement, true>;
forumTag: TransformerInformation<DiscordForumTag, ForumTag, true>;
gatewayBot: TransformerInformation<DiscordGetGatewayBot, GetGatewayBot, true>;
guild: TransformerInformation<DiscordGuild, Guild, true, { shardId?: number }>;
guildApplicationCommandPermissions: TransformerInformation<DiscordGuildApplicationCommandPermissions, GuildApplicationCommandPermissions, true>;
guildOnboarding: TransformerInformation<DiscordGuildOnboarding, GuildOnboarding, true>;
guildOnboardingPrompt: TransformerInformation<DiscordGuildOnboardingPrompt, GuildOnboardingPrompt, true>;
guildOnboardingPromptOption: TransformerInformation<DiscordGuildOnboardingPromptOption, GuildOnboardingPromptOption, true>;
incidentsData: TransformerInformation<DiscordIncidentsData, IncidentsData, true>;
integration: TransformerInformation<DiscordIntegrationCreateUpdate, Integration, true>;
integrationAccount: TransformerInformation<DiscordIntegrationAccount, IntegrationAccount, true>;
integrationApplication: TransformerInformation<DiscordIntegrationApplication, IntegrationApplication, true>;
interaction: TransformerInformation<DiscordInteraction, Interaction, true, { shardId?: number }>;
interactionCallback: TransformerInformation<DiscordInteractionCallback, InteractionCallback, true>;
interactionCallbackResponse: TransformerInformation<DiscordInteractionCallbackResponse, InteractionCallbackResponse, true, { shardId?: number }>;
interactionDataOption: TransformerInformation<DiscordInteractionDataOption, InteractionDataOption, true>;
interactionDataResolved: TransformerInformation<
DiscordInteractionDataResolved,
InteractionDataResolved,
true,
{ shardId?: number; guildId?: BigString }
>;
interactionResource: TransformerInformation<DiscordInteractionResource, InteractionResource, true, { shardId?: number }>;
invite: TransformerInformation<DiscordInviteMetadata, Invite, true, { shardId?: number }>;
inviteStageInstance: TransformerInformation<DiscordInviteStageInstance, InviteStageInstance, true, { guildId?: BigString }>;
lobby: TransformerInformation<DiscordLobby, Lobby, true>;
lobbyMember: TransformerInformation<DiscordLobbyMember, LobbyMember, true>;
lobbyMessage: TransformerInformation<DiscordLobbyMessage, LobbyMessage, true>;
lobbyInvite: TransformerInformation<DiscordLobbyInvite, LobbyInvite, true>;
mediaGalleryItem: TransformerInformation<DiscordMediaGalleryItem, MediaGalleryItem, true>;
member: TransformerInformation<DiscordMember, Member, true, { guildId?: BigString; userId?: BigString }>;
message: TransformerInformation<DiscordMessage, Message, true, { shardId?: number }>;
messageCall: TransformerInformation<DiscordMessageCall, MessageCall, true>;
messageInteractionMetadata: TransformerInformation<DiscordMessageInteractionMetadata, MessageInteractionMetadata, true>;
messagePin: TransformerInformation<DiscordMessagePin, MessagePin, true, { shardId?: number }>;
messageSnapshot: TransformerInformation<DiscordMessageSnapshot, MessageSnapshot, true, { shardId?: number }>;
nameplate: TransformerInformation<DiscordNameplate, Nameplate, true>;
optionalAuditEntryInfo: TransformerInformation<DiscordOptionalAuditEntryInfo, OptionalAuditEntryInfo, true>;
poll: TransformerInformation<DiscordPoll, Poll, true>;
pollMedia: TransformerInformation<DiscordPollMedia, PollMedia, true>;
presence: TransformerInformation<DiscordPresenceUpdate, PresenceUpdate, true>;
role: TransformerInformation<DiscordRole, Role, true, { guildId?: BigString }>;
roleColors: TransformerInformation<DiscordRoleColors, RoleColors, true>;
scheduledEvent: TransformerInformation<DiscordScheduledEvent, ScheduledEvent, true>;
scheduledEventRecurrenceRule: TransformerInformation<DiscordScheduledEventRecurrenceRule, ScheduledEventRecurrenceRule, true>;
sessionStartLimit: TransformerInformation<DiscordSessionStartLimit, SessionStartLimit, true>;
sharedClientTheme: TransformerInformation<DiscordSharedClientTheme, SharedClientTheme, true>;
sku: TransformerInformation<DiscordSku, Sku, true>;
soundboardSound: TransformerInformation<DiscordSoundboardSound, SoundboardSound, true>;
stageInstance: TransformerInformation<DiscordStageInstance, StageInstance, true>;
sticker: TransformerInformation<DiscordSticker, Sticker, true>;
stickerPack: TransformerInformation<DiscordStickerPack, StickerPack, true>;
subscription: TransformerInformation<DiscordSubscription, Subscription, true>;
team: TransformerInformation<DiscordTeam, Team, true>;
teamMember: TransformerInformation<DiscordTeamMember, TeamMember, true>;
template: TransformerInformation<DiscordTemplate, Template, true>;
threadMember: TransformerInformation<DiscordThreadMember, ThreadMember, true, ThreadMemberTransformerExtra>;
threadMemberGuildCreate: TransformerInformation<DiscordThreadMemberGuildCreate, ThreadMemberGuildCreate, true>;
unfurledMediaItem: TransformerInformation<DiscordUnfurledMediaItem, UnfurledMediaItem, true>;
user: TransformerInformation<DiscordUser, User, true>;
userPrimaryGuild: TransformerInformation<DiscordUserPrimaryGuild, UserPrimaryGuild, true>;
voiceRegion: TransformerInformation<DiscordVoiceRegion, VoiceRegion, false>;
voiceState: TransformerInformation<DiscordVoiceState, VoiceState, true, { guildId?: BigString }>;
webhook: TransformerInformation<DiscordWebhook, Webhook, true>;
welcomeScreen: TransformerInformation<DiscordWelcomeScreen, WelcomeScreen, false>;
widget: TransformerInformation<DiscordGuildWidget, GuildWidget, false>;
widgetSettings: TransformerInformation<DiscordGuildWidgetSettings, GuildWidgetSettings, false>;
};
export type Transformers<TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior> = TransformerFunctions<
TProps,
TBehavior
> & {
customizers: TransformerCustomizers<TProps, TBehavior>;
desiredProperties: TProps;
reverse: {
activity: (bot: Bot<TProps, TBehavior>, payload: Activity) => DiscordActivity;
activityAssets: (bot: Bot<TProps, TBehavior>, payload: ActivityAssets) => DiscordActivityAssets;
allowedMentions: (bot: Bot<TProps, TBehavior>, payload: AllowedMentions) => DiscordAllowedMentions;
application: (bot: Bot<TProps, TBehavior>, payload: Application) => DiscordApplication;
applicationCommand: (bot: Bot<TProps, TBehavior>, payload: ApplicationCommand) => DiscordApplicationCommand;
applicationCommandOption: (bot: Bot<TProps, TBehavior>, payload: ApplicationCommandOption) => DiscordApplicationCommandOption;
applicationCommandOptionChoice: (bot: Bot<TProps, TBehavior>, payload: ApplicationCommandOptionChoice) => DiscordApplicationCommandOptionChoice;
attachment: (bot: Bot<TProps, TBehavior>, payload: SetupDesiredProps<Attachment, TProps, TBehavior>) => DiscordAttachment;
collectibles: (bot: Bot<TProps, TBehavior>, payload: SetupDesiredProps<Collectibles, TProps, TBehavior>) => DiscordCollectibles;
component: (bot: Bot<TProps, TBehavior>, payload: Component) => DiscordMessageComponent | DiscordMessageComponentFromModalInteractionResponse;
embed: (bot: Bot<TProps, TBehavior>, payload: Embed) => DiscordEmbed;
mediaGalleryItem: (bot: Bot<TProps, TBehavior>, payload: MediaGalleryItem) => DiscordMediaGalleryItem;
member: (bot: Bot<TProps, TBehavior>, payload: SetupDesiredProps<Member, TProps, TBehavior>) => DiscordMember;
nameplate: (bot: Bot<TProps, TBehavior>, payload: SetupDesiredProps<Nameplate, TProps, TBehavior>) => DiscordNameplate;
snowflake: (snowflake: BigString) => string;
team: (bot: Bot<TProps, TBehavior>, payload: Team) => DiscordTeam;
unfurledMediaItem: (bot: Bot<TProps, TBehavior>, payload: UnfurledMediaItem) => DiscordUnfurledMediaItem;
user: (bot: Bot<TProps, TBehavior>, payload: SetupDesiredProps<User, TProps, TBehavior>) => DiscordUser;
};
snowflake: (snowflake: BigString) => bigint;
};
const defaultCustomizer = (_bot: unknown, _payload: unknown, structure: unknown) => structure;
export function createTransformers<TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior>(
options: RecursivePartial<Transformers<TProps, TBehavior>>,
): Transformers<TProps, TBehavior> {
const _options = options as RecursivePartial<Transformers<TransformersDesiredProperties, DesiredPropertiesBehavior.RemoveKey>>;
return {
customizers: {
activity: _options.customizers?.activity ?? defaultCustomizer,
activityAssets: _options.customizers?.activityAssets ?? defaultCustomizer,
activityEmoji: _options.customizers?.activityEmoji ?? defaultCustomizer,
activityInstance: _options.customizers?.activityInstance ?? defaultCustomizer,
activityLocation: _options.customizers?.activityLocation ?? defaultCustomizer,
application: _options.customizers?.application ?? defaultCustomizer,
applicationCommand: _options.customizers?.applicationCommand ?? defaultCustomizer,
applicationCommandOption: _options.customizers?.applicationCommandOption ?? defaultCustomizer,
applicationCommandOptionChoice: _options.customizers?.applicationCommandOptionChoice ?? defaultCustomizer,
applicationCommandPermissions: _options.customizers?.applicationCommandPermissions ?? defaultCustomizer,
attachment: _options.customizers?.attachment ?? defaultCustomizer,
auditLogEntry: _options.customizers?.auditLogEntry ?? defaultCustomizer,
autoModerationAction: _options.customizers?.autoModerationAction ?? defaultCustomizer,
autoModerationActionExecution: _options.customizers?.autoModerationActionExecution ?? defaultCustomizer,
autoModerationActionMetadata: _options.customizers?.autoModerationActionMetadata ?? defaultCustomizer,
autoModerationRule: _options.customizers?.autoModerationRule ?? defaultCustomizer,
autoModerationRuleTriggerMetadata: _options.customizers?.autoModerationRuleTriggerMetadata ?? defaultCustomizer,
avatarDecorationData: _options.customizers?.avatarDecorationData ?? defaultCustomizer,
channel: _options.customizers?.channel ?? defaultCustomizer,
collectibles: _options.customizers?.collectibles ?? defaultCustomizer,
component: _options.customizers?.component ?? defaultCustomizer,
defaultReactionEmoji: _options.customizers?.defaultReactionEmoji ?? defaultCustomizer,
embed: _options.customizers?.embed ?? defaultCustomizer,
embedAuthor: _options.customizers?.embedAuthor ?? defaultCustomizer,
embedFooter: _options.customizers?.embedFooter ?? defaultCustomizer,
embedImage: _options.customizers?.embedImage ?? defaultCustomizer,
embedVideo: _options.customizers?.embedVideo ?? defaultCustomizer,
emoji: _options.customizers?.emoji ?? defaultCustomizer,
entitlement: _options.customizers?.entitlement ?? defaultCustomizer,
forumTag: _options.customizers?.forumTag ?? defaultCustomizer,
gatewayBot: _options.customizers?.gatewayBot ?? defaultCustomizer,
guild: _options.customizers?.guild ?? defaultCustomizer,
guildApplicationCommandPermissions: _options.customizers?.guildApplicationCommandPermissions ?? defaultCustomizer,
guildOnboarding: _options.customizers?.guildOnboarding ?? defaultCustomizer,
guildOnboardingPrompt: _options.customizers?.guildOnboardingPrompt ?? defaultCustomizer,
guildOnboardingPromptOption: _options.customizers?.guildOnboardingPromptOption ?? defaultCustomizer,
incidentsData: _options.customizers?.incidentsData ?? defaultCustomizer,
integration: _options.customizers?.integration ?? defaultCustomizer,
integrationAccount: _options.customizers?.integrationAccount ?? defaultCustomizer,
integrationApplication: _options.customizers?.integrationApplication ?? defaultCustomizer,
interaction: _options.customizers?.interaction ?? defaultCustomizer,
interactionCallback: _options.customizers?.interactionCallback ?? defaultCustomizer,
interactionCallbackResponse: _options.customizers?.interactionCallbackResponse ?? defaultCustomizer,
interactionDataOption: _options.customizers?.interactionDataOption ?? defaultCustomizer,
interactionDataResolved: _options.customizers?.interactionDataResolved ?? defaultCustomizer,
interactionResource: _options.customizers?.interactionResource ?? defaultCustomizer,
invite: _options.customizers?.invite ?? defaultCustomizer,
inviteStageInstance: _options.customizers?.inviteStageInstance ?? defaultCustomizer,
lobby: _options.customizers?.lobby ?? defaultCustomizer,
lobbyMember: _options.customizers?.lobbyMember ?? defaultCustomizer,
lobbyMessage: _options.customizers?.lobbyMessage ?? defaultCustomizer,
lobbyInvite: _options.customizers?.lobbyInvite ?? defaultCustomizer,
mediaGalleryItem: _options.customizers?.mediaGalleryItem ?? defaultCustomizer,
member: _options.customizers?.member ?? defaultCustomizer,
message: _options.customizers?.message ?? defaultCustomizer,
messageCall: _options.customizers?.messageCall ?? defaultCustomizer,
messageInteractionMetadata: _options.customizers?.messageInteractionMetadata ?? defaultCustomizer,
messagePin: _options.customizers?.messagePin ?? defaultCustomizer,
messageSnapshot: _options.customizers?.messageSnapshot ?? defaultCustomizer,
nameplate: _options.customizers?.nameplate ?? defaultCustomizer,
optionalAuditEntryInfo: _options.customizers?.optionalAuditEntryInfo ?? defaultCustomizer,
poll: _options.customizers?.poll ?? defaultCustomizer,
pollMedia: _options.customizers?.pollMedia ?? defaultCustomizer,
presence: _options.customizers?.presence ?? defaultCustomizer,
role: _options.customizers?.role ?? defaultCustomizer,
roleColors: _options.customizers?.roleColors ?? defaultCustomizer,
scheduledEvent: _options.customizers?.scheduledEvent ?? defaultCustomizer,
scheduledEventRecurrenceRule: _options.customizers?.scheduledEventRecurrenceRule ?? defaultCustomizer,
sessionStartLimit: _options.customizers?.sessionStartLimit ?? defaultCustomizer,
sharedClientTheme: _options.customizers?.sharedClientTheme ?? defaultCustomizer,
sku: _options.customizers?.sku ?? defaultCustomizer,
soundboardSound: _options.customizers?.soundboardSound ?? defaultCustomizer,
stageInstance: _options.customizers?.stageInstance ?? defaultCustomizer,
sticker: _options.customizers?.sticker ?? defaultCustomizer,
stickerPack: _options.customizers?.stickerPack ?? defaultCustomizer,
subscription: _options.customizers?.subscription ?? defaultCustomizer,
team: _options.customizers?.team ?? defaultCustomizer,
teamMember: _options.customizers?.teamMember ?? defaultCustomizer,
template: _options.customizers?.template ?? defaultCustomizer,
threadMember: _options.customizers?.threadMember ?? defaultCustomizer,
threadMemberGuildCreate: _options.customizers?.threadMemberGuildCreate ?? defaultCustomizer,
unfurledMediaItem: _options.customizers?.unfurledMediaItem ?? defaultCustomizer,
user: _options.customizers?.user ?? defaultCustomizer,
userPrimaryGuild: _options.customizers?.userPrimaryGuild ?? defaultCustomizer,
voiceRegion: _options.customizers?.voiceRegion ?? defaultCustomizer,
voiceState: _options.customizers?.voiceState ?? defaultCustomizer,
webhook: _options.customizers?.webhook ?? defaultCustomizer,
welcomeScreen: _options.customizers?.welcomeScreen ?? defaultCustomizer,
widget: _options.customizers?.widget ?? defaultCustomizer,
widgetSettings: _options.customizers?.widgetSettings ?? defaultCustomizer,
},
desiredProperties: createDesiredPropertiesObject(_options.desiredProperties ?? {}),
reverse: {
activity: _options.reverse?.activity ?? transformActivityToDiscordActivity,
activityAssets: _options.reverse?.activityAssets ?? transformActivityAssetsToDiscordActivityAssets,
allowedMentions: _options.reverse?.allowedMentions ?? transformAllowedMentionsToDiscordAllowedMentions,
application: _options.reverse?.application ?? transformApplicationToDiscordApplication,
applicationCommand: _options.reverse?.applicationCommand ?? transformApplicationCommandToDiscordApplicationCommand,
applicationCommandOption: _options.reverse?.applicationCommandOption ?? transformApplicationCommandOptionToDiscordApplicationCommandOption,
applicationCommandOptionChoice:
_options.reverse?.applicationCommandOptionChoice ?? transformApplicationCommandOptionChoiceToDiscordApplicationCommandOptionChoice,
attachment: _options.reverse?.attachment ?? transformAttachmentToDiscordAttachment,
collectibles: _options.reverse?.collectibles ?? transformCollectiblesToDiscordCollectibles,
component: _options.reverse?.component ?? transformComponentToDiscordComponent,
embed: _options.reverse?.embed ?? transformEmbedToDiscordEmbed,
mediaGalleryItem: _options.reverse?.mediaGalleryItem ?? transformMediaGalleryItemToDiscordMediaGalleryItem,
member: _options.reverse?.member ?? transformMemberToDiscordMember,
nameplate: _options.reverse?.nameplate ?? transformNameplateToDiscordNameplate,
snowflake: _options.reverse?.snowflake ?? bigintToSnowflake,
team: _options.reverse?.team ?? transformTeamToDiscordTeam,
unfurledMediaItem: _options.reverse?.unfurledMediaItem ?? transformUnfurledMediaItemToDiscordUnfurledMediaItem,
user: _options.reverse?.user ?? transformUserToDiscordUser,
},
activity: _options.activity ?? transformActivity,
activityAssets: _options.activityAssets ?? transformActivityAssets,
activityEmoji: _options.activityEmoji ?? transformActivityEmoji,
activityInstance: _options.activityInstance ?? transformActivityInstance,
activityLocation: _options.activityLocation ?? transformActivityLocation,
application: _options.application ?? transformApplication,
applicationCommand: _options.applicationCommand ?? transformApplicationCommand,
applicationCommandOption: _options.applicationCommandOption ?? transformApplicationCommandOption,
applicationCommandOptionChoice: _options.applicationCommandOptionChoice ?? transformApplicationCommandOptionChoice,
applicationCommandPermissions: _options.applicationCommandPermissions ?? transformApplicationCommandPermissions,
attachment: _options.attachment ?? transformAttachment,
auditLogEntry: _options.auditLogEntry ?? transformAuditLogEntry,
autoModerationAction: _options.autoModerationAction ?? transformAutoModerationAction,
autoModerationActionExecution: _options.autoModerationActionExecution ?? transformAutoModerationActionExecution,
autoModerationActionMetadata: _options.autoModerationActionMetadata ?? transformAutoModerationActionMetadata,
autoModerationRule: _options.autoModerationRule ?? transformAutoModerationRule,
autoModerationRuleTriggerMetadata: _options.autoModerationRuleTriggerMetadata ?? transformautoModerationRuleTriggerMetadata,
avatarDecorationData: _options.avatarDecorationData ?? transformAvatarDecorationData,
channel: _options.channel ?? transformChannel,
collectibles: _options.collectibles ?? transformCollectibles,
component: _options.component ?? transformComponent,
defaultReactionEmoji: _options.defaultReactionEmoji ?? transformDefaultReactionEmoji,
embed: _options.embed ?? transformEmbed,
embedAuthor: _options.embedAuthor ?? transformEmbedAuthor,
embedFooter: _options.embedFooter ?? transformEmbedFooter,
embedImage: _options.embedImage ?? transformEmbedImage,
embedVideo: _options.embedVideo ?? transformEmbedVideo,
emoji: _options.emoji ?? transformEmoji,
entitlement: _options.entitlement ?? transformEntitlement,
forumTag: _options.forumTag ?? transformForumTag,
gatewayBot: _options.gatewayBot ?? transformGatewayBot,
guild: _options.guild ?? transformGuild,
guildApplicationCommandPermissions: _options.guildApplicationCommandPermissions ?? transformGuildApplicationCommandPermissions,
guildOnboarding: _options.guildOnboarding ?? transformGuildOnboarding,
guildOnboardingPrompt: _options.guildOnboardingPrompt ?? transformGuildOnboardingPrompt,
guildOnboardingPromptOption: _options.guildOnboardingPromptOption ?? transformGuildOnboardingPromptOption,
incidentsData: _options.incidentsData ?? transformIncidentsData,
integration: _options.integration ?? transformIntegration,
integrationAccount: _options.integrationAccount ?? transformIntegrationAccount,
integrationApplication: _options.integrationApplication ?? transformIntegrationApplication,
interaction: _options.interaction ?? transformInteraction,
interactionCallback: _options.interactionCallback ?? transformInteractionCallback,
interactionCallbackResponse: _options.interactionCallbackResponse ?? transformInteractionCallbackResponse,
interactionDataOption: _options.interactionDataOption ?? transformInteractionDataOption,
interactionDataResolved: _options.interactionDataResolved ?? transformInteractionDataResolved,
interactionResource: _options.interactionResource ?? transformInteractionResource,
invite: _options.invite ?? transformInvite,
inviteStageInstance: _options.inviteStageInstance ?? transformInviteStageInstance,
lobby: _options.lobby ?? transformLobby,
lobbyMember: _options.lobbyMember ?? transformLobbyMember,
lobbyMessage: _options.lobbyMessage ?? transformLobbyMessage,
lobbyInvite: _options.lobbyInvite ?? transformLobbyInvite,
mediaGalleryItem: _options.mediaGalleryItem ?? transformMediaGalleryItem,
member: _options.member ?? transformMember,
message: _options.message ?? transformMessage,
messageCall: _options.messageCall ?? transformMessageCall,
messageInteractionMetadata: _options.messageInteractionMetadata ?? transformMessageInteractionMetadata,
messagePin: _options.messagePin ?? transformMessagePin,
messageSnapshot: _options.messageSnapshot ?? transformMessageSnapshot,
nameplate: _options.nameplate ?? transformNameplate,
optionalAuditEntryInfo: _options.optionalAuditEntryInfo ?? transformOptionalAuditEntryInfo,
poll: _options.poll ?? transformPoll,
pollMedia: _options.pollMedia ?? transformPollMedia,
presence: _options.presence ?? transformPresence,
role: _options.role ?? transformRole,
roleColors: _options.roleColors ?? transformRoleColors,
scheduledEvent: _options.scheduledEvent ?? transformScheduledEvent,
scheduledEventRecurrenceRule: _options.scheduledEventRecurrenceRule ?? transformScheduledEventRecurrenceRule,
sessionStartLimit: _options.sessionStartLimit ?? transformSessionStartLimit,
sharedClientTheme: _options.sharedClientTheme ?? transformSharedClientTheme,
sku: _options.sku ?? transformSku,
soundboardSound: _options.soundboardSound ?? transformSoundboardSound,
snowflake: _options.snowflake ?? snowflakeToBigint,
stageInstance: _options.stageInstance ?? transformStageInstance,
sticker: _options.sticker ?? transformSticker,
stickerPack: _options.stickerPack ?? transformStickerPack,
subscription: _options.subscription ?? transformSubscription,
team: _options.team ?? transformTeam,
teamMember: _options.teamMember ?? transformTeamMember,
template: _options.template ?? transformTemplate,
threadMember: _options.threadMember ?? transformThreadMember,
threadMemberGuildCreate: _options.threadMemberGuildCreate ?? transformThreadMemberGuildCreate,
unfurledMediaItem: _options.unfurledMediaItem ?? transformUnfurledMediaItem,
user: _options.user ?? transformUser,
userPrimaryGuild: _options.userPrimaryGuild ?? transformUserPrimaryGuild,
voiceRegion: _options.voiceRegion ?? transformVoiceRegion,
voiceState: _options.voiceState ?? transformVoiceState,
webhook: _options.webhook ?? transformWebhook,
welcomeScreen: _options.welcomeScreen ?? transformWelcomeScreen,
widget: _options.widget ?? transformWidget,
widgetSettings: _options.widgetSettings ?? transformWidgetSettings,
} satisfies Transformers<TransformersDesiredProperties, DesiredPropertiesBehavior.RemoveKey> as unknown as Transformers<TProps, TBehavior>;
}
/**
* Information about a transformer including its payload and transformed types.
*
* @template TPayload - The type of the payload received from Discord.
* @template TTransformed - The type of the transformed object returned by the transformer.
* @template TPartial - Indicates if the transformer supports partial payloads.
* @template TExtra - Additional extra information that might be needed for transformation.
*/
export type TransformerInformation<TPayload, TTransformed, TPartial extends boolean, TExtra = {}> = {
payload: TPayload;
transformed: TTransformed;
extra: TExtra;
partial: TPartial;
};
/**
* A function that transforms a payload from Discord into a desired format.
*
* @template TProps - The desired properties for the transformer.
* @template TBehavior - The behavior for handling desired properties.
* @template TPayload - The type of the payload received from Discord.
* @template TTransformed - The type of the transformed object returned by the transformer.
* @template TExtra - Additional extra information that might be needed for transformation.
* @template TPartial - Indicates if the transformer supports partial payloads.
*/
export type TransformerFunction<
TProps extends TransformersDesiredProperties,
TBehavior extends DesiredPropertiesBehavior,
TPayload,
TTransformed,
TExtra = {},
TPartial extends boolean = false,
> = TPartial extends true
? // We use the method syntax for functions (...Params): ReturnType instead of the arrow syntax because it allows us to have overloads in the type
{
(bot: Bot<TProps, TBehavior>, payload: TPayload, extra?: TExtra & { partial?: false }): SetupDesiredProps<TTransformed, TProps, TBehavior>;
(
bot: Bot<TProps, TBehavior>,
payload: Partial<TPayload>,
extra: TExtra & { partial: true },
): Partial<SetupDesiredProps<TTransformed, TProps, TBehavior>>;
}
: // Even if we don't need to overload, since the 2 syntaxes have slightly different semantics, we use the method syntax in here as well
{ (bot: Bot<TProps, TBehavior>, payload: TPayload, extra?: TExtra): SetupDesiredProps<TTransformed, TProps, TBehavior> };
/**
* A collection of transformer functions for various Discord entities.
*
* @template TProps - The desired properties for the transformers.
* @template TBehavior - The behavior for handling desired properties.
*/
export type TransformerFunctions<TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior> = {
[K in keyof TransformerInformations]: TransformerFunction<
TProps,
TBehavior,
TransformerInformations[K]['payload'],
TransformerInformations[K]['transformed'],
TransformerInformations[K]['extra'],
TransformerInformations[K]['partial']
>;
};
/**
* A function that customizes the transformed object after the initial transformation.
*
* @template TProps - The desired properties for the transformer.
* @template TBehavior - The behavior for handling desired properties.
* @template TPayload - The type of the payload received from Discord.
* @template TTransformed - The type of the transformed object returned by the transformer.
* @template TExtra - Additional extra information that might be needed for customization.
* @template TPartial - Indicates if the transformer supports partial payloads.
*/
export type TransformerCustomizerFunction<
TProps extends TransformersDesiredProperties,
TBehavior extends DesiredPropertiesBehavior,
TPayload,
TTransformed,
TExtra = {},
TPartial extends boolean = false,
> = TPartial extends true
? // We use the method syntax for functions (...Params): ReturnType instead of the arrow syntax because it allows us to have overloads in the type
{
(
bot: Bot<TProps, TBehavior>,
payload: TPayload,
transformed: SetupDesiredProps<TTransformed, TProps, TBehavior>,
extra: TExtra & { partial: false },
): any;
(
bot: Bot<TProps, TBehavior>,
payload: Partial<TPayload>,
transformed: Partial<SetupDesiredProps<TTransformed, TProps, TBehavior>>,
extra: TExtra & { partial: true },
): any;
}
: // Even if we don't need to overload, since the 2 syntaxes have slightly different semantics, we use the method syntax in here as well
{
(bot: Bot<TProps, TBehavior>, payload: TPayload, transformed: SetupDesiredProps<TTransformed, TProps, TBehavior>, extra?: TExtra): any;
};
/**
* A collection of transformer customizer functions for various Discord entities.
*
* @template TProps - The desired properties for the transformers.
* @template TBehavior - The behavior for handling desired properties.
*/
export type TransformerCustomizers<TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior> = {
[K in keyof TransformerInformations]: TransformerCustomizerFunction<
TProps,
TBehavior,
TransformerInformations[K]['payload'],
TransformerInformations[K]['transformed'],
BigStringsToBigints<TransformerInformations[K]['extra']>,
TransformerInformations[K]['partial']
>;
};
/**
* Converting BigString properties in T to bigint, leaving other properties unchanged.
*
* @template T - The object type to transform.
*/
export type BigStringsToBigints<T> = {
[K in keyof T]: BigString extends T[K] ? bigint : T[K];
};
/**
* Calls a transformer customizer function with the provided parameters.
*
* @template TInfo - The key of the transformer information to use.
* @param customizer - The key of the transformer information to use.
* @param bot - The bot instance.
* @param payload - The original payload from Discord.
* @param transformed - The transformed object.
* @param extra - Additional extra information for the customizer.
* @returns The result of the customizer function.
*
* @remarks
* This function is used because it is hard to deal with the customizer overloads directly in the transformers.
*
* Since the overloads are present only with partial transformers, this function requires the partial extra, for non-partial transformers the normal function call can be used
*/
export function callCustomizer<TInfo extends keyof TransformerInformations>(
customizer: TInfo,
bot: Bot,
payload: TransformerInformations[TInfo]['payload'] | Partial<TransformerInformations[TInfo]['payload']>,
transformed:
| SetupDesiredProps<TransformerInformations[TInfo]['transformed'], TransformersDesiredProperties, DesiredPropertiesBehavior>
| Partial<SetupDesiredProps<TransformerInformations[TInfo]['transformed'], TransformersDesiredProperties, DesiredPropertiesBehavior>>,
extra: TransformerInformations[TInfo]['extra'] & { partial: boolean },
): any {
// The type of the customizer is not generalizable, so we use unknown, callCustomizer has the correct type and we cast it here
const customizerFn = bot.transformers.customizers[customizer] as (bot: Bot, payload: unknown, transformed: unknown, extra: unknown) => any;
return customizerFn(bot, payload, transformed, extra);
}