feat: reverse transformers (#2305)

* feat: reverse transformer

* fix: cap

* deno fmt

* refactor: change to use toggles list

* Revert "refactor: change to use toggles list"

This reverts commit 31f170f31b.

* fix: forget reverse transformer
This commit is contained in:
Jonathan Ho
2022-06-17 23:38:18 +08:00
committed by GitHub
parent 5af4c2066e
commit dc1ca7c005
7 changed files with 153 additions and 0 deletions

14
bot.ts
View File

@@ -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<Transformers>) {
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,

View File

@@ -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";

View File

@@ -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,
};
}

View File

@@ -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,
};
}

View File

@@ -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,
};
}

View File

@@ -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";

View File

@@ -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),
})),
};
}