diff --git a/src/CommandManager.ts b/src/CommandManager.ts index ec8d408..94f68c0 100644 --- a/src/CommandManager.ts +++ b/src/CommandManager.ts @@ -4,6 +4,7 @@ import { BooleanParameter, InputParameter, NumberParameter, + ObjectParameter, StringParameter, } from "./Parameter.js"; import { Command } from "./Command.js"; @@ -216,6 +217,10 @@ export class CommandManager { case "channel": case "role": case "user": + parameters.push( + new ObjectParameter(p, inputParam?.value) + ); + break; case "string": parameters.push( new StringParameter(p, inputParam?.value) diff --git a/src/Parameter.ts b/src/Parameter.ts index 0e6ca56..a8bd2af 100644 --- a/src/Parameter.ts +++ b/src/Parameter.ts @@ -1,3 +1,4 @@ +import { Guild } from "discord.js"; import { ParameterType, ParameterResolvable, Choice } from "./types.js"; export interface ParameterSchema { name: string; @@ -72,3 +73,27 @@ export class NumberParameter extends InputParameter { super(parameter, parseFloat(value ? value.toString() : "")); } } +export class ObjectParameter extends InputParameter { + constructor(parameter: Parameter, value: ParameterResolvable) { + if ( + parameter.type != "channel" && + parameter.type != "mentionable" && + parameter.type != "user" && + parameter.type != "role" + ) { + throw new Error(`Parameter type mismatch`); + } + super(parameter, value); + } + + async toObject(guild: Guild, type: "channel" | "user" | "role") { + switch (type) { + case "channel": + return await guild.channels.fetch(this.value?.toString() || ""); + case "role": + return await guild.roles.fetch(this.value?.toString() || ""); + case "user": + return await guild.members.fetch(this.value?.toString() || ""); + } + } +} diff --git a/src/types.ts b/src/types.ts index 8241101..c209b2b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,8 +1,13 @@ import { + CategoryChannel, ClientOptions, ColorResolvable, CommandInteraction, + GuildMember, ReplyMessageOptions, + Role, + TextChannel, + VoiceChannel, } from "discord.js"; import { InputParameter, ParameterSchema } from "./Parameter.js"; import { PermissionResolvable, Message, MessageEmbed } from "discord.js"; @@ -66,7 +71,16 @@ export type ParameterType = | "role" | "channel" | "mentionable"; -export type ParameterResolvable = string | boolean | number | undefined; +export type ParameterResolvable = + | string + | boolean + | number + | Role + | GuildMember + | TextChannel + | VoiceChannel + | CategoryChannel + | undefined; export interface Choice { name: string; value: string;