From 47b06103c362681a0d727e7d8699145dd1bc75d6 Mon Sep 17 00:00:00 2001 From: Pingex Date: Sun, 24 Apr 2016 12:57:19 +0200 Subject: [PATCH] Quick and dirty async commands. --- .../java/net/pingex/discordbot/Async.java | 17 ++++ .../pingex/discordbot/CommandDispatcher.java | 84 ++++++++++++++----- 2 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 src/main/java/net/pingex/discordbot/Async.java diff --git a/src/main/java/net/pingex/discordbot/Async.java b/src/main/java/net/pingex/discordbot/Async.java new file mode 100644 index 0000000..149a942 --- /dev/null +++ b/src/main/java/net/pingex/discordbot/Async.java @@ -0,0 +1,17 @@ +package net.pingex.discordbot; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Marks a function as async, for long-running commands. + * @version 0.1-dev + * @author Raphael "Pingex" NAAS + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Async +{ +} diff --git a/src/main/java/net/pingex/discordbot/CommandDispatcher.java b/src/main/java/net/pingex/discordbot/CommandDispatcher.java index e4bbc45..291474a 100644 --- a/src/main/java/net/pingex/discordbot/CommandDispatcher.java +++ b/src/main/java/net/pingex/discordbot/CommandDispatcher.java @@ -75,43 +75,81 @@ public class CommandDispatcher if(!fullCommand.contains(":") && shortList.containsKey(fullCommand)) fullCommand = shortList.get(fullCommand); - try + String commandAnswer = null; + Object[] parsedArray = null; + + // Conditions + if(commandList.containsKey(fullCommand)) { - if(commandList.containsKey(fullCommand)) - { - logger.info("Command invoked (" + event.getMessage().getAuthor().getName() + "#" + event.getMessage().getAuthor().getDiscriminator() + "): " + fullCommand); + logger.info("Command invoked (" + event.getMessage().getAuthor().getName() + "#" + event.getMessage().getAuthor().getDiscriminator() + "): " + fullCommand); - InvokableMethod foundMethod = commandList.get(fullCommand); - Object[] parsedArray = new Object[foundMethod.getMethod().getParameterCount()]; - parsedArray[0] = event; - - if(foundMethod.getMethod().getParameterCount()-1 != args.size()) - { - event.getMessage().reply("Invalid arguments. " + getHelp(fullCommand)); - return; - } + InvokableMethod foundMethod = commandList.get(fullCommand); + parsedArray = new Object[foundMethod.getMethod().getParameterCount()]; + parsedArray[0] = event; + if(foundMethod.getMethod().getParameterCount()-1 == args.size()) + { for(int i=1; i < foundMethod.getMethod().getParameterCount(); i++) try { parsedArray[i] = parse(foundMethod.getMethod().getParameterTypes()[i], args.get(i-1)); } catch (IllegalArgumentException e) { - event.getMessage().reply("Failed to parse arguments, are they correct ? " + getHelp(fullCommand)); + commandAnswer = "Failed to parse arguments, are they correct ? " + getHelp(fullCommand); + break; } - - String answer = (String) commandList.get(fullCommand).invoke(parsedArray); - if(answer != null) event.getMessage().reply(answer); } else - event.getMessage().reply("Unknown command"); - } catch (MissingPermissionsException | HTTP429Exception | DiscordException e) - { - logger.warning("Couldn't reply to command (" + e.getClass().getName() + "): " + e.getMessage()); - } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) + commandAnswer = "Invalid arguments. " + getHelp(fullCommand); + } + else + commandAnswer = "Unknown command"; + + // Run command + if(commandAnswer == null) { - logger.severe("Couldn't call target method (" + e.getClass().getName() + "): " + e.getMessage()); + if (commandList.get(fullCommand).getMethod().isAnnotationPresent(Async.class)) // Run async + { + String finalFullCommand = fullCommand; + Object[] finalParsedArray = parsedArray; + new Thread(() -> // TODO: Very hacky + { + try + { + String ans = (String) commandList.get(finalFullCommand).invoke(finalParsedArray); + if(ans != null) event.getMessage().reply(ans); + } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) + { + e.printStackTrace(); + } catch (MissingPermissionsException | HTTP429Exception | DiscordException e) + { + logger.warning("Couldn't reply to command (" + e.getClass().getName() + "): " + e.getMessage()); + } + }).start(); + } + else // Run sync + { + try + { + String ans = (String) commandList.get(fullCommand).invoke(parsedArray); + if(ans != null) event.getMessage().reply(ans); + } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) + { + e.printStackTrace(); + } catch (MissingPermissionsException | HTTP429Exception | DiscordException e) + { + logger.warning("Couldn't reply to command (" + e.getClass().getName() + "): " + e.getMessage()); + } + } } + else // Error answer + try + { + event.getMessage().reply(commandAnswer); + } catch (MissingPermissionsException | HTTP429Exception | DiscordException e) + { + logger.warning("Couldn't reply to command (" + e.getClass().getName() + "): " + e.getMessage()); + } } /**