From e318e44752a3763080f4220bb8c0a56867e2af15 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:08:04 +0000 Subject: [PATCH] feat: interaction transformer new style --- packages/bot/src/transformers.ts | 36 +++++ packages/bot/src/transformers/interaction.ts | 158 ++++++++++++------- 2 files changed, 138 insertions(+), 56 deletions(-) diff --git a/packages/bot/src/transformers.ts b/packages/bot/src/transformers.ts index a0e0f1ce0..7390aaf1b 100644 --- a/packages/bot/src/transformers.ts +++ b/packages/bot/src/transformers.ts @@ -98,6 +98,7 @@ import type { BotInteractionResponse, DiscordComponent, DiscordInteractionRespon export interface Transformers { customizers: { + interaction: (bot: Bot, payload: DiscordInteraction, interaction: Interaction) => any; message: (bot: Bot, payload: DiscordMessage, message: Message) => any } desiredProperties: { @@ -191,6 +192,22 @@ export interface Transformers { publicUpdatesChannelId: boolean premiumProgressBarEnabled: boolean } + interaction: { + id: boolean + applicationId: boolean + type: boolean + guildId: boolean + channelId: boolean + member: boolean + user: boolean + token: boolean + version: boolean + message: boolean + data: boolean + locale: boolean + guildLocale: boolean + appPermissions: boolean + } invite: { channelId: boolean code: boolean @@ -379,6 +396,9 @@ export interface Transformers { export function createTransformers(options: Partial): Transformers { return { customizers: { + interaction(bot, payload, interaction) { + return interaction + }, message(bot, payload, message) { return message }, @@ -474,6 +494,22 @@ export function createTransformers(options: Partial): Transformers publicUpdatesChannelId: false, premiumProgressBarEnabled: false, }, + interaction: { + id: false, + applicationId: false, + type: false, + guildId: false, + channelId: false, + member: false, + user: false, + token: false, + version: false, + message: false, + data: false, + locale: false, + guildLocale: false, + appPermissions: false, + }, invite: { channelId: false, code: false, diff --git a/packages/bot/src/transformers/interaction.ts b/packages/bot/src/transformers/interaction.ts index b7b388249..ac0ccfe41 100644 --- a/packages/bot/src/transformers/interaction.ts +++ b/packages/bot/src/transformers/interaction.ts @@ -1,57 +1,100 @@ -import type { ChannelTypes, DiscordInteraction, DiscordInteractionDataOption } from '@discordeno/types' +import type { + ApplicationCommandOptionTypes, + ChannelTypes, + DiscordInteraction, + DiscordInteractionDataOption, + InteractionTypes, + MessageComponentTypes, +} from '@discordeno/types' import { Collection } from '@discordeno/utils' -import type { Bot } from '../index.js' -import type { Optionalize } from '../optionalize.js' +import type { Bot, Component } from '../index.js' import type { DiscordInteractionDataResolved } from '../typings.js' import type { Attachment } from './attachment.js' import type { Member, User } from './member.js' import type { Message } from './message.js' import type { Role } from './role.js' -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type -export function transformInteraction(bot: Bot, payload: DiscordInteraction) { +export interface Interaction { + /** Id of the interaction */ + id: bigint + /** Id of the application this interaction is for */ + applicationId: bigint + /** The type of interaction */ + type: InteractionTypes + /** The guild it was sent from */ + guildId?: bigint + /** The channel it was sent from */ + channelId?: bigint + /** Guild member data for the invoking user, including permissions */ + member?: Member + /** User object for the invoking user, if invoked in a DM */ + user: User + /** A continuation token for responding to the interaction */ + token: string + /** Read-only property, always `1` */ + version: 1 + /** For the message the button was attached to */ + message?: Message + /** the command data payload */ + data?: { + componentType?: MessageComponentTypes + customId?: string + components?: Component[] + values?: string[] + name: string + resolved?: InteractionDataResolved + options?: InteractionDataOption[] + id?: bigint + targetId?: bigint + guildId?: bigint + } + /** The selected language of the invoking user */ + locale?: string + /** The guild's preferred locale, if invoked in a guild */ + guildLocale?: string + /** The computed permissions for a bot or app in the context of a specific interaction (including channel overwrites) */ + appPermissions: bigint +} + +export function transformInteraction(bot: Bot, payload: DiscordInteraction): Interaction { const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined const user = bot.transformers.user(bot, payload.member?.user ?? payload.user!) - const interaction = { - // UNTRANSFORMED STUFF HERE - type: payload.type, - token: payload.token, - version: payload.version, - locale: payload.locale, - guildLocale: payload.guild_locale, + const interaction: Interaction = Object.create({}) + const props = bot.transformers.desiredProperties.interaction - // TRANSFORMED STUFF BELOW - guildId, - user, - id: bot.transformers.snowflake(payload.id), - applicationId: bot.transformers.snowflake(payload.application_id), - appPermissions: payload.app_permissions ? bot.transformers.snowflake(payload.app_permissions) : undefined, - message: payload.message ? bot.transformers.message(bot, payload.message) : undefined, - channelId: payload.channel_id ? bot.transformers.snowflake(payload.channel_id) : undefined, - member: payload.member && guildId ? bot.transformers.member(bot, payload.member, guildId, user.id) : undefined, - - data: payload.data - ? { - componentType: payload.data.component_type, - customId: payload.data.custom_id, - components: payload.data.components?.map((component) => bot.transformers.component(bot, component)), - values: payload.data.values, - id: payload.data.id ? bot.transformers.snowflake(payload.data.id) : undefined, - name: payload.data.name, - resolved: payload.data.resolved ? transformInteractionDataResolved(bot, payload.data.resolved, guildId) : undefined, - options: payload.data.options?.map((opt) => bot.transformers.interactionDataOptions(bot, opt)), - targetId: payload.data.target_id ? bot.transformers.snowflake(payload.data.target_id) : undefined, - guildId: payload.data.guild_id ? bot.transformers.snowflake(payload.data.guild_id) : undefined, - } - : undefined, + if (payload.id && props.id) interaction.id = bot.transformers.snowflake(payload.id) + if (payload.application_id && props.applicationId) interaction.applicationId = bot.transformers.snowflake(payload.application_id) + if (payload.type && props.type) interaction.type = payload.type + if (payload.token && props.token) interaction.token = payload.token + if (payload.version && props.version) interaction.version = payload.version + if (payload.locale && props.locale) interaction.locale = payload.locale + if (payload.guild_locale && props.guildLocale) interaction.guildLocale = payload.guild_locale + if (guildId && props.guildId) interaction.guildId = guildId + if (props.user) interaction.user = user + if (payload.app_permissions && props.appPermissions) interaction.appPermissions = bot.transformers.snowflake(payload.app_permissions) + if (payload.message && props.message) interaction.message = bot.transformers.message(bot, payload.message) + if (payload.channel_id && props.channelId) interaction.channelId = bot.transformers.snowflake(payload.channel_id) + if (payload.member && guildId && props.member) interaction.member = bot.transformers.member(bot, payload.member, guildId, user.id) + if (payload.data && props.data) { + interaction.data = { + componentType: payload.data.component_type, + customId: payload.data.custom_id, + components: payload.data.components?.map((component) => bot.transformers.component(bot, component)), + values: payload.data.values, + id: payload.data.id ? bot.transformers.snowflake(payload.data.id) : undefined, + name: payload.data.name, + resolved: payload.data.resolved ? transformInteractionDataResolved(bot, payload.data.resolved, guildId) : undefined, + options: payload.data.options?.map((opt) => bot.transformers.interactionDataOptions(bot, opt)), + targetId: payload.data.target_id ? bot.transformers.snowflake(payload.data.target_id) : undefined, + guildId: payload.data.guild_id ? bot.transformers.snowflake(payload.data.guild_id) : undefined, + } } - return interaction as Optionalize + return bot.transformers.customizers.interaction(bot, payload, interaction) } -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type -export function transformInteractionDataOption(bot: Bot, option: DiscordInteractionDataOption) { +export function transformInteractionDataOption(bot: Bot, option: DiscordInteractionDataOption): InteractionDataOption { const opt = { name: option.name, type: option.type, @@ -60,19 +103,11 @@ export function transformInteractionDataOption(bot: Bot, option: DiscordInteract focused: option.focused, } - return opt as Optionalize + return opt } -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type -export function transformInteractionDataResolved(bot: Bot, resolved: DiscordInteractionDataResolved, guildId?: bigint) { - const transformed: { - messages?: Collection - users?: Collection - members?: Collection - roles?: Collection - channels?: Collection - attachments?: Collection - } = {} +export function transformInteractionDataResolved(bot: Bot, resolved: DiscordInteractionDataResolved, guildId?: bigint): InteractionDataResolved { + const transformed: InteractionDataResolved = {} if (resolved.messages) { transformed.messages = new Collection( @@ -142,11 +177,22 @@ export function transformInteractionDataResolved(bot: Bot, resolved: DiscordInte ) } - // TODO: fix - // return transformed as Optionalize - return transformed as any + return transformed } -export interface Interaction extends ReturnType {} -export interface InteractionDataResolved extends ReturnType {} -export interface InteractionDataOption extends ReturnType {} +export interface InteractionDataResolved { + messages?: Collection + users?: Collection + members?: Collection + roles?: Collection + channels?: Collection + attachments?: Collection +} + +export interface InteractionDataOption { + name: string + type: ApplicationCommandOptionTypes + value?: string | number | boolean + options?: InteractionDataOption[] + focused?: boolean +}