diff --git a/src/main/java/com/softawii/Main.java b/src/main/java/com/softawii/Main.java index 5eeed83..2771017 100644 --- a/src/main/java/com/softawii/Main.java +++ b/src/main/java/com/softawii/Main.java @@ -26,7 +26,7 @@ public static void main(String[] args) throws InterruptedException, NoSuchMethod JDABuilder builder = JDABuilder.createDefault(token); JDA JDA = builder.build(); - boolean reset = true; + boolean reset = false; CurupiraBoot curupira = new CurupiraBoot(JDA, context, reset, pkg); JDA.awaitReady(); diff --git a/src/main/java/com/softawii/curupira/example/Foo.java b/src/main/java/com/softawii/curupira/example/Foo.java index 8f384d2..73f5177 100644 --- a/src/main/java/com/softawii/curupira/example/Foo.java +++ b/src/main/java/com/softawii/curupira/example/Foo.java @@ -8,8 +8,10 @@ import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.utils.messages.MessagePollBuilder; +import net.dv8tion.jda.api.utils.messages.MessagePollData; -@DiscordController(value = "bar", description = "foo foo foo", parent = "foo") +@DiscordController(value = "bar", description = "foo foo foo", parent = "fuo") public class Foo { @DiscordCommand(name = "baz", description = "baz baz baz") @@ -23,10 +25,18 @@ public void baz(SlashCommandInteractionEvent event, } @DiscordCommand(name = "qux", description = "qux qux qux") - public void qux(SlashCommandInteractionEvent event, + public String qux(SlashCommandInteractionEvent event, @RequestInfo Member member, @DiscordParameter(name = "hello", description = "channel to send hello") MessageChannelUnion channel) { channel.sendMessage("hello chat").queue(); - event.reply("sent").setEphemeral(true).queue(); + return "Hello " + member.getEffectiveName(); + } + + @DiscordCommand(name = "charlie", description = "charlie charlie charlie") + public MessagePollData charlie( + @RequestInfo Member member, + @DiscordParameter(name = "poll", description = "pool name") String name) { + + return MessagePollData.builder(name).addAnswer("yes").addAnswer("no").build(); } } diff --git a/src/main/java/com/softawii/curupira/v2/annotations/DiscordController.java b/src/main/java/com/softawii/curupira/v2/annotations/DiscordController.java index b838acd..6d4c06b 100644 --- a/src/main/java/com/softawii/curupira/v2/annotations/DiscordController.java +++ b/src/main/java/com/softawii/curupira/v2/annotations/DiscordController.java @@ -1,5 +1,7 @@ package com.softawii.curupira.v2.annotations; +import net.dv8tion.jda.api.interactions.DiscordLocale; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -8,9 +10,13 @@ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface DiscordController { - + // Controller properties String value() default ""; String parent() default ""; String description() default ""; boolean hidden() default false; + // I8n properties + String resource() default ""; + DiscordLocale[] locales() default {}; + } diff --git a/src/main/java/com/softawii/curupira/v2/core/CommandHandler.java b/src/main/java/com/softawii/curupira/v2/core/CommandHandler.java index 88c7e21..94a2421 100644 --- a/src/main/java/com/softawii/curupira/v2/core/CommandHandler.java +++ b/src/main/java/com/softawii/curupira/v2/core/CommandHandler.java @@ -3,16 +3,12 @@ import com.softawii.curupira.v2.annotations.DiscordCommand; import com.softawii.curupira.v2.annotations.DiscordController; import com.softawii.curupira.v2.annotations.DiscordParameter; -import com.softawii.curupira.v2.parser.DiscordToJavaParser; import com.softawii.curupira.v2.parser.JavaToDiscordParser; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.events.interaction.command.GenericCommandInteractionEvent; -import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.CommandInteractionPayload; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; -import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; -import net.dv8tion.jda.internal.interactions.CommandDataImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,7 +17,6 @@ import java.lang.reflect.Parameter; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import static com.softawii.curupira.v2.parser.DiscordToJavaParser.getParameterFromEvent; @@ -105,7 +100,11 @@ private Object[] getParameters(CommandInteractionPayload event) { return parameters.toArray(); } - public void handle(GenericCommandInteractionEvent event) throws InvocationTargetException, IllegalAccessException { - method.invoke(instance, getParameters(event)); + public void execute(GenericCommandInteractionEvent event) throws InvocationTargetException, IllegalAccessException { + Object result = method.invoke(instance, getParameters(event)); + // something to reply + if(result != null) { + JavaToDiscordParser.responseFromCommandEvent(event, result); + } } } diff --git a/src/main/java/com/softawii/curupira/v2/core/CurupiraMapper.java b/src/main/java/com/softawii/curupira/v2/core/CurupiraMapper.java index 3923a1c..88162b2 100644 --- a/src/main/java/com/softawii/curupira/v2/core/CurupiraMapper.java +++ b/src/main/java/com/softawii/curupira/v2/core/CurupiraMapper.java @@ -6,7 +6,6 @@ import com.softawii.curupira.v2.utils.ScanUtils; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.interactions.commands.build.CommandData; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; import net.dv8tion.jda.api.interactions.commands.build.SubcommandGroupData; import net.dv8tion.jda.internal.interactions.CommandDataImpl; @@ -18,7 +17,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; class CurupiraMapper { @@ -47,8 +45,10 @@ public CurupiraMapper(JDA jda, ContextProvider context, boolean registerCommands private void apply() { if(registerCommandsToDiscord) { - for(Map.Entry entry : data.entrySet()) + for(Map.Entry entry : data.entrySet()) { + this.logger.info("Apply command: {}", entry.getValue()); jda.upsertCommand(entry.getValue()).queue(); + } } } @@ -116,6 +116,7 @@ else if(name.length == 2) { else if (name.length == 3) { this.data.get(name[0]).getSubcommandGroups().stream().filter(group -> group.getName().equals(name[1])).findFirst().ifPresentOrElse(group -> { SubcommandData subcommandData = new SubcommandData(name[2], commandInfo.description()); + subcommandData.addOptions(handler.getOptions()); group.addSubcommands(subcommandData); }, () -> { SubcommandGroupData groupData = new SubcommandGroupData(name[1], controllerInfo.description()); @@ -132,7 +133,7 @@ public void slashCommandInteractionReceived(SlashCommandInteractionEvent event) if(commands.containsKey(event.getFullCommandName())) { CommandHandler handler = commands.get(event.getFullCommandName()); try { - handler.handle(event); + handler.execute(event); } catch (InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/softawii/curupira/v2/parser/DiscordToJavaParser.java b/src/main/java/com/softawii/curupira/v2/parser/DiscordToJavaParser.java index 8288eb9..b79fdb1 100644 --- a/src/main/java/com/softawii/curupira/v2/parser/DiscordToJavaParser.java +++ b/src/main/java/com/softawii/curupira/v2/parser/DiscordToJavaParser.java @@ -13,6 +13,7 @@ import java.lang.reflect.Parameter; public class DiscordToJavaParser { + public static Object getParameterFromEvent(CommandInteractionPayload event, Parameter parameter) { if(parameter.getType().equals(SlashCommandInteractionEvent.class)) { return event; diff --git a/src/main/java/com/softawii/curupira/v2/parser/JavaToDiscordParser.java b/src/main/java/com/softawii/curupira/v2/parser/JavaToDiscordParser.java index 923dca9..dd70dae 100644 --- a/src/main/java/com/softawii/curupira/v2/parser/JavaToDiscordParser.java +++ b/src/main/java/com/softawii/curupira/v2/parser/JavaToDiscordParser.java @@ -1,11 +1,20 @@ package com.softawii.curupira.v2.parser; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; +import net.dv8tion.jda.api.events.interaction.command.GenericCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.modals.Modal; +import net.dv8tion.jda.api.utils.FileUpload; +import net.dv8tion.jda.api.utils.messages.MessageCreateData; +import net.dv8tion.jda.api.utils.messages.MessagePollData; + +import java.util.Collection; +import java.util.List; public class JavaToDiscordParser { @@ -33,4 +42,27 @@ public static OptionType getTypeFromClass(Class clazz) { } else throw new RuntimeException("Type not supported"); } + + public static void responseFromCommandEvent(GenericCommandInteractionEvent event, Object result) { + if(result instanceof String response) { + event.reply(response).queue(); + } else if(result instanceof MessageCreateData message) { + event.reply(message).queue(); + } else if(result instanceof Modal modal) { + event.replyModal(modal).queue(); + } else if(result instanceof MessageEmbed embed) { + event.replyEmbeds(embed).queue(); + } else if(result instanceof Collection collection && collection.stream().findFirst().get() instanceof MessageEmbed) { + Collection collectionEmbed = (Collection) collection; + event.replyEmbeds(collectionEmbed).queue(); + } + else if(result instanceof Collection collection && collection.stream().findFirst().get() instanceof FileUpload) { + Collection collectionFiles = (Collection) collection; + event.replyFiles(collectionFiles).queue(); + } else if(result instanceof MessagePollData poll) { + event.replyPoll(poll).queue(); + } else { + throw new RuntimeException("Type not supported"); + } + } }