diff --git a/bot.ts b/bot.ts index a0455068c..37c2ffc48 100644 --- a/bot.ts +++ b/bot.ts @@ -138,6 +138,10 @@ import { } from "./transformers/applicationCommandOptionChoice.ts"; import { transformEmbedToDiscordEmbed } from "./transformers/reverse/embed.ts"; import { transformComponentToDiscordComponent } from "./transformers/reverse/component.ts"; +import { transformActivityToDiscordActivity } from "./transformers/reverse/activity.ts"; +import { transformTeamToDiscordTeam } from "./transformers/reverse/team.ts"; +import { transformMemberToDiscordMember, transformUserToDiscordUser } from "./transformers/reverse/member.ts"; +import { transformApplicationToDiscordApplication } from "./transformers/reverse/application.ts"; import { getBotIdFromToken, removeTokenPrefix } from "./util/token.ts"; import { CreateShardManager } from "./gateway/manager/shardManager.ts"; import { AutoModerationRule, transformAutoModerationRule } from "./transformers/automodRule.ts"; @@ -396,6 +400,11 @@ export interface Transformers { reverse: { embed: (bot: Bot, payload: Embed) => DiscordEmbed; component: (bot: Bot, payload: Component) => DiscordComponent; + activity: (bot: Bot, payload: Activity) => DiscordActivity; + member: (bot: Bot, payload: Member) => DiscordMember; + user: (bot: Bot, payload: User) => DiscordUser; + team: (bot: Bot, payload: Team) => DiscordTeam; + application: (bot: Bot, payload: Application) => DiscordApplication; }; snowflake: (snowflake: string) => bigint; gatewayBot: (payload: DiscordGetGatewayBot) => GetGatewayBot; @@ -449,6 +458,11 @@ export function createTransformers(options: Partial) { reverse: { embed: options.reverse?.embed || transformEmbedToDiscordEmbed, component: options.reverse?.component || transformComponentToDiscordComponent, + activity: options.reverse?.activity || transformActivityToDiscordActivity, + member: options.reverse?.member || transformMemberToDiscordMember, + user: options.reverse?.user || transformUserToDiscordUser, + team: options.reverse?.team || transformTeamToDiscordTeam, + application: options.reverse?.application || transformApplicationToDiscordApplication, }, automodRule: options.automodRule || transformAutoModerationRule, automodActionExecution: options.automodActionExecution || transformAutoModerationActionExecution, diff --git a/transformers/mod.ts b/transformers/mod.ts index d373feda1..d58ec74bf 100644 --- a/transformers/mod.ts +++ b/transformers/mod.ts @@ -32,3 +32,5 @@ export * from "./webhook.ts"; export * from "./welcomeScreen.ts"; export * from "./widget.ts"; export * from "./widgetSettings.ts"; + +export * from "./reverse/mod.ts"; diff --git a/transformers/reverse/activity.ts b/transformers/reverse/activity.ts new file mode 100644 index 000000000..a5c8a6335 --- /dev/null +++ b/transformers/reverse/activity.ts @@ -0,0 +1,46 @@ +import { Bot } from "../../bot.ts"; +import { DiscordActivity } from "../../types/discord.ts"; +import { Activity } from "../activity.ts"; + +export function transformActivityToDiscordActivity(bot: Bot, payload: Activity): DiscordActivity { + return { + name: payload.name, + type: payload.type, + url: payload.url ?? undefined, + created_at: payload.createdAt, + timestamps: { + start: payload.startedAt, + end: payload.endedAt, + }, + application_id: payload.applicationId ? bot.utils.bigintToSnowflake(payload.applicationId) : undefined, + details: payload.details ?? undefined, + state: payload.state ?? undefined, + emoji: payload.emoji + ? { + name: payload.emoji.name, + animated: payload.emoji.animated, + id: payload.emoji.id ? bot.utils.bigintToSnowflake(payload.emoji.id) : undefined, + } + : undefined, + party: { + id: payload.partyId, + size: payload.partyCurrentSize && payload.partyMaxSize + ? [payload.partyCurrentSize, payload.partyMaxSize] + : undefined, + }, + assets: { + large_image: payload.largeImage, + large_text: payload.largeText, + small_image: payload.largeImage, + small_text: payload.largeText, + }, + secrets: { + join: payload.join, + spectate: payload.spectate, + match: payload.match, + }, + instance: payload.instance, + flags: payload.flags, + buttons: payload.buttons, + }; +} diff --git a/transformers/reverse/application.ts b/transformers/reverse/application.ts new file mode 100644 index 000000000..db746e255 --- /dev/null +++ b/transformers/reverse/application.ts @@ -0,0 +1,26 @@ +import { Bot } from "../../bot.ts"; +import { DiscordApplication } from "../../types/discord.ts"; +import { Application } from "../application.ts"; + +export function transformApplicationToDiscordApplication(bot: Bot, payload: Application): DiscordApplication { + return { + name: payload.name, + description: payload.description, + rpc_origins: payload.rpcOrigins, + bot_public: payload.botPublic, + bot_require_code_grant: payload.botRequireCodeGrant, + terms_of_service_url: payload.termsOfServiceUrl, + privacy_policy_url: payload.privacyPolicyUrl, + verify_key: payload.verifyKey, + primary_sku_id: payload.primarySkuId, + slug: payload.slug, + cover_image: payload.coverImage ? bot.utils.iconBigintToHash(payload.coverImage) : undefined, + flags: payload.flags, + + id: bot.utils.bigintToSnowflake(payload.id), + icon: payload.icon ? bot.utils.iconBigintToHash(payload.icon) : null, + owner: payload.owner ? bot.transformers.reverse.user(bot, payload.owner) : undefined, + team: payload.team ? bot.transformers.reverse.team(bot, payload.team) : null, + guild_id: payload.guildId ? bot.utils.bigintToSnowflake(payload.guildId) : undefined, + }; +} diff --git a/transformers/reverse/member.ts b/transformers/reverse/member.ts new file mode 100644 index 000000000..c3aa8aa18 --- /dev/null +++ b/transformers/reverse/member.ts @@ -0,0 +1,38 @@ +import type { Bot } from "../../bot.ts"; +import { DiscordMember, DiscordUser } from "../../types/discord.ts"; +import { Member, User } from "../member.ts"; + +export function transformUserToDiscordUser(bot: Bot, payload: User): DiscordUser { + return { + id: bot.utils.bigintToSnowflake(payload.id), + username: payload.username, + discriminator: payload.discriminator, + avatar: payload.avatar ? bot.utils.iconBigintToHash(payload.avatar) : null, + locale: payload.locale, + email: payload.email ?? undefined, + flags: payload.flags, + premium_type: payload.premiumType, + public_flags: payload.publicFlags, + bot: payload.toggles.bot, + system: payload.toggles.system, + mfa_enabled: payload.toggles.mfaEnabled, + verified: payload.toggles.verified, + }; +} + +export function transformMemberToDiscordMember(bot: Bot, payload: Member): DiscordMember { + return { + nick: payload.nick ?? undefined, + roles: payload.roles.map((id) => bot.utils.bigintToSnowflake(id)), + joined_at: new Date(payload.joinedAt).toISOString(), + premium_since: payload.premiumSince ? new Date(payload.premiumSince).toISOString() : undefined, + avatar: payload.avatar ? bot.utils.iconBigintToHash(payload.avatar) : undefined, + permissions: payload.permissions ? bot.utils.bigintToSnowflake(payload.permissions) : undefined, + communication_disabled_until: payload.communicationDisabledUntil + ? new Date(payload.communicationDisabledUntil).toISOString() + : undefined, + deaf: payload.toggles.deaf, + mute: payload.toggles.mute, + pending: payload.toggles.pending, + }; +} diff --git a/transformers/reverse/mod.ts b/transformers/reverse/mod.ts new file mode 100644 index 000000000..01b32d0f1 --- /dev/null +++ b/transformers/reverse/mod.ts @@ -0,0 +1,6 @@ +export * from "./activity.ts"; +export * from "./application.ts"; +export * from "./component.ts"; +export * from "./embed.ts"; +export * from "./member.ts"; +export * from "./team.ts"; diff --git a/transformers/reverse/team.ts b/transformers/reverse/team.ts new file mode 100644 index 000000000..dd3ad6f99 --- /dev/null +++ b/transformers/reverse/team.ts @@ -0,0 +1,21 @@ +import { Bot } from "../../bot.ts"; +import { DiscordTeam } from "../../types/discord.ts"; +import { Team } from "../team.ts"; + +export function transformTeamToDiscordTeam(bot: Bot, payload: Team): DiscordTeam { + const id = bot.utils.bigintToSnowflake(payload.id); + + return { + name: payload.name, + + id, + icon: payload.icon ? bot.utils.iconBigintToHash(payload.icon) : null, + owner_user_id: bot.utils.bigintToSnowflake(payload.ownerUserId), + members: payload.members.map((member) => ({ + membership_state: member.membershipState, + permissions: member.permissions, + team_id: id, + user: bot.transformers.reverse.user(bot, member.user), + })), + }; +}