Compare commits
	
		
			2 Commits
		
	
	
		
			f32c7045a1
			...
			432db43bf5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 432db43bf5 | |||
| 7a2c15d877 | 
| @@ -0,0 +1,51 @@ | |||||||
|  | package net.tomatentum.marinara.interaction.methods; | ||||||
|  |  | ||||||
|  | import java.lang.reflect.Method; | ||||||
|  |  | ||||||
|  | import net.tomatentum.marinara.Marinara; | ||||||
|  | import net.tomatentum.marinara.interaction.InteractionHandler; | ||||||
|  | import net.tomatentum.marinara.interaction.InteractionType; | ||||||
|  | import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition; | ||||||
|  | import net.tomatentum.marinara.parser.AnnotationParser; | ||||||
|  | import net.tomatentum.marinara.parser.SlashCommandParser; | ||||||
|  |  | ||||||
|  | public class AutoCompleteInteractionMethod extends InteractionMethod { | ||||||
|  |  | ||||||
|  |     private ExecutableSlashCommandDefinition commandDefinition; | ||||||
|  |  | ||||||
|  |     public AutoCompleteInteractionMethod(Method method,  | ||||||
|  |         InteractionHandler handler,  | ||||||
|  |         Marinara marinara | ||||||
|  |         ) { | ||||||
|  |         super(method, handler, marinara); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public AnnotationParser[] getParsers() { | ||||||
|  |         return new AnnotationParser[] {  | ||||||
|  |             new SlashCommandParser(method, (x) -> { this.commandDefinition = x; } )  | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Object getParameter(Object context, int index) { | ||||||
|  |         Class<?> type = getMethod().getParameterTypes()[index+1]; | ||||||
|  |         Object autocompleteOptionValue = marinara.getWrapper().getContextObjectProvider().getAutocompleteFocusedOption(context); | ||||||
|  |         if (autocompleteOptionValue != null) | ||||||
|  |             return autocompleteOptionValue; | ||||||
|  |  | ||||||
|  |         return marinara.getWrapper().getContextObjectProvider().getComponentContextObject(context, type); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean canRun(Object context) { | ||||||
|  |         ExecutableSlashCommandDefinition other = marinara.getWrapper().getCommandDefinition(context); | ||||||
|  |         return commandDefinition.equals(other); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public InteractionType getType() { | ||||||
|  |         return InteractionType.AUTOCOMPLETE; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  | } | ||||||
| @@ -24,9 +24,9 @@ public class ButtonInteractionMethod extends InteractionMethod { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Object getParameter(Object parameter, int index) { |     public Object getParameter(Object context, int index) { | ||||||
|         Class<?> type = getMethod().getParameterTypes()[index+1]; |         Class<?> type = getMethod().getParameterTypes()[index+1]; | ||||||
|         return marinara.getWrapper().getComponentContextObject(parameter, type); |         return marinara.getWrapper().getContextObjectProvider().getComponentContextObject(context, type); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -38,4 +38,5 @@ public class ButtonInteractionMethod extends InteractionMethod { | |||||||
|     public InteractionType getType() { |     public InteractionType getType() { | ||||||
|         return InteractionType.BUTTON; |         return InteractionType.BUTTON; | ||||||
|     } |     } | ||||||
|  |      | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import net.tomatentum.marinara.Marinara; | |||||||
| import net.tomatentum.marinara.checks.AppliedCheck; | import net.tomatentum.marinara.checks.AppliedCheck; | ||||||
| import net.tomatentum.marinara.interaction.InteractionHandler; | import net.tomatentum.marinara.interaction.InteractionHandler; | ||||||
| import net.tomatentum.marinara.interaction.InteractionType; | import net.tomatentum.marinara.interaction.InteractionType; | ||||||
|  | import net.tomatentum.marinara.interaction.annotation.AutoComplete; | ||||||
| import net.tomatentum.marinara.interaction.annotation.Button; | import net.tomatentum.marinara.interaction.annotation.Button; | ||||||
| import net.tomatentum.marinara.interaction.commands.annotation.SlashCommand; | import net.tomatentum.marinara.interaction.commands.annotation.SlashCommand; | ||||||
| import net.tomatentum.marinara.interaction.commands.annotation.SubCommand; | import net.tomatentum.marinara.interaction.commands.annotation.SubCommand; | ||||||
| @@ -20,6 +21,8 @@ import net.tomatentum.marinara.parser.InteractionCheckParser; | |||||||
| public abstract class InteractionMethod { | public abstract class InteractionMethod { | ||||||
|  |  | ||||||
|     public static InteractionMethod create(Method method, InteractionHandler handler, Marinara marinara) { |     public static InteractionMethod create(Method method, InteractionHandler handler, Marinara marinara) { | ||||||
|  |         if (method.isAnnotationPresent(AutoComplete.class)) | ||||||
|  |             return new AutoCompleteInteractionMethod(method, handler, marinara); | ||||||
|         if (method.isAnnotationPresent(SlashCommand.class) || method.isAnnotationPresent(SubCommand.class)) |         if (method.isAnnotationPresent(SlashCommand.class) || method.isAnnotationPresent(SubCommand.class)) | ||||||
|             return new SlashCommandInteractionMethod(method, handler, marinara); |             return new SlashCommandInteractionMethod(method, handler, marinara); | ||||||
|         if (method.isAnnotationPresent(Button.class)) |         if (method.isAnnotationPresent(Button.class)) | ||||||
| @@ -53,7 +56,7 @@ public abstract class InteractionMethod { | |||||||
|  |  | ||||||
|     public abstract AnnotationParser[] getParsers(); |     public abstract AnnotationParser[] getParsers(); | ||||||
|  |  | ||||||
|     public abstract Object getParameter(Object parameter, int index); |     public abstract Object getParameter(Object context, int index); | ||||||
|  |  | ||||||
|     public abstract boolean canRun(Object context); |     public abstract boolean canRun(Object context); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ public class SlashCommandInteractionMethod extends InteractionMethod { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Object getParameter(Object context, int index) { |     public Object getParameter(Object context, int index) { | ||||||
|         return marinara.getWrapper().convertCommandOption(context, commandDefinition.options()[index].type(), commandDefinition.options()[index].name()); |         return marinara.getWrapper().getContextObjectProvider().convertCommandOption(context, commandDefinition.options()[index].name()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -0,0 +1,11 @@ | |||||||
|  | package net.tomatentum.marinara.wrapper; | ||||||
|  |  | ||||||
|  | public interface ContextObjectProvider { | ||||||
|  |  | ||||||
|  |     public Object convertCommandOption(Object context, String optionName); | ||||||
|  |  | ||||||
|  |     public Object getComponentContextObject(Object context, Class<?> type); | ||||||
|  |     public Object getInteractionContextObject(Object context, Class<?> type); | ||||||
|  |  | ||||||
|  |     public Object getAutocompleteFocusedOption(Object context); | ||||||
|  | } | ||||||
| @@ -6,7 +6,6 @@ import java.util.function.Consumer; | |||||||
|  |  | ||||||
| import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; | import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; | ||||||
| import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition; | import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition; | ||||||
| import net.tomatentum.marinara.interaction.commands.option.SlashCommandOptionType; |  | ||||||
| import net.tomatentum.marinara.interaction.InteractionType; | import net.tomatentum.marinara.interaction.InteractionType; | ||||||
|  |  | ||||||
| public abstract class LibraryWrapper { | public abstract class LibraryWrapper { | ||||||
| @@ -17,7 +16,6 @@ public abstract class LibraryWrapper { | |||||||
|         interactionSubscriber = new ArrayList<>(); |         interactionSubscriber = new ArrayList<>(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     public void handleInteraction(Object context) { |     public void handleInteraction(Object context) { | ||||||
|         interactionSubscriber.forEach((o) -> o.accept(context)); |         interactionSubscriber.forEach((o) -> o.accept(context)); | ||||||
|     } |     } | ||||||
| @@ -32,9 +30,10 @@ public abstract class LibraryWrapper { | |||||||
|     public abstract InteractionType getInteractionType(Class<?> clazz); |     public abstract InteractionType getInteractionType(Class<?> clazz); | ||||||
|  |  | ||||||
|     public abstract void registerSlashCommands(SlashCommandDefinition[] defs);  |     public abstract void registerSlashCommands(SlashCommandDefinition[] defs);  | ||||||
|     public abstract Object convertCommandOption(Object context, SlashCommandOptionType type, String optionName); |  | ||||||
|     public abstract ExecutableSlashCommandDefinition getCommandDefinition(Object context); |     public abstract ExecutableSlashCommandDefinition getCommandDefinition(Object context); | ||||||
|  |  | ||||||
|     public abstract String getButtonId(Object context); |     public abstract String getButtonId(Object context); | ||||||
|     public abstract Object getComponentContextObject(Object context, Class<?> type); |  | ||||||
|  |     public abstract ContextObjectProvider getContextObjectProvider(); | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -0,0 +1,108 @@ | |||||||
|  | package net.tomatentum.marinara.wrapper.javacord; | ||||||
|  |  | ||||||
|  | import org.javacord.api.interaction.AutocompleteInteraction; | ||||||
|  | import org.javacord.api.interaction.ButtonInteraction; | ||||||
|  | import org.javacord.api.interaction.SlashCommandInteraction; | ||||||
|  | import org.javacord.api.interaction.SlashCommandInteractionOption; | ||||||
|  |  | ||||||
|  | import net.tomatentum.marinara.wrapper.ContextObjectProvider; | ||||||
|  |  | ||||||
|  | public class JavacordContextObjectProvider implements ContextObjectProvider { | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Object convertCommandOption(Object context, String optionName) { | ||||||
|  |         if (!(context instanceof SlashCommandInteraction)) | ||||||
|  |             return null; | ||||||
|  |         SlashCommandInteraction interaction = (SlashCommandInteraction) context; | ||||||
|  |         if (!interaction.getArguments().isEmpty()) | ||||||
|  |             return getOptionValue(interaction.getOptionByName(optionName).get()); | ||||||
|  |  | ||||||
|  |         SlashCommandInteractionOption subCommandOption = interaction.getOptions().getFirst(); | ||||||
|  |  | ||||||
|  |         if (!subCommandOption.getOptions().isEmpty()) | ||||||
|  |             subCommandOption = subCommandOption.getOptions().getFirst(); | ||||||
|  |  | ||||||
|  |         return getOptionValue(subCommandOption.getOptionByName(optionName).get()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private Object getOptionValue(SlashCommandInteractionOption option) { | ||||||
|  |         switch (getOptionType(option)) { | ||||||
|  |             case ATTACHMENT: | ||||||
|  |                 return option.getAttachmentValue().get(); | ||||||
|  |             case BOOLEAN: | ||||||
|  |                 return option.getBooleanValue().get(); | ||||||
|  |             case CHANNEL: | ||||||
|  |                 return option.getChannelValue().get(); | ||||||
|  |             case DECIMAL: | ||||||
|  |                 return option.getDecimalValue().get(); | ||||||
|  |             case LONG: | ||||||
|  |                 return option.getLongValue().get(); | ||||||
|  |             case MENTIONABLE: | ||||||
|  |                 return option.getMentionableValue().get(); | ||||||
|  |             case ROLE: | ||||||
|  |                 return option.getRoleValue().get(); | ||||||
|  |             case STRING: | ||||||
|  |                 return option.getStringValue().get(); | ||||||
|  |             case USER: | ||||||
|  |                 return option.getUserValue().get(); | ||||||
|  |             default: | ||||||
|  |                 return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private org.javacord.api.interaction.SlashCommandOptionType getOptionType(SlashCommandInteractionOption option) { | ||||||
|  |         if (option.getAttachmentValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.ATTACHMENT; | ||||||
|  |         if (option.getBooleanValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.BOOLEAN; | ||||||
|  |         if (option.getChannelValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.CHANNEL; | ||||||
|  |         if (option.getDecimalValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.DECIMAL; | ||||||
|  |         if (option.getLongValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.LONG; | ||||||
|  |         if (option.getMentionableValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.MENTIONABLE; | ||||||
|  |         if (option.getRoleValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.ROLE; | ||||||
|  |         if (option.getStringValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.ATTACHMENT; | ||||||
|  |         if (option.getUserValue().isPresent()) | ||||||
|  |             return org.javacord.api.interaction.SlashCommandOptionType.USER; | ||||||
|  |  | ||||||
|  |         return org.javacord.api.interaction.SlashCommandOptionType.UNKNOWN; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Object getComponentContextObject(Object context, Class<?> type) { | ||||||
|  |         ButtonInteraction button = (ButtonInteraction) context; | ||||||
|  |         switch (type.getName()) { | ||||||
|  |             case "org.javacord.api.entity.message.Message": | ||||||
|  |                 return button.getMessage(); | ||||||
|  |             default: | ||||||
|  |                 return getInteractionContextObject(context, type); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Object getInteractionContextObject(Object context, Class<?> type) { | ||||||
|  |         ButtonInteraction button = (ButtonInteraction) context; | ||||||
|  |         switch (type.getName()) { | ||||||
|  |             case "org.javacord.api.entity.channel.TextChannel": | ||||||
|  |                 return button.getChannel().orElse(null); | ||||||
|  |             case "org.javacord.api.entity.server.Server": | ||||||
|  |                 return button.getServer().orElse(null); | ||||||
|  |             case "org.javacord.api.entity.user.User": | ||||||
|  |                 return button.getUser(); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Object getAutocompleteFocusedOption(Object context) { | ||||||
|  |         AutocompleteInteraction interaction = (AutocompleteInteraction) context; | ||||||
|  |         return getOptionValue(interaction.getFocusedOption()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -10,6 +10,7 @@ import java.util.Set; | |||||||
|  |  | ||||||
| import org.javacord.api.DiscordApi; | import org.javacord.api.DiscordApi; | ||||||
| import org.javacord.api.interaction.ApplicationCommandInteraction; | import org.javacord.api.interaction.ApplicationCommandInteraction; | ||||||
|  | import org.javacord.api.interaction.AutocompleteInteraction; | ||||||
| import org.javacord.api.interaction.ButtonInteraction; | import org.javacord.api.interaction.ButtonInteraction; | ||||||
| import org.javacord.api.interaction.SlashCommandBuilder; | import org.javacord.api.interaction.SlashCommandBuilder; | ||||||
| import org.javacord.api.interaction.SlashCommandInteraction; | import org.javacord.api.interaction.SlashCommandInteraction; | ||||||
| @@ -25,15 +26,17 @@ import net.tomatentum.marinara.interaction.commands.annotation.SlashCommandOptio | |||||||
| import net.tomatentum.marinara.interaction.commands.annotation.SlashCommandOptionChoice; | import net.tomatentum.marinara.interaction.commands.annotation.SlashCommandOptionChoice; | ||||||
| import net.tomatentum.marinara.interaction.commands.annotation.SubCommand; | import net.tomatentum.marinara.interaction.commands.annotation.SubCommand; | ||||||
| import net.tomatentum.marinara.interaction.commands.annotation.SubCommandGroup; | import net.tomatentum.marinara.interaction.commands.annotation.SubCommandGroup; | ||||||
| import net.tomatentum.marinara.interaction.commands.option.SlashCommandOptionType; | import net.tomatentum.marinara.wrapper.ContextObjectProvider; | ||||||
| import net.tomatentum.marinara.wrapper.LibraryWrapper; | import net.tomatentum.marinara.wrapper.LibraryWrapper; | ||||||
|  |  | ||||||
| public class JavacordWrapper extends LibraryWrapper { | public class JavacordWrapper extends LibraryWrapper { | ||||||
|  |  | ||||||
|     private DiscordApi api; |     private DiscordApi api; | ||||||
|  |     private JavacordContextObjectProvider contextObjectProvider; | ||||||
|  |  | ||||||
|     public JavacordWrapper(DiscordApi api) { |     public JavacordWrapper(DiscordApi api) { | ||||||
|         this.api = api; |         this.api = api; | ||||||
|  |         this.contextObjectProvider = new JavacordContextObjectProvider(); | ||||||
|         api.addInteractionCreateListener((e) -> handleInteraction(e.getInteraction())); |         api.addInteractionCreateListener((e) -> handleInteraction(e.getInteraction())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -43,6 +46,8 @@ public class JavacordWrapper extends LibraryWrapper { | |||||||
|             return InteractionType.COMMAND; |             return InteractionType.COMMAND; | ||||||
|         if (ButtonInteraction.class.isAssignableFrom(clazz)) |         if (ButtonInteraction.class.isAssignableFrom(clazz)) | ||||||
|             return InteractionType.BUTTON; |             return InteractionType.BUTTON; | ||||||
|  |         if (AutocompleteInteraction.class.isAssignableFrom(clazz)) | ||||||
|  |             return InteractionType.AUTOCOMPLETE; | ||||||
|  |  | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
| @@ -68,22 +73,6 @@ public class JavacordWrapper extends LibraryWrapper { | |||||||
|         api.bulkOverwriteGlobalApplicationCommands(globalCommands); |         api.bulkOverwriteGlobalApplicationCommands(globalCommands); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public Object convertCommandOption(Object context, SlashCommandOptionType type, String optionName) { |  | ||||||
|         if (!(context instanceof SlashCommandInteraction)) |  | ||||||
|             return null; |  | ||||||
|         SlashCommandInteraction interaction = (SlashCommandInteraction) context; |  | ||||||
|         if (!interaction.getArguments().isEmpty()) |  | ||||||
|             return getOptionValue(interaction.getOptionByName(optionName).get(), type); |  | ||||||
|  |  | ||||||
|         SlashCommandInteractionOption subCommandOption = interaction.getOptions().getFirst(); |  | ||||||
|  |  | ||||||
|         if (!subCommandOption.getOptions().isEmpty()) |  | ||||||
|             subCommandOption = subCommandOption.getOptions().getFirst(); |  | ||||||
|  |  | ||||||
|         return getOptionValue(subCommandOption.getOptionByName(optionName).get(), type); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public ExecutableSlashCommandDefinition getCommandDefinition(Object context) { |     public ExecutableSlashCommandDefinition getCommandDefinition(Object context) { | ||||||
|         if (!(context instanceof SlashCommandInteraction)) |         if (!(context instanceof SlashCommandInteraction)) | ||||||
| @@ -153,31 +142,6 @@ public class JavacordWrapper extends LibraryWrapper { | |||||||
|         return org.javacord.api.interaction.SlashCommandOption.createWithChoices(type, option.name(), option.description(), option.required(), choices); |         return org.javacord.api.interaction.SlashCommandOption.createWithChoices(type, option.name(), option.description(), option.required(), choices); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private Object getOptionValue(SlashCommandInteractionOption option, SlashCommandOptionType type) { |  | ||||||
|         switch (type) { |  | ||||||
|             case ATTACHMENT: |  | ||||||
|                 return option.getAttachmentValue().get(); |  | ||||||
|             case BOOLEAN: |  | ||||||
|                 return option.getBooleanValue().get(); |  | ||||||
|             case CHANNEL: |  | ||||||
|                 return option.getChannelValue().get(); |  | ||||||
|             case DECIMAL: |  | ||||||
|                 return option.getDecimalValue().get(); |  | ||||||
|             case LONG: |  | ||||||
|                 return option.getLongValue().get(); |  | ||||||
|             case MENTIONABLE: |  | ||||||
|                 return option.getMentionableValue().get(); |  | ||||||
|             case ROLE: |  | ||||||
|                 return option.getRoleValue().get(); |  | ||||||
|             case STRING: |  | ||||||
|                 return option.getStringValue().get(); |  | ||||||
|             case USER: |  | ||||||
|                 return option.getUserValue().get(); |  | ||||||
|             default: |  | ||||||
|                 return null; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public String getButtonId(Object context) { |     public String getButtonId(Object context) { | ||||||
|         ButtonInteraction button = (ButtonInteraction) context; |         ButtonInteraction button = (ButtonInteraction) context; | ||||||
| @@ -185,20 +149,8 @@ public class JavacordWrapper extends LibraryWrapper { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Object getComponentContextObject(Object context, Class<?> type) { |     public ContextObjectProvider getContextObjectProvider() { | ||||||
|         ButtonInteraction button = (ButtonInteraction) context; |         return contextObjectProvider; | ||||||
|         switch (type.getName()) { |  | ||||||
|             case "org.javacord.api.entity.channel.TextChannel": |  | ||||||
|                 return button.getChannel().orElse(null); |  | ||||||
|             case "org.javacord.api.entity.message.Message": |  | ||||||
|                 return button.getMessage(); |  | ||||||
|             case "org.javacord.api.entity.server.Server": |  | ||||||
|                 return button.getServer().orElse(null); |  | ||||||
|             case "org.javacord.api.entity.user.User": |  | ||||||
|                 return button.getUser(); |  | ||||||
|         } |  | ||||||
|         return null; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|      |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user