-
Notifications
You must be signed in to change notification settings - Fork 4
Creating parameter resolvers
freya022 edited this page Jan 21, 2022
·
5 revisions
The reason why your commands with method signatures like public void kick(GuildSlashEvent event, @AppOption User user, @AppOption String reason)
works is because there are default parameter resolvers, they're registered automatically when ParameterResolvers is loaded. They can resolve regex command parameters / application command parameters and also button parameters
To create a new parameter resolver, you have the following steps:
- Create a new class
- Make it extend
ParameterResolver
- Use the
super
constructor to indicate the type of the resolved object - Implement one or more of these interfaces described in
ParameterResolver
- Register the resolver with ExtensionsBuilder#registerParameterResolver
//Create the resolver
public class TimestampResolver extends ParameterResolver implements SlashParameterResolver {
public TimestampResolver() {
super(Timestamp.class);
}
@Override
public Object resolve(@NotNull BContext context, @NotNull SlashCommandInfo info, @NotNull CommandInteractionPayload event, @NotNull OptionMapping optionMapping) {
final Matcher timestampMatcher = MARKDOWN.matcher(optionMapping.getAsString());
if (!timestampMatcher.find()) return null; //Avoid expensive exceptions from JDA
final String format = timestampMatcher.group("style");
final long time = Long.parseLong(timestampMatcher.group("time"));
return (format == null ? DEFAULT : fromStyle(format)).atTimestamp(time);
}
@Override
@NotNull
public OptionType getOptionType() {
return OptionType.STRING;
}
}
CommandsBuilder.newBuilder()
.extensionsBuilder(extensionsBuilder ->
extensionsBuilder.registerParameterResolver(new TimestampResolver())
)
.build(jda, "com.freya02.bot.wiki.paramresolver.commands");
public class SlashParamResolverTest extends ApplicationCommand {
@JDASlashCommand(name = "paramres")
public void run(GuildSlashEvent event, @AppOption Timestamp timestamp) {
event.reply("Your timestamp as relative: " + TimeFormat.RELATIVE.format(timestamp.getTimestamp())).queue();
}
}