Files
discordeno/packages/utils/src/interactions.ts
T
Skillz4KillzandJonathan Ho f8afb94aa0 feat: commandOptionsParser util (#2961)
* feat: commandOptionsParser util

* test(utils): fix missing import it

* fix: support mentionable and attachments

* fix: finish coverage

* fix: when typings fail gg

---------

Co-authored-by: Jonathan Ho <heiheiho000@gmail.com>
2023-04-04 11:47:49 +00:00

44 lines
1.8 KiB
TypeScript

import { ApplicationCommandOptionTypes, type DiscordInteraction } from '@discordeno/types'
export function commandOptionsParser(interaction: DiscordInteraction, options?: NonNullable<DiscordInteraction['data']>['options']): Record<string, any> {
if (!interaction.data) return {}
if (!options) options = interaction.data.options ?? []
const args: Record<string, any> = {}
for (const option of options) {
switch (option.type) {
case ApplicationCommandOptionTypes.SubCommandGroup:
case ApplicationCommandOptionTypes.SubCommand:
args[option.name] = commandOptionsParser(interaction, option.options)
break
case ApplicationCommandOptionTypes.Channel:
args[option.name] = interaction.data.resolved?.channels?.[option.value as string]
break
case ApplicationCommandOptionTypes.Role:
args[option.name] = interaction.data.resolved?.roles?.[option.value as string]
break
case ApplicationCommandOptionTypes.User:
args[option.name] = {
user: interaction.data.resolved?.users?.[option.value as string],
member: interaction.data.resolved?.members?.[option.value as string],
}
break
case ApplicationCommandOptionTypes.Attachment:
args[option.name] = interaction.data.resolved?.attachments?.[option.value as string]
break;
case ApplicationCommandOptionTypes.Mentionable:
// Mentionable are roles or users
args[option.name] = interaction.data.resolved?.roles?.[option.value as string] ?? {
user: interaction.data.resolved?.users?.[option.value as string],
member: interaction.data.resolved?.members?.[option.value as string],
}
break
default:
args[option.name] = option.value
}
}
return args
}