diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandContext.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandContext.java index 171f825..2c24411 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandContext.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandContext.java @@ -2,7 +2,6 @@ package de.yannicpunktdee.yoshibot.command; import java.util.*; -import de.yannicpunktdee.yoshibot.command.YoshiCommandDistributor.Action; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;; /** @@ -97,7 +96,7 @@ public class YoshiCommandContext { /** * Die im Eingabesting spezifizierte Aktion. */ - private Action action; + private String action; /** * Eine Map, die die Key-Werte der Argumente (ohne Bindestrich) auf dessen Werte abbildet. */ @@ -154,7 +153,7 @@ public class YoshiCommandContext { case READING_ACTION: if (!Character.isWhitespace(currentChar)) continue; try { - action = Action.valueOf(argumentsString.substring(startPos, position).toUpperCase()); + action = argumentsString.substring(startPos, position).toLowerCase(); readingState = ReadingState.INTERMEDIATE; } catch (IllegalArgumentException e) { state = State.UNKNOWN_ACTION; @@ -209,7 +208,7 @@ public class YoshiCommandContext { return; case VERIFYING: if (argumentsString.equals(PREFIX)) { - action = Action.HELP; + action = YoshiCommandDistributor.COMMAND_HELP; state = State.OK; } else { state = State.NO_COMMAND; @@ -217,7 +216,7 @@ public class YoshiCommandContext { return; case READING_ACTION: try { - action = Action.valueOf(argumentsString.substring(startPos).toUpperCase()); + action = argumentsString.substring(startPos).toLowerCase(); readingState = ReadingState.INTERMEDIATE; } catch (IllegalArgumentException e) { state = State.UNKNOWN_ACTION; @@ -255,7 +254,7 @@ public class YoshiCommandContext { /** * Gibt die im Kommando spezifizierte Aktion zurück. null, wenn status fehlerhaft oder kein Kommando. */ - public Action getAction() { + public String getAction() { return action; } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java index 1c70863..9e01090 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java @@ -2,6 +2,10 @@ package de.yannicpunktdee.yoshibot.command; import de.yannicpunktdee.yoshibot.command.commands.*; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + /** * Unterscheidet nach der spezifizierten Action welche YoshiCommand-Kindklasse zum Ausführen des Kommandos verwendet * wird. @@ -9,6 +13,29 @@ import de.yannicpunktdee.yoshibot.command.commands.*; * @author Yannic Link */ public class YoshiCommandDistributor { + + public static final String COMMAND_HELP = "help"; + public static final String COMMAND_JOKE = "joke"; + public static final String COMMAND_SAY = "say"; + public static final String COMMAND_PLAY = "play"; + public static final String COMMAND_SAUCE = "sauce"; + public static final String COMMAND_PAT = "pat"; + public static final String COMMAND_BONK = "bonk"; + public static final String COMMAND_WIKIPEDIA = "wikipedia"; + + private static final Map> commands = new HashMap<>(); + + + public static void init(){ + commands.put(COMMAND_HELP, HelpCommand.class); + commands.put(COMMAND_JOKE, JokeCommand.class); + commands.put(COMMAND_SAY, SayCommand.class); + commands.put(COMMAND_PLAY, PlayCommand.class); + commands.put(COMMAND_SAUCE, SauceCommand.class); + commands.put(COMMAND_PAT, PatCommand.class); + commands.put(COMMAND_BONK, BonkCommand.class); + commands.put(COMMAND_WIKIPEDIA, WikipediaCommand.class); + } /** * Führt das jeweils zuständige Kommando aus. @@ -36,76 +63,17 @@ public class YoshiCommandDistributor { break; } - YoshiCommand command = null; - switch (context.getAction()) { - case HELP: - command = new HelpCommand(context); - break; - case JOKE: - command = new JokeCommand(context); - break; - case SAY: - command = new SayCommand(context); - break; - case PLAY: - command = new PlayCommand(context); - break; - case SAUCE: - command = new SauceCommand(context); - break; - case PAT: - command = new PatCommand(context); - break; - case BONK: - command = new BonkCommand(context); - break; - case WIKIPEDIA: - command = new WikipediaCommand(context); - break; - default: - context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue(); - break; + Class commandClass = commands.get(context.getAction()); + if(commandClass == null){ + context.getEvent().getTextChannel().sendMessage("Diese Aktion existiert nicht.").queue(); + return; + } + try { + ((YoshiCommand) commandClass.getConstructor(YoshiCommandContext.class).newInstance(context)).execute(); + } catch (Exception e) { + context.getEvent().getTextChannel().sendMessage("Konnte Aktion nicht zuordnen.").queue(); + return; } - - if (command != null) command.execute(); - } - - /** - * Enth�lt alle m�glichen Aktionen, die der Yoshi-Bot ausf�hren kann. - * - * @author Yannic Link - */ - public enum Action { - /** - * Sende eine Hilfe-Nachricht, in der die Benutzung des Yoshi-Bots dokumentiert ist. - */ - HELP, - /** - * Erzählt einen Jokus. - */ - JOKE, - /** - * Gib die Nachricht -message aus. �ber die Option -out [text|voice] wird angegeben, ob die Nachricht per - * Textnachricht oder als Text-To-Speech ausgegeben wird. Mit -channel l�sst sich der Ausgabechannel bestimmen. - * Standardm��ig wird die Ausgabe in den Textchannel zur�ckgesendet, aus dem das Kommando kam. - */ - SAY, - /** - * Gibt eine vorhandene Ressource -name aus. (Vorhandene Ressourcen lassen sich mit der Aktion LIST anzeigen). - * �ber den Parameter -type [link|audio|video] l�sst sich der Typ der Ressource spezifizieren. Ein Link wird - * �ber in den per -channel spezifizierten (default=Ursprungskanal) Textkanal geschickt. Eine Audiodatei wird - * �ber den per -channel spezifizierten (default=Aktueller Kanal) Voice-Channel ausgegeben. Ein Video wird �ber - * den per -channel spezifizierten (default=Aktueller Kanal) Voice-Channel abgespielt. - */ - PLAY, - /** - * L�scht die Ressource, die �ber -name spezifiziert wurde. Mit -type wird der Ressourcentyp festgelegt. - */ - SAUCE, - PAT, - BONK, - WIKIPEDIA } - } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java index 05489e2..670fad9 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java @@ -75,6 +75,7 @@ public final class YoshiBot { * Initialisiert alle dynamisch hinzugefügten und statischen Ressourcen. Startet aber nicht den Bot selbst. */ public boolean init(String configPath) { + YoshiCommandDistributor.init(); return Resources.init(configPath); }