mirror of
https://github.com/discordeno/discordeno.git
synced 2026-09-21 18:50:20 +00:00
784 lines
44 KiB
TypeScript
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);
|
|
}
|