#2 Hier ein Vorschlag für einen neuen CommmandDistributor: Umsetzung nicht als Enum sondern als HashMap. So muss kein riesiges switch-case vernwendet werden und das aussuche der Befehlsklassen ist durch die HashMap optimiert.

Closed
yannic wants to merge 2 commits from new_command_distributor into master
  1. +5
    -6
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandContext.java
  2. +36
    -68
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java
  3. +1
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java

+ 5
- 6
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandContext.java View File

@ -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;
}


+ 36
- 68
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java View File

@ -2,6 +2,12 @@ package de.yannicpunktdee.yoshibot.command;
import de.yannicpunktdee.yoshibot.command.commands.*;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* Unterscheidet nach der spezifizierten Action welche YoshiCommand-Kindklasse zum Ausführen des Kommandos verwendet
* wird.
@ -10,6 +16,29 @@ import de.yannicpunktdee.yoshibot.command.commands.*;
*/
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<String, Consumer<YoshiCommandContext>> commands = new HashMap<>();
public static void init() {
commands.put(COMMAND_HELP, HelpCommand::new);
commands.put(COMMAND_JOKE, JokeCommand::new);
commands.put(COMMAND_SAY, SayCommand::new);
commands.put(COMMAND_PLAY, PlayCommand::new);
commands.put(COMMAND_SAUCE, SauceCommand::new);
commands.put(COMMAND_PAT, PatCommand::new);
commands.put(COMMAND_BONK, BonkCommand::new);
commands.put(COMMAND_WIKIPEDIA, WikipediaCommand::new);
}
/**
* Führt das jeweils zuständige Kommando aus.
*
@ -36,76 +65,15 @@ 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;
if (!commands.containsKey(context.getAction())) {
context.getEvent().getTextChannel().sendMessage("Diese Aktion existiert nicht.").queue();
return;
}
if (command != null) command.execute();
try {
commands.get(context.getAction()).accept(context);
} catch (Exception e) {
context.getEvent().getTextChannel().sendMessage("Konnte Aktion nicht zuordnen.").queue();
}
/**
* Enthlt alle mglichen Aktionen, die der Yoshi-Bot ausfhren 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 lsst sich der Ausgabechannel bestimmen.
* Standardmig wird die Ausgabe in den Textchannel zurckgesendet, 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] lsst 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,
/**
* Lscht die Ressource, die ber -name spezifiziert wurde. Mit -type wird der Ressourcentyp festgelegt.
*/
SAUCE,
PAT,
BONK,
WIKIPEDIA
}
}

+ 1
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java View File

@ -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);
}


Loading…
Cancel
Save