diff --git a/src/main/java/de/ocame/wuerfelbot/Engel/EngelCommand.java b/src/main/java/de/ocame/wuerfelbot/Engel/EngelCommand.java index ab2e4fe..d8f9470 100644 --- a/src/main/java/de/ocame/wuerfelbot/Engel/EngelCommand.java +++ b/src/main/java/de/ocame/wuerfelbot/Engel/EngelCommand.java @@ -1,14 +1,12 @@ package de.ocame.wuerfelbot.Engel; -import de.ocame.wuerfelbot.Earthdawn.EarthdawnLogic; import de.ocame.wuerfelbot.commands.ICommand; import de.ocame.wuerfelbot.core.LoggerUtil; import de.ocame.wuerfelbot.output.DiceOutputFormatter; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.CommandData; import net.dv8tion.jda.api.interactions.commands.build.Commands; @@ -18,11 +16,9 @@ import java.util.regex.Pattern; public class EngelCommand implements ICommand { - private final EarthdawnLogic earthdawnLogic; private final DiceOutputFormatter outputFormatter; public EngelCommand() { - this.earthdawnLogic = new EarthdawnLogic(); this.outputFormatter = new DiceOutputFormatter(); } @@ -46,7 +42,7 @@ public class EngelCommand implements ICommand { String NameAdd = ""; - Color color = Color.red; + Color color; if(result.isLoF()) { color = Color.red; } @@ -68,8 +64,8 @@ public class EngelCommand implements ICommand { event.getHook().editOriginalEmbeds(response.build()).queue(); // event.replyEmbeds(response.build()).queue(); } catch (Exception e) { - LoggerUtil.log("error", "EngelCommand", "Fehler bei Earthdawn-Probe: " + e.getMessage()); - event.reply(outputFormatter.formatError("Ein Fehler ist bei der Earthdawn-Probe aufgetreten.")).setEphemeral(true).queue(); + LoggerUtil.log("error", "EngelCommand", "Fehler bei Engel-Probe: " + e.getMessage()); + event.reply(outputFormatter.formatError("Ein Fehler ist bei der Engel-Probe aufgetreten.")).setEphemeral(true).queue(); } } @@ -83,7 +79,7 @@ public class EngelCommand implements ICommand { String NameAdd = ""; - Color color = Color.red; + Color color; if(result.isLoF()) { color = Color.red; } diff --git a/src/main/java/de/ocame/wuerfelbot/Engel/EngelLogic.java b/src/main/java/de/ocame/wuerfelbot/Engel/EngelLogic.java index dbfef65..dd61082 100644 --- a/src/main/java/de/ocame/wuerfelbot/Engel/EngelLogic.java +++ b/src/main/java/de/ocame/wuerfelbot/Engel/EngelLogic.java @@ -1,7 +1,5 @@ package de.ocame.wuerfelbot.Engel; -import net.dv8tion.jda.api.EmbedBuilder; - import java.util.Random; public class EngelLogic { diff --git a/src/main/java/de/ocame/wuerfelbot/Keeproll/KeeprollCommand.java b/src/main/java/de/ocame/wuerfelbot/Keeproll/KeeprollCommand.java index 9968b5d..02293d4 100644 --- a/src/main/java/de/ocame/wuerfelbot/Keeproll/KeeprollCommand.java +++ b/src/main/java/de/ocame/wuerfelbot/Keeproll/KeeprollCommand.java @@ -1,7 +1,6 @@ package de.ocame.wuerfelbot.Keeproll; -import de.ocame.wuerfelbot.Earthdawn.EarthdawnLogic; import de.ocame.wuerfelbot.commands.ICommand; import de.ocame.wuerfelbot.core.LoggerUtil; import de.ocame.wuerfelbot.output.DiceOutputFormatter; @@ -12,6 +11,7 @@ import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.CommandData; import net.dv8tion.jda.api.interactions.commands.build.Commands; +import java.util.Objects; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -39,15 +39,15 @@ public class KeeprollCommand implements ICommand { @Override public void executeSlash(SlashCommandInteractionEvent event) { - Integer numberOfDice = event.getOption("wuerfel").getAsInt(); - Integer diceCount = event.getOption("keep").getAsInt(); - Integer target = event.getOption("ziel") != null ? event.getOption("ziel").getAsInt() : 0; - Integer modifier = event.getOption("modifier") != null ? event.getOption("modifier").getAsInt() : 0; + int numberOfDice = Objects.requireNonNull(event.getOption("wuerfel")).getAsInt(); + int diceCount = Objects.requireNonNull(event.getOption("keep")).getAsInt(); + int target = event.getOption("ziel") != null ? Objects.requireNonNull(event.getOption("ziel")).getAsInt() : 0; + int modifier = event.getOption("modifier") != null ? Objects.requireNonNull(event.getOption("modifier")).getAsInt() : 0; - Boolean unskilled = event.getOption("unskilled") != null && event.getOption("unskilled").getAsBoolean(); - Boolean emphases = event.getOption("emphases") != null && event.getOption("emphases").getAsBoolean(); - Integer explode = event.getOption("explode") != null ? event.getOption("explode").getAsInt() : 10; - Boolean explodedOnce = event.getOption("exploded-once") != null && event.getOption("exploded-once").getAsBoolean(); + boolean unskilled = event.getOption("unskilled") != null && Objects.requireNonNull(event.getOption("unskilled")).getAsBoolean(); + boolean emphases = event.getOption("emphases") != null && Objects.requireNonNull(event.getOption("emphases")).getAsBoolean(); + int explode = event.getOption("explode") != null ? Objects.requireNonNull(event.getOption("explode")).getAsInt() : 10; + boolean explodedOnce = event.getOption("exploded-once") != null && Objects.requireNonNull(event.getOption("exploded-once")).getAsBoolean(); if (numberOfDice < 1 || diceCount < 1 || target < 0 || explode < 1 || explode > 10) { if (numberOfDice < 1) { @@ -82,17 +82,15 @@ public class KeeprollCommand implements ICommand { return; } - Integer numberOfDice = 1; - Integer diceCount = 1; - Integer target = 0; - Integer modifier = 0; + int numberOfDice = 1; + int diceCount = 1; + int target = 0; + int modifier = 0; - Boolean unskilled = false; - Boolean emphases = false; - Integer explode = 10; - Boolean explodedOnce = false; - - boolean stufeParsed = false; + boolean unskilled = false; + boolean emphases = false; + int explode = 10; + boolean explodedOnce = false; String ContentRaw = event.getMessage().getContentRaw(); @@ -100,7 +98,7 @@ public class KeeprollCommand implements ICommand { String[] MsgParts = ContentRaw.replace(" ", " ").split(" ", 2); String msgText = MsgParts[1].trim(); if(msgText.equalsIgnoreCase("help") || msgText.equalsIgnoreCase("hilfe")) { - event.getChannel().sendMessage(event.getMember().getAsMention() + " " + event.getChannel().sendMessage(Objects.requireNonNull(event.getMember()).getAsMention() + " " + " Die Syntax lautet XkY z.b. 5k4\nEs werden X mal W10 gewürfelt und davon die höhsten Anzahl Y behalten und addiert. Wird eine 10 gewürfelt, wird der Wurf weiter gewürfelt und addiert aber nur als ein Wurf gezählt.\nWird nach dem XkY eine weiter Zahl angeben so ist dies die Schwierigkeit\n" + "Wird nach dem XkY eine Zahl mit + oder - Angegeben, zählt dies als ein Modifikator für das ergebnis.\n\n" + "Zudem gibt es folgente sonderzeichen, die an belibiger stelle gesetz werden können:\n" @@ -197,17 +195,4 @@ public class KeeprollCommand implements ICommand { return event.getMember().getEffectiveName() + " "; } - private static int parseCharacterStat(String currentElement, char targetChar) { - int result = 0; - Pattern pattern = Pattern.compile("((" + targetChar + "+) *(\\d*))"); - Matcher matcher = pattern.matcher(currentElement); - if (matcher.find()) { - if (matcher.group(2).length() == 1 && !matcher.group(3).isEmpty()) { // nur die K - result += Integer.parseInt(matcher.group(3)); - } else { - result += matcher.group(2).length(); - } - } - return result; - } } \ No newline at end of file diff --git a/src/main/java/de/ocame/wuerfelbot/Keeproll/dice.java b/src/main/java/de/ocame/wuerfelbot/Keeproll/dice.java deleted file mode 100644 index 33ba71a..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Keeproll/dice.java +++ /dev/null @@ -1,316 +0,0 @@ -package de.ocame.wuerfelbot.Keeproll; - -import de.ocame.wuerfelbot.Shadowrun.db_connect; -import de.ocame.wuerfelbot.Simpleroll.help; -import de.ocame.wuerfelbot.Simpleroll.language; -import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.channel.ChannelType; -import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; - -import java.awt.*; -import java.util.*; -import java.util.regex.MatchResult; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class dice extends ListenerAdapter { - - private final String prefixlong; - private final String prefixShort; - private final String prefixVeryShort; - - private final language langDe = new language("de"); - private final language langEn = new language("en"); - - - private language activLang; - - private final db_connect db; - - private final Map channelList = new HashMap<>(); - - - public dice() { - this.prefixlong = "/l5r"; - this.prefixShort = "/keep"; - this.prefixVeryShort = "/k "; - - this.db = new db_connect(); - } - - @Override - public void onMessageReceived(MessageReceivedEvent event) { - if ((!event.getMessage().getContentRaw().toLowerCase().startsWith(this.prefixlong) - && !event.getMessage().getContentRaw().toLowerCase().startsWith(this.prefixShort) - && !event.getMessage().getContentRaw().toLowerCase().startsWith(this.prefixVeryShort)) - || (event.getChannelType() != ChannelType.TEXT && event.getChannelType() != ChannelType.PRIVATE)) { - return; - } - - if(!channelList.containsKey(event.getChannel().getId())) { - Map Einstellungen = db.getChannelSettings(event.getChannel().getId()); - channelList.put(event.getChannel().getId(), Einstellungen.get("lang")); - } - switch (channelList.get(event.getChannel().getId())) { - case "de": - activLang = langDe; - break; - case "en": - activLang = langEn; - break; - default: - activLang = langDe; - - } - User author = event.getAuthor(); - if (event.getMessage().getContentRaw().toLowerCase().startsWith(this.prefixlong) || event.getMessage().getContentRaw().toLowerCase().startsWith(this.prefixShort) || event.getMessage().getContentRaw().toLowerCase().startsWith(this.prefixVeryShort)) - this.roll(event); - } - - - private String getEffectiveName(MessageReceivedEvent event) { - if(event.getMember() == null) { - return ""; - } - return event.getMember().getEffectiveName() + " "; - } - - private String getAsMention(MessageReceivedEvent event) { - if(event.getMember() == null) { - return ""; - } - return event.getMember().getAsMention() + " "; - } - - /** - * - * - * @param event JDA Event - */ - private void roll(MessageReceivedEvent event) { - - EmbedBuilder outputBox = new EmbedBuilder(); - StringBuilder result = new StringBuilder(); - String msgText = ""; - - int numberOfDice, diceCount, resultValue, difficult, bonus; - numberOfDice = diceCount = resultValue = difficult = bonus = 0; - - boolean reroll9, reroll1, maxreroll, noreroll; - reroll9 = reroll1 = maxreroll = noreroll = false; - - try { - - String ContentRaw = event.getMessage().getContentRaw(); - - // Prüfen ob Leerer Command gesendet wird - String[] MsgParts = ContentRaw.replace(" ", " ").split(" ", 2); - - if(MsgParts.length < 2) { - String message = activLang.emptyCommand; - message = message.replace("%command%", this.prefixShort); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - - msgText = MsgParts[1].trim(); - if(msgText.matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden - if(msgText.equalsIgnoreCase("de")) { - activLang = langDe; - channelList.put(event.getChannel().getId(), "de"); - event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); - db.setChannelSettings(event.getChannel().getId(), "de", event.getGuild().getId(), event.getChannel().getName()); - return; - } - else if(msgText.equalsIgnoreCase("en")) { - activLang = langEn; - channelList.put(event.getChannel().getId(), "en"); - event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); - db.setChannelSettings(event.getChannel().getId(), "en", event.getGuild().getId(), event.getChannel().getName()); - return; - } - else if(msgText.equalsIgnoreCase("help") || msgText.equalsIgnoreCase("hilfe")) { - event.getChannel().sendMessage(getAsMention(event) - + " Die Syntax lautet XkY z.b. 5k4\nEs werden X mal W10 gewürfelt und davon die höhsten Anzahl Y behalten und addiert. Wird eine 10 gewürfelt, wird der Wurf weiter gewürfelt und addiert aber nur als ein Wurf gezählt.\nWird nach dem XkY eine weiter Zahl angeben so ist dies die Schwierigkeit\n" - + "Wird nach dem XkY eine Zahl mit + oder - Angegeben, zählt dies als ein Modifikator für das ergebnis.\n\n" - + "Zudem gibt es folgente sonderzeichen, die an belibiger stelle gesetz werden können:\n" - + "! - auch gewüfelte 9 explodieren\n" - + "e - gewürfelte 1 werden neu gewürfelt\n" - + "# - Würfel explodierente nur einmal\n" - + "n - Würfel explodierente nicht\n" - ).queue(); - - return; - } - if(msgText.contains("!")) { - reroll9 = true; - msgText = msgText.replace("!", ""); - } - if(msgText.contains("e")) { - reroll1 = true; - msgText = msgText.replace("e", ""); - } - if(msgText.contains("#")) { - maxreroll = true; - msgText = msgText.replace("#", ""); - } - if(msgText.contains("n")) { - noreroll = true; - msgText = msgText.replace("n", ""); - } - - if(msgText.matches(".*[+-] *[0-9]+.*")) { // Modifikator gefunden - Pattern pattern = Pattern.compile("([+-]) *([0-9]+)"); - Matcher matcher = pattern.matcher(msgText.toLowerCase()); - matcher.find(); - MatchResult elements = matcher.toMatchResult(); - bonus = Integer.parseInt(elements.group(2)); - if(elements.group(1).equals("-")) { - bonus *= -1; - } - msgText = msgText.replaceFirst("[+-] *[0-9]+", ""); - } - - if(msgText.toLowerCase().matches(".*([0-9]+)k([0-9]+) +([0-9]+).*")) { // XkY Z Aufbau in der Anfrage - Pattern pattern = Pattern.compile("([0-9]+)k([0-9]+) +([0-9]+)"); - Matcher matcher = pattern.matcher(msgText.toLowerCase()); - matcher.find(); - MatchResult elements = matcher.toMatchResult(); - numberOfDice = Integer.parseInt(elements.group(1)); - diceCount = Integer.parseInt(elements.group(2)); - difficult = Integer.parseInt(elements.group(3)); - } - else if(msgText.toLowerCase().matches(".*([0-9]+)k([0-9]+).*")) { // XkY Aufbau in der Anfrage - Pattern pattern = Pattern.compile("([0-9]+)k([0-9]+)"); - Matcher matcher = pattern.matcher(msgText.toLowerCase()); - matcher.find(); - MatchResult elements = matcher.toMatchResult(); - numberOfDice = Integer.parseInt(elements.group(1)); - diceCount = Integer.parseInt(elements.group(2)); - } - else { - String message = activLang.error; - message = message.replace("%command%", msgText); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - } - else { - String message = activLang.error; - message = message.replace("%command%", msgText); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - - if(numberOfDice < diceCount && numberOfDice < 10) { - numberOfDice = diceCount; - } - - if(numberOfDice > 10) { - int diceovflow = numberOfDice-10; - numberOfDice = 10; - if(diceCount >= 10) { - bonus += diceovflow*2; - } - else { - if(diceCount + Math.floorDiv(diceovflow, 2) <= 10) { - diceCount += Math.floorDiv(diceovflow, 2); - } - else { - diceCount = 10; - bonus += (diceCount + Math.floorDiv(diceovflow, 2) - 10)*2; - } - } - - } - - if(diceCount > 10) { - bonus += (diceCount-10)*2; - diceCount = 10; - } - - if(numberOfDice <= 0) { - String message = activLang.noNegativ; - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - - - result[] rolls = new result[numberOfDice]; - - int [][] sortRolls = new int[numberOfDice][2]; - - for(int i = 0; i < numberOfDice; i++) { - rolls[i] = new result(); - rolls[i].setMaxReroll(maxreroll).setReroll1(reroll1).setReroll9(reroll9).setNoreroll(noreroll); - rolls[i].roll(); - sortRolls[i][0] = i; - sortRolls[i][1] = rolls[i].getValue(); - } - - - // sortierung - Arrays.sort(sortRolls, Comparator.comparingInt(o -> o[1])); - for(int i = numberOfDice; i > numberOfDice-diceCount; i--) { - resultValue += sortRolls[i-1][1]; - rolls[sortRolls[i-1][0]].setMarket(); - } - resultValue += bonus; - - // Border Farbe - if(resultValue >= difficult) { - outputBox.setColor(Color.green); - } - else { - outputBox.setColor(Color.red); - } - - // Ausgabe beginn - String addition = ""; - if(bonus != 0) { - if(bonus < 0) { - addition += " - " + (bonus*-1) + " "; - } - else { - addition += " + " + bonus + " "; - } - } - if(difficult > 0) { - addition += " Schwierigkeit " + difficult; - } - - outputBox.setTitle(getEffectiveName(event) + numberOfDice + "k" + diceCount + addition + ": " + resultValue); - - StringBuilder description = new StringBuilder(); - for(int i = 0; i < numberOfDice; i++) { - if(description.length() > 0) { - description.append(", "); - } - description.append(rolls[i].getText()); - } - outputBox.setDescription("(" + description + ")"); - event.getChannel().sendMessageEmbeds(outputBox.build()).queue(); - } - catch (NumberFormatException e) { - event.getChannel().sendMessage("Nope").queue(); - } - catch (Exception e) { - System.out.println("problem: " + e.getMessage()); - } - - } - - private void aprilfool(MessageReceivedEvent event) { - EmbedBuilder outputBox = new EmbedBuilder(); - StringBuilder description = new StringBuilder(); - outputBox.setTitle("**Helft der Prinzessin und wertet Flauschsupporter!**"); - description.append("Da Würfel immer sehr schwer sind und Prinzessin Flauschball sehr klein ist.\n" + - "Würde sie sich rießig über eine kleine Spende freuen. \n\n" + - "Ab nur **1€** pro Monat steigt die Changse, als dank für die Hilfe, um **1%** ein besseres Ergebnis zu bekommen.\n\n"); - description.append("Für mehr Infos: https://bitly.com/98K8eH"); - outputBox.setDescription(description); - event.getChannel().sendMessageEmbeds(outputBox.build()).queue(); - } -} diff --git a/src/main/java/de/ocame/wuerfelbot/Keeproll/result.java b/src/main/java/de/ocame/wuerfelbot/Keeproll/result.java index 3f8a7ae..9b9b7ae 100644 --- a/src/main/java/de/ocame/wuerfelbot/Keeproll/result.java +++ b/src/main/java/de/ocame/wuerfelbot/Keeproll/result.java @@ -24,10 +24,6 @@ public class result { return text.toString(); } - public void setText(String text) { - this.text = new StringBuilder(); - this.text.append(text); - } public void setMarket() { String tmp = this.text.toString(); @@ -39,13 +35,6 @@ public class result { return value; } - public void setValue(Integer value) { - this.value = value; - } - - public result setReroll9(Boolean reroll9) { - return this; - } public result setReroll1(Boolean reroll1) { this.reroll1 = reroll1; @@ -70,14 +59,14 @@ public class result { public result roll() { int dice; int rolls = 0; - Boolean reroll = false; + boolean reroll; do{ reroll = false; dice = new Random().nextInt(diceart); dice++; - if(text.length() > 0) { + if(!text.isEmpty()) { text.append("+"); } if(reroll1 && dice == 1 && rolls <= 0) { diff --git a/src/main/java/de/ocame/wuerfelbot/Shadowrun/ShadowrunCommand.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/ShadowrunCommand.java new file mode 100644 index 0000000..b6019f0 --- /dev/null +++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/ShadowrunCommand.java @@ -0,0 +1,165 @@ +package de.ocame.wuerfelbot.Shadowrun; + + +import de.ocame.wuerfelbot.Keeproll.KeeprollLogic; +import de.ocame.wuerfelbot.commands.ICommand; +import de.ocame.wuerfelbot.core.LoggerUtil; +import de.ocame.wuerfelbot.output.DiceOutputFormatter; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; + +import java.util.Objects; +import java.util.regex.MatchResult; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ShadowrunCommand implements ICommand { + + private final ShadowrunLogic shadowrunLogic; + private final DiceOutputFormatter outputFormatter; + + public ShadowrunCommand() { + this.shadowrunLogic = new ShadowrunLogic(); + this.outputFormatter = new DiceOutputFormatter(); + } + + @Override + public String getName() { + return "sr"; + } + + @Override + public String getDescription() { + return "Führt eine Shadowrun 5 Probe aus."; + } + + @Override + public void executeSlash(SlashCommandInteractionEvent event) { + + int numberOfDice = Objects.requireNonNull(event.getOption("wuerfel")).getAsInt(); + int target = event.getOption("ziel") != null ? Objects.requireNonNull(event.getOption("ziel")).getAsInt() : 0; + boolean edge = event.getOption("edge") != null && Objects.requireNonNull(event.getOption("edge")).getAsBoolean(); + int limit = event.getOption("limit") != null ? Objects.requireNonNull(event.getOption("limit")).getAsInt() : 0; + int autoSuccess = event.getOption("auto-erfolge") != null ? Objects.requireNonNull(event.getOption("auto-erfolge")).getAsInt() : 0; + + + if (numberOfDice < 1 || target < 0 || limit < 0 || autoSuccess < 0) { + if (numberOfDice < 1) { + event.reply(outputFormatter.formatError("Die Anzahl der Würfel muss mindestens 1 sein.")).setEphemeral(true).queue(); + } + if (limit < 0) { + event.reply(outputFormatter.formatError("Das Limit darf nicht unter 1 sein")).setEphemeral(true).queue(); + } + if (target < 0) { + event.reply(outputFormatter.formatError("Ziel darf nicht negativ sein.")).setEphemeral(true).queue(); + } + if (autoSuccess < 0) { + event.reply(outputFormatter.formatError("Die Auto Erfolge dürfen nicht negativ sein.")).setEphemeral(true).queue(); + } + return; + } + try { + ShadowrunLogic.ShadowrunResult result = shadowrunLogic.performRoll(numberOfDice, target, limit, edge, autoSuccess); + + EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.getBorderColor()); + event.deferReply().queue(); + event.getHook().editOriginalEmbeds(response.build()).queue(); + } catch (Exception e) { + LoggerUtil.log("error", "KeeprollCommand", "Fehler bei Keeproll-Probe: " + e.getMessage()); + event.reply(outputFormatter.formatError("Ein Fehler ist bei der Keeproll-Probe aufgetreten.")).setEphemeral(true).queue(); + } + } + + @Override + public void executeText(MessageReceivedEvent event, String[] args) { + if (args.length < 1) { + event.getChannel().sendMessage(outputFormatter.formatError("Verwendung: `!k [karma]`")).queue(); + return; + } + + int numberOfDice = 1; + int target = 0; + boolean edge = false; + int limit = 0; + int autoSuccess = 0; + + String ContentRaw = event.getMessage().getContentRaw(); + + if(ContentRaw.startsWith("/" +this.getName()+" +") || ContentRaw.startsWith("/" +this.getName()+"+")) { + ContentRaw = ContentRaw.replace("/" +this.getName()+" +", "/" +this.getName()+"+ ").replace(" ", " "); + edge = true; + } + String[] MsgParts = ContentRaw.split(" ", 2); + if(MsgParts[1].trim().matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden + + if(MsgParts[1].trim().toLowerCase().replace(" ", "").matches("([0-9]*)[dw]([0-9].*)")) { // format besteh aus (Zahlen)d(Zahlen) oder (Zahlen)w(Zahlen) + String[] diceInterpreter = MsgParts[1].trim().toLowerCase().replace(" ", "").split("[wd]"); + try { + numberOfDice = Integer.parseInt(diceInterpreter[0]); + } + catch (NumberFormatException e) { + String message = "Irgend was dummes ist passiert beim Verstehen von %command%"; + message = message.replace("%command%", MsgParts[1].trim().toLowerCase()); + event.getChannel().sendMessage(message).queue(); + return; + } + } + else { + String message = "Irgend was dummes ist passiert beim Verstehen von %command%"; + message = message.replace("%command%", MsgParts[1].trim()); + event.getChannel().sendMessage(message).queue(); + return; + } + } + else { + try { + numberOfDice = Integer.parseInt(MsgParts[1].trim().replace(" ", "")); + } + catch (NumberFormatException e) { + String message = "Irgend was dummes ist passiert beim Verstehen von %command%"; + message = message.replace("%command%", MsgParts[1].trim()); + event.getChannel().sendMessage(message).queue(); + return; + } + } + + try { + ShadowrunLogic.ShadowrunResult result = shadowrunLogic.performRoll(numberOfDice, target, limit, edge, autoSuccess); + + EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.getBorderColor()); + event.getChannel().sendMessageEmbeds(response.build()).queue(); + } catch (Exception e) { + LoggerUtil.log("error", "KeepCommand", "Fehler bei Keeproll-Probe: " + e.getMessage()); + event.getChannel().sendMessage(outputFormatter.formatError("Ein Fehler ist bei der Keeproll-Probe aufgetreten.")).queue(); + } + } + + @Override + public CommandData getSlashCommandData() { + return Commands.slash(getName(), getDescription()) + .addOption(OptionType.INTEGER, "wuerfel", "Die Anzahl der zu würfelende Würfeln", true) + .addOption(OptionType.INTEGER, "ziel", "Ziel Wert, zeigt optisch Ergebnis an", false) + .addOption(OptionType.BOOLEAN, "edge", "Alle gewürfelten 6. erzeugen einen weiteren Wurf", false) + .addOption(OptionType.INTEGER, "limit", "Das Limit bestimmt die maximal möglichen Erfolge", false) + .addOption(OptionType.INTEGER, "auto-erfolge", "Gibt die Bonus Erfolge an", false); + } + + private String getEffectiveName(MessageReceivedEvent event) { + if (event.getMember() == null) { + return ""; + } + return event.getMember().getEffectiveName() + " "; + } + + private String getEffectiveName(SlashCommandInteractionEvent event) { + if (event.getMember() == null) { + return ""; + } + return event.getMember().getEffectiveName() + " "; + } + +} \ No newline at end of file diff --git a/src/main/java/de/ocame/wuerfelbot/Shadowrun/ShadowrunLogic.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/ShadowrunLogic.java new file mode 100644 index 0000000..2cdfb22 --- /dev/null +++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/ShadowrunLogic.java @@ -0,0 +1,185 @@ +package de.ocame.wuerfelbot.Shadowrun; + +import de.ocame.wuerfelbot.Keeproll.result; + +import java.awt.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Random; + +import static java.lang.Math.max; +import static java.lang.Math.min; + +public class ShadowrunLogic { + + private final Random random; + + private int numberOfDice; + private int target; + private int limit; + private boolean edge; + private int autoSuccess; + + private boolean glitches; + private int resultInt; + private int resultIntOne; + private int bonusEdegeDice; + + StringBuilder resultStructur; + + public ShadowrunLogic() { + this.random = new Random(); + reset(); + } + + public ShadowrunLogic reset() { + + glitches = false; + resultInt = 0; + resultIntOne = 0; + + resultStructur = new StringBuilder(); + return this; + } + + /** + * Führt eine Earthdawn-Würfelprobe durch. + * Würfelt eine bestimmte Anzahl an Ws Abhänig von Stufe und optional Würfeln (z.b. Karma). + * + * @param numberOfDice Die Anzahl der zu würfelende Würfeln + * @param target Ziel Wert + * @param limit as Limit bestimmt die maximal möglichen Erfolge + * @param edge Alle gewürfelten 6. erzeugen einen weiteren Wurf + * @param autoSuccess Gibt die Bonus Erfolge an + * @return Ein {@link ShadowrunResult}-Objekt mit den einzelnen Würfelergebnissen und Summen. + * @throws IllegalArgumentException Wenn stufe < 1 oder optionale < 0 ist. + */ + public ShadowrunResult performRoll(int numberOfDice, int target, int limit, boolean edge, int autoSuccess) { + + if (numberOfDice < 1) { + throw new IllegalArgumentException("Die Stufe muss mindestens 1 sein."); + } + + + this.numberOfDice = numberOfDice; + this.target = target; + this.limit = limit; + this.edge = edge; + this.autoSuccess = autoSuccess; + + + reset(); + + + // Würfelarten durchgehen und Würfeln, Sonderwürfel werden imm am Schluss abgearbeitet + StringBuilder resultConstruction = new StringBuilder(); + rollDice(); + if(limit > 0){ + if(autoSuccess >= limit) + resultInt = 0; + else { + int max_result_for_limit = limit - autoSuccess; + resultInt = min(resultInt, max_result_for_limit); + resultInt = max(resultInt, 0); + } + } + + return new ShadowrunResult(numberOfDice, resultInt, resultIntOne, target, resultStructur.toString(), bonusEdegeDice, autoSuccess, limit, glitches); + + } + + /** + * Eine innere Klasse, die das Ergebnis einer Earthdawn-Probe kapselt. + * Dies macht die Rückgabe mehrerer Werte einfacher und lesbarer. + */ + public static class ShadowrunResult { + private final String resultStructur; + private final boolean glitch; + + private final String title; + + public boolean isGlitch() { + return glitch; + } + + private final Color borderColor; + + public ShadowrunResult(int numberOfDice, int hits, int ones, int target, String result, int edgeDice, int autoHits, int limit, boolean glitch) { + this.glitch = glitch; + StringBuilder titleBuild = new StringBuilder(); + + titleBuild.append(numberOfDice).append("W6"); + if (edgeDice > 0) + titleBuild.append(" + ").append(edgeDice).append("W6"); + titleBuild.append(":\tErfolge: ").append(hits); + if (autoHits > 0) + titleBuild.append(" + ").append(autoHits).append("\tGesamt: ").append((hits + autoHits) > limit && limit > 0 ? limit : (hits + autoHits)); + + titleBuild.append("\tMisserfolge: ").append(ones); + if(limit > 0) + titleBuild.append("\rLimit: " ).append(limit); + if (target > 0) + titleBuild.append("\tZiel: ").append(target); + + title = titleBuild.toString(); + resultStructur = result; + + + if (hits + autoHits == 0 && !glitch) { // kein Erfolg, kein Patzer + borderColor = Color.gray; + } else if (hits + autoHits == 0 && glitch) { // kritischer Patzer + borderColor = Color.red; + } else if (glitch) { // Patzer + borderColor = Color.yellow; + } else if(target > 0 && hits + autoHits < target) { // Ziel nicht erreicht + borderColor = Color.gray; + } else { // Erfolg + borderColor = Color.green; + } + } + + public String getDescription() { + return "(" + resultStructur + ")"; + } + + public String getTitle() { + return title; + } + + public Color getBorderColor() { + return borderColor; + } + + } + + + private void rollDice() { + bonusEdegeDice = 0; + int dice1; + + + for (int i = 0; i < numberOfDice + bonusEdegeDice; i++) { + dice1 = random.nextInt(6); + if (edge && dice1 == 5) // Edge + 6 = weitere Würfel + bonusEdegeDice++; + if (dice1 >= 4) { // Erfolg + resultInt++; + } + if (dice1 == 0) { + resultIntOne++; + } + if ((dice1 >= 4) || (dice1 == 0)) + resultStructur.append("**").append(dice1 + 1).append("**"); + else + resultStructur.append(dice1 + 1); + resultStructur.append(" "); + } + + if (resultIntOne > (numberOfDice + bonusEdegeDice) / 2f) { // Patzer nur bei über er Hälfte an 1er + glitches = true; + } + + + } + +} \ No newline at end of file diff --git a/src/main/java/de/ocame/wuerfelbot/Shadowrun/dice.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/dice.java deleted file mode 100644 index c1fb1d0..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Shadowrun/dice.java +++ /dev/null @@ -1,632 +0,0 @@ -package de.ocame.wuerfelbot.Shadowrun; - -import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.entities.channel.ChannelType; -import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; -import net.dv8tion.jda.api.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; - - -import java.awt.*; - -import java.security.SecureRandom; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; - -public class dice extends ListenerAdapter { - - private final String prefixSr; - private final String prefixIni; - private final String prefixZitat; - private final String prefixTest; - private final String prefixCId; - - private final language langDe = new language("de"); - private final language langEn = new language("en"); - - private final help helpDe = new help("de"); - private final help helpEn = new help("En"); - - private language activLang; - private help activHelp; - - private final db_connect db; - - - private final Map channelList = new HashMap<>(); - - - public dice() { - this.prefixSr = "/sr"; - this.prefixIni = "/ini"; - this.prefixTest = "/rollTest"; - this.prefixZitat = "/zitat"; - this.prefixCId = "/cid"; - - - helpDe.add("Alle Befehle können in einen Channel geschrieben werden oder per Direkt Nachricht gesender werden"); - helpDe.add(this.prefixSr + "Zahl", "Würfelt Zahl x W6. Gewürfelte 5. und 6. Werden als Erfolge gezählt, 1. als Misserfolge.\n" + - "Erreicht oder übersteigt die Anzhal der 1. die hälfte der gewürfelten Würfel, zählt dies als ein Patzer. Gibt es mind. 1 Erfolg wird die Markierung der Ausgabe Gelb." + - "wird aber kein Erfolg gewürfelt zählt dies als Kritischer Patzer und die Markierung wird Rot **Wichtig: Vor- und Nachteile die Einfluss auf die Patzer Changse haben werden nicht berücksichtigt"); - - helpDe.add(this.prefixSr + "+ Zahl", "Gleich wie bei " + this.prefixSr + "Zahl. Mit dem Unterschied dass alle gewürfelten 6. ein zuzätlichen Würfel generien."); - - helpDe.add(this.prefixSr + " Zahl_1 + Zahl_2", "Würfelt Zahl_2 x W6 und addiert Zahl_1 hinzu, um die Initative zu bestimmen"); - - helpDe.add(this.prefixIni + " Zahl_1 + Zahl_2", "Synonym für " + this.prefixSr + " Zahl_1 + Zahl_2"); - - helpDe.add(this.prefixCId, "Gibt aktuelle Channel ID zurück"); - - - this.db = new db_connect(); - } - - @Override - public void onMessageReceived(MessageReceivedEvent event) { - if ((!event.getMessage().getContentRaw().startsWith(this.prefixSr) - && !event.getMessage().getContentRaw().startsWith(this.prefixIni) - && !event.getMessage().getContentRaw().startsWith(this.prefixZitat) - && !event.getMessage().getContentRaw().startsWith(this.prefixTest) - && !event.getMessage().getContentRaw().startsWith(this.prefixCId)) - || (event.getChannelType() != ChannelType.TEXT && event.getChannelType() != ChannelType.PRIVATE)) { - return; - } - - if(!channelList.containsKey(event.getChannel().getId())) { - Map Einstellungen = db.getChannelSettings(event.getChannel().getId()); - channelList.put(event.getChannel().getId(), Einstellungen.get("lang")); - } - switch (channelList.get(event.getChannel().getId())) { - case "de": - activLang = langDe; - break; - case "en": - activLang = langEn; - break; - default: - activLang = langDe; - - } - User author = event.getAuthor(); - - if (event.getMessage().getContentRaw().startsWith(this.prefixSr)) - this.srroll(event); - else if (event.getMessage().getContentRaw().startsWith(this.prefixIni)) - this.ini(event); - else if (event.getMessage().getContentRaw().startsWith(this.prefixTest)) - this.rollTest(event); - else if (event.getMessage().getContentRaw().startsWith(this.prefixZitat)) - this.zitat(event); - else if (event.getMessage().getContentRaw().startsWith(this.prefixCId)) - this.cid(event); - } - - /*@Override - public void onMessageReactionAdd(MessageReactionAddEvent event) { - User user = event.getUser(); - if(!channelList.containsKey(event.getChannel().getId())) { - Map Einstellungen = db.getChannelSettings(event.getChannel().getId()); - channelList.put(event.getChannel().getId(), Einstellungen.get("lang").toString()); - } - switch (channelList.get(event.getChannel().getId())) { - case "de": - activLang = langDe; - break; - case "en": - activLang = langEn; - break; - default: - activLang = langDe; - - } - if (!user.isBot()) { - if(event.getReactionEmote().getId().equals("517528156014510111")) { // SR Reaktion - reroll - reaktionRerollEdge(event); - } - else if(event.getReactionEmote().getId().equals("517545127376322596")) { // ausgedehnte probe - extensionroll(event); - } - } - }*/ - - /** - * rolltest - * - * @param event JDA Event - */ - private void rollTest(MessageReceivedEvent event) { - - EmbedBuilder test = new EmbedBuilder(); - test.setTitle("Das ist ein Test"); - test.setColor(Color.red); - test.setDescription("Text " + getAsMention(event)); - - - - - int[] verteilung = new int[6]; - int[] verteilung2 = new int[6]; - int[] verteilung3 = new int[6]; - int dice1, dice2, dice3; - - try { - String[] MsgParts_exl_Mention = event.getMessage().getContentRaw().split(" "); - int rounds = Integer.parseInt(MsgParts_exl_Mention[1]); - if(rounds <= 0) { - event.getChannel().sendMessage("Nope").queue(); - return; - } - for(int i = 0; i < rounds; i++) { - dice1 = new Random().nextInt(6); - dice2 = new SecureRandom().nextInt(6); - //dice3 = new ThreadLocalRandom().current().nextInt(6); - dice3 = ThreadLocalRandom.current().nextInt(0, 6); - verteilung[dice1]++; - verteilung2[dice2]++; - verteilung3[dice3]++; - } - for(int i = 0; i < 6; i++) { - float pro = verteilung[i]*100f/rounds; - test.addField(Integer.toString(i+1), verteilung[i] + " - " + String.format("%.2f", pro) + "%", true); - } - test.addBlankField(false); - for(int i = 0; i < 6; i++) { - float pro = verteilung2[i]*100f/rounds; - test.addField(Integer.toString(i+1), verteilung2[i] + " - " + String.format("%.2f", pro) + "%", true); - } - test.addBlankField(false); - for(int i = 0; i < 6; i++) { - float pro = verteilung3[i]*100f/rounds; - test.addField(Integer.toString(i+1), verteilung3[i] + " - " + String.format("%.2f", pro) + "%", true); - } - event.getChannel().sendMessageEmbeds(test.build()).queue(); - - } - catch (NumberFormatException e) { - event.getChannel().sendMessage("Nope").queue(); - } - catch (Exception e) { - System.out.println("problem: " + e.getMessage()); - } - - } - - /** - * rolltest - * - * @param event JDA Event - */ - private void srroll(MessageReceivedEvent event) { - - int numberOfDice = 1; - int diceart = 6; - - - boolean edge = false; - - try { - // Prüfen ob Edge wurf - if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"+") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" +")) { - edge = true; - } - - // korrikiert Edge eingabe von /sr + zu /sr+ - String ContentRaw = event.getMessage().getContentRaw(); - if(event.getMessage().getContentRaw().startsWith(this.prefixSr+" +")) { - ContentRaw = ContentRaw.replace(this.prefixSr+" +", this.prefixSr+"+ ").replace(" ", " "); - } - - // Prüfen ob Leerer Command gesendet wird - String[] MsgParts = ContentRaw.split(" ", 2); - - if(MsgParts.length < 2) { - String message = activLang.emptyCommand; - message = message.replace("%command%", this.prefixSr); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - - if(MsgParts[1].contains("+")) { - this.ini(event); - return; - } - - if(MsgParts[1].trim().matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden - if(MsgParts[1].trim().equalsIgnoreCase("de")) { - activLang = langDe; - channelList.put(event.getChannel().getId(), "de"); - event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); - db.setChannelSettings(event.getChannel().getId(), "de", event.getGuild().getId(), event.getChannel().getName()); - return; - } - else if(MsgParts[1].trim().equalsIgnoreCase("en")) { - activLang = langEn; - channelList.put(event.getChannel().getId(), "en"); - event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); - db.setChannelSettings(event.getChannel().getId(), "en", event.getGuild().getId(), event.getChannel().getName()); - return; - } - - if(MsgParts[1].trim().toLowerCase().replace(" ", "").matches("([0-9]*)[dw]([0-9].*)")) { // format besteh aus (Zahlen)d(Zahlen) oder (Zahlen)w(Zahlen) - String[] diceInterpreter = MsgParts[1].trim().toLowerCase().replace(" ", "").split("[wd]"); - try { - diceart = Integer.parseInt(diceInterpreter[1]); - numberOfDice = Integer.parseInt(diceInterpreter[0]); - } - catch (NumberFormatException e) { - String message = activLang.error; - message = message.replace("%command%", MsgParts[1].trim().toLowerCase()); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - } - else { - String message = activLang.error; - message = message.replace("%command%", MsgParts[1].trim()); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - } - else { - try { - numberOfDice = Integer.parseInt(MsgParts[1].trim().replace(" ", "")); - } - catch (NumberFormatException e) { - String message = activLang.error; - message = message.replace("%command%", MsgParts[1].trim()); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - } - - srrollOut(numberOfDice, diceart, edge, event.getChannel(), event.getAuthor(), getEffectiveName(event), event.getMessage().getContentRaw(), -1, 0, event.getJDA()); - - } - catch (NumberFormatException e) { - event.getChannel().sendMessage("Nope").queue(); - } - catch (Exception e) { - System.out.println("problem: " + e.getMessage()); - } - - } - - /** - * srrollOut - * - * @param numberOfDice - * @param diceart - * @param edge - * @param channel - * @param user - * @param effectiveName - * @param inputMessage - * @param hitBasis - * @param type - */ - private void srrollOut(int numberOfDice, int diceart, boolean edge, MessageChannel channel, User user, String effectiveName, String inputMessage, int hitBasis, int type, JDA jda) { - - EmbedBuilder outputBox = new EmbedBuilder(); - - int[] verteilung = new int[diceart]; - int dice1; - StringBuilder result = new StringBuilder(); - StringBuilder rollString = new StringBuilder(); - - int hits = 0; - boolean glitches = false; - - try { - - if(numberOfDice <= 0) { - String message = activLang.noNegativ; - channel.sendMessage(user.getAsMention() + message).queue(); - return; - } - - int bonusEdegeDice = 0; - int dicecorrection = hitBasis < 0 ? 0 : hitBasis; - for(int i = 0; i < numberOfDice+bonusEdegeDice; i++) { - dice1 = new Random().nextInt(diceart); - if(edge && dice1 == 5) - bonusEdegeDice++; - if(dice1 >= 4) { - hits++; - } - verteilung[dice1]++; - if((dice1 >= 4) || (dice1 == 0)) - result.append("**").append(dice1+1).append("**"); - else - result.append(dice1+1); - result.append(" "); - } - if (verteilung[0] > (numberOfDice+bonusEdegeDice+dicecorrection)/2f) { // Patzer nur bei über er Hälfte an 1er - glitches = true; - } - - - if(hits+dicecorrection == 0 && !glitches) { // kein Erfolg, kein Patzer - outputBox.setColor(Color.gray); - } - else if(hits+dicecorrection == 0 && glitches) { // kritischer Patzer - outputBox.setColor(Color.red); - } - else if(glitches) { // Patzer - outputBox.setColor(Color.yellow); - } - else { // Erfolg - outputBox.setColor(Color.green); - } - - String addition = ""; - if(bonusEdegeDice > 0) { - addition = " + " + bonusEdegeDice + activLang.dice + diceart; - } - String message = ""; - if(type == 1) { - message = activLang.resultText; - //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)).replace("%EdgeDice%", addition).replace("%hits%", hits + "\t Gesamt: " + (hits + hitBasis)).replace("%oneHits%", String.valueOf(verteilung[0])); - outputBox.setTitle(effectiveName + " Edgereroll " + message); - } - if(type == 2) { - message = activLang.resultTextExtent; - //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)).replace("%EdgeDice%", addition).replace("%hits%", hits + "\t Gesamt: " + (hits + hitBasis)).replace("%oneHits%", String.valueOf(verteilung[0])); - outputBox.setTitle(effectiveName + " Ausgedehnt " + message); - } - else { - message = activLang.resultText; - //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)).replace("%EdgeDice%", addition).replace("%hits%", String.valueOf(hits)).replace("%oneHits%", String.valueOf(verteilung[0])); - outputBox.setTitle(effectiveName + message); - } - - - - outputBox.setDescription("(" + result.toString().trim() + ")"); - //outputBox.appendDescription("\r" + jda.getEmoteById("517528156014510111").getAsMention() + " Edge reroll"); - //outputBox.appendDescription("\r" + jda.getEmoteById("517545127376322596").getAsMention() + " Ausgedehnte Probe"); - //JDA::getEmoteById(); - - for(int i = 0; i < diceart; i++) { - float pro = verteilung[i]*100f/numberOfDice; - //outputBox.addField(Integer.toString(i+1), Integer.toString(verteilung[i]) + " - " + String.format("%.2f", pro) + "%", true); - } - - rollString.append(numberOfDice).append("|").append(hits+dicecorrection).append("|").append(verteilung[0]); - - //event.getChannel().sendMessage(outputBox.build()).queue(); - long[] messageId = new long[1]; - boolean finalEdge = edge; - String finalRollData = rollString.toString(); - channel.sendMessageEmbeds(outputBox.build()).queue(message1 -> { - if(!finalEdge && type == 0) { - //message1.addReaction("sr:517528156014510111").queue(); - } - if(!finalEdge && (type == 0 || type == 2)) { - //message1.addReaction("test:517545127376322596").queue(); - } - messageId[0] = message1.getIdLong(); - if(channel.getType() == ChannelType.PRIVATE) { - db.insertDice(user.getName(), user.getId(), inputMessage, result.toString().trim(), channel.getId(), messageId[0], finalRollData); - } - else { - db.insertDice(user.getName(), user.getId(), inputMessage, result.toString().trim(), channel.getId(), messageId[0], finalRollData); - } - }); - - - } - catch (NumberFormatException e) { - channel.sendMessage("Nope").queue(); - } - catch (Exception e) { - System.out.println("problem: " + e.getMessage()); - } - - } - private void ini(MessageReceivedEvent event) { - - EmbedBuilder outputBox = new EmbedBuilder(); - - int dice1; - int numberOfDice = 1; - int diceart = 6; - int iniBase = 0; - int ini = 0; - StringBuilder result = new StringBuilder(); - - try { - String[] MsgParts = event.getMessage().getContentRaw().split(" ", 2); - if(MsgParts.length < 2) { // Leerer Befehl - String message = activLang.emptyCommand; - message = message.replace("%command%", this.prefixIni); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - - if(MsgParts[1].trim().matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden - if(MsgParts[1].trim().equalsIgnoreCase("de")) { - activLang = langDe; - channelList.put(event.getChannel().getId(), "de"); - event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); - return; - } - else if(MsgParts[1].trim().equalsIgnoreCase("en")) { - activLang = langEn; - channelList.put(event.getChannel().getId(), "en"); - event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); - return; - } - - - String[] iniParts = MsgParts[1].trim().toLowerCase().split("\\+", 2); - messageInterpreter mI = new messageInterpreter(event, activLang); - if(iniParts.length == 1) { // Nachricht hat kein + Zeichen - mI.inputInterpreter(iniParts[0]); - if(mI.isNum()) { - numberOfDice = mI.getIntResult(); - } - else if(mI.isDice()) { - diceart = mI.getDiceart(); - numberOfDice = mI.getNumberOfDice(); - } - - } - else { - mI.inputInterpreter(iniParts[0]); // Vor dem + - if(mI.isNum()) { - iniBase = mI.getIntResult(); - } - else if(mI.isDice()) { - iniBase = mI.getNumberOfDice(); - } - - mI.inputInterpreter(iniParts[1]); // Nach dem + - if(mI.isNum()) { - numberOfDice = mI.getIntResult(); - } - else if(mI.isDice()) { - diceart = mI.getDiceart(); - numberOfDice = mI.getNumberOfDice(); - } - - } - - } - else { - try { - numberOfDice = Integer.parseInt(MsgParts[1].trim().replace(" ", "")); - } - catch (NumberFormatException e) { - String message = activLang.error; - message = message.replace("%command%", MsgParts[1].trim()); - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - } - - if(numberOfDice <= 0) { - String message = activLang.noNegativ; - event.getChannel().sendMessage(getAsMention(event) + message).queue(); - return; - } - - - ini += iniBase; - for(int i = 0; i < numberOfDice; i++) { - dice1 = new Random().nextInt(diceart); - result.append(dice1+1).append(" "); - ini += (dice1+1); - } - outputBox.setColor(new Color(104, 34, 139)); - - - String message = "%iniBase%+%numberOfDice%w%diceart%\tIni: %ini%"; //activLang.resultText; - //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)) - .replace("%iniBase%", String.valueOf(iniBase)).replace("%ini%", String.valueOf(ini)); - outputBox.setTitle(getEffectiveName(event) + message); - - - outputBox.setDescription(iniBase + " + (" + result.toString().trim().replace(" ", "+") + ")"); - - event.getChannel().sendMessageEmbeds(outputBox.build()).queue(); - - } - catch (NumberFormatException e) { - event.getChannel().sendMessage("Nope").queue(); - } - catch (IllegalArgumentException e) { - event.getChannel().sendMessage(e.getMessage()).queue(); - } - catch (Exception e) { - System.out.println("problem: " + e.getMessage()); - } - - } - private void zitat(MessageReceivedEvent event) { - String[] quotes = new String[7]; - - quotes[0] = "*quiek quiek quiek*"; - quotes[1] = "(\\\\______/)\n" + - "( ͡ ͡° ͜ ʖ ͡ ͡°) *snuff snuff*\n" + - "\\\\╭☞ \\\\╭☞\n"; - quotes[2] = "(づ。◕‿‿◕。)づ"; - quotes[3] = "zzzZZZZZzzZZ"; - quotes[4] = "piiiep"; - quotes[5] = "grrrrr"; - //quotes[6] = "ʕᵔᴥᵔʔ =*Auto translator*=> In meiner psychophysischen Konstituton manifestiert sich eine absolute Dominanz positiver Effekte für die Individualität Deiner Person. "; - - int dice = new Random().nextInt(600); - event.getChannel().sendMessage(quotes[dice%6]).queue(); - } - private void cid(MessageReceivedEvent event) { - event.getChannel().sendMessage(getAsMention(event) + " " + event.getChannel().getId()).queue(); - } - - private String getEffectiveName(MessageReceivedEvent event) { - if(event.getMember() == null) { - return ""; - } - return event.getMember().getEffectiveName() + " "; - } - - private String getAsMention(MessageReceivedEvent event) { - if(event.getMember() == null) { - return ""; - } - return event.getMember().getAsMention() + " "; - } - - private void reaktionRerollEdge(MessageReactionAddEvent event) { - Map wurf = db.getMesssage(event.getMessageIdLong()); - if(!wurf.containsKey("benutzerId")) { - return; - } - else if(!wurf.get("benutzerId").equals(event.getUserId())) { - return; - } - String[] wurfParts = wurf.get("wurfdaten").split("\\|"); - int dice = Integer.parseInt(wurfParts[0]); - int hits = Integer.parseInt(wurfParts[1]); - int miss = Integer.parseInt(wurfParts[2]); - String effectName = ""; - if(event.getMember().getEffectiveName() != "") { - effectName = event.getMember().getEffectiveName(); - } - srrollOut(dice-hits, 6, false, event.getChannel(), event.getUser(), effectName, "Edege Reroll", hits, 1, event.getJDA()); - - } - - private void extensionroll(MessageReactionAddEvent event) { - Map wurf = db.getMesssage(event.getMessageIdLong()); - if(!wurf.containsKey("benutzerId")) { - return; - } - else if(!wurf.get("benutzerId").equals(event.getUserId())) { - return; - } - String[] wurfParts = wurf.get("wurfdaten").split("\\|"); - int dice = Integer.parseInt(wurfParts[0]); - int hits = Integer.parseInt(wurfParts[1]); - int miss = Integer.parseInt(wurfParts[2]); - String effectName = ""; - if(event.getMember().getEffectiveName() != "") { - effectName = event.getMember().getEffectiveName(); - } - if(dice == 1) { - event.getChannel().sendMessage(event.getUser().getAsMention() + " mehr geht nicht, du hast **" + hits + "** Erfolge").queue(); - } - else { - srrollOut(dice - 1, 6, false, event.getChannel(), event.getUser(), effectName, "Extent Roll", hits, 2, event.getJDA()); - } - - } -} diff --git a/src/main/java/de/ocame/wuerfelbot/Shadowrun/help.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/help.java deleted file mode 100644 index 2962615..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Shadowrun/help.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ocame.wuerfelbot.Shadowrun; - - -public class help { - - private final StringBuilder hilfstext; - private final String sprache; - - public help(String sprache) { - this.sprache = sprache; - hilfstext = new StringBuilder(); - } - - public void add(String befehl, String hilftext) { - if(this.hilfstext.length() > 0) - this.hilfstext.append("\n\n"); - this.add("**" + befehl + "** " + hilftext); - } - - public void add(String hilftext) { - this.hilfstext.append(hilftext); - } - - public void send() { - StringBuilder ausgabe = new StringBuilder(); - - } -} diff --git a/src/main/java/de/ocame/wuerfelbot/Shadowrun/language.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/language.java deleted file mode 100644 index 162b482..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Shadowrun/language.java +++ /dev/null @@ -1,93 +0,0 @@ -package de.ocame.wuerfelbot.Shadowrun; - -import java.io.*; -import java.util.Properties; - - -public class language { - - public String language = "Deutsch"; - public String emptyCommand = " der %command% befehl benötigt einen Wert"; - public String error = " Irgend was dummes ist passiert beim Verstehen von %command%"; - public String error2 = " Irgend was dummes ist passiert beim Verstehen von %command%"; - public String noNegativ = " es darf kein Negativen Wurf geben"; - public String dice = "w"; - public String resultText = " %numberOfDice%w%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - public String resultTextExtent = " %numberOfDice%w%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - public String basisresultText = " %numberOfDice%w%diceart%:"; - - public language() { - this.readConfig(); - } - - /** - * - * @param lang Srache - */ - public language(String lang) { - this.readConfig(lang); - } - - public void readConfig() { - this.readConfig("de"); - } - public void readConfig(String lang) { - FileInputStream input = null; - OutputStream output = null; - Properties config = new Properties(); - try { - File f = new File("shadowrun.cfg"); - if (f.isFile() && f.canRead()) { - - input = new FileInputStream("shadowrun.cfg"); - config.load(input); - if(config.containsKey(lang + ".language")) - this.language = config.getProperty(lang + ".language"); - - if(config.containsKey(lang + ".emptyCommand")) - this.emptyCommand = config.getProperty(lang + ".emptyCommand"); - if(config.containsKey(lang + ".error")) - this.error = config.getProperty(lang + ".error"); - if(config.containsKey(lang + ".error2")) - this.error2 = config.getProperty(lang + ".error2"); - if(config.containsKey(lang + ".noNegativ")) - this.noNegativ = config.getProperty(lang + ".noNegativ"); - if(config.containsKey(lang + ".dice")) - this.dice = config.getProperty(lang + ".dice"); - if(config.containsKey(lang + ".resultText")) - this.resultText = config.getProperty(lang + ".resultText"); - if(config.containsKey(lang + ".resultTextExtent")) - this.resultText = config.getProperty(lang + ".resultTextExtent"); - if(config.containsKey(lang + ".basisresultText")) - this.resultText = config.getProperty(lang + ".basisresultText"); - - } - else { - output = new FileOutputStream("shadowrun.cfg"); - config.setProperty(lang + ".language", this.language); - config.setProperty(lang + ".emptyCommand", this.emptyCommand); - config.setProperty(lang + ".error", this.error); - config.setProperty(lang + ".error2", this.error2); - config.setProperty(lang + ".noNegativ", this.noNegativ); - config.setProperty(lang + ".dice", this.dice); - config.setProperty(lang + ".resultText", this.resultText); - config.setProperty(lang + ".resultTextExtent", this.resultTextExtent); - config.setProperty(lang + ".basisresultText", this.basisresultText); - config.store(output, null); - - } - } catch (Exception e) { - - } - finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } -} - diff --git a/src/main/java/de/ocame/wuerfelbot/Shadowrun/messageInterpreter.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/messageInterpreter.java deleted file mode 100644 index a65cd0a..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Shadowrun/messageInterpreter.java +++ /dev/null @@ -1,83 +0,0 @@ -package de.ocame.wuerfelbot.Shadowrun; - -import net.dv8tion.jda.api.events.message.MessageReceivedEvent; - -import java.util.Scanner; - -public class messageInterpreter { - - private Integer diceart = 6; - private Integer numberOfDice = 1; - private Integer typ = 0; - private Integer intResult = 0; - - private final language activLang; - private final MessageReceivedEvent event; - - - public Integer getDiceart() { - return diceart; - } - - public Integer getNumberOfDice() { - return numberOfDice; - } - - public Integer getIntResult() { - return intResult; - } - - public boolean isNum() { - return typ == 1; - } - - public boolean isDice() { - return typ == 2; - } - /** - * - * @param event JDA Event - * @param activLang Aktive Sprache - */ - public messageInterpreter(MessageReceivedEvent event, language activLang) { - this.event = event; - this.activLang = activLang; - } - private void reset() { - diceart = 6; - numberOfDice = 1; - typ = 0; - intResult = 0; - } - public void inputInterpreter(String Input) { - reset(); - Scanner sc = new Scanner(Input.trim()); - - if(sc.hasNextInt()) { // ist eine Zahl - typ = 1; - intResult = Integer.parseInt(Input.trim()); - } - else { - if (Input.trim().toLowerCase().replace(" ", "").matches("([0-9]*)[dw]([0-9].*)")) { // format besteh aus (Zahlen)d(Zahlen) oder (Zahlen)w(Zahlen) - String[] diceInterpreter = Input.trim().toLowerCase().replace(" ", "").split("[wd]"); - try { - diceart = Integer.parseInt(diceInterpreter[1]); - numberOfDice = Integer.parseInt(diceInterpreter[0]); - typ = 2; - } catch (NumberFormatException e) { - String message = activLang.error; - message = message.replace("%command%", Input.trim().toLowerCase()); - //event.getChannel().sendMessage(event.getMember().getAsMention() + message).queue(); - typ = -1; - throw new IllegalArgumentException( message ); - } - } - else { - String message = activLang.error; - message = message.replace("%command%", Input.trim().toLowerCase()); - typ = -1; - throw new IllegalArgumentException( message ); - } - } - } -} diff --git a/src/main/java/de/ocame/wuerfelbot/Simpleroll/SimplerollCommand.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/SimplerollCommand.java index e9dbb1f..4db8209 100644 --- a/src/main/java/de/ocame/wuerfelbot/Simpleroll/SimplerollCommand.java +++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/SimplerollCommand.java @@ -7,13 +7,9 @@ import de.ocame.wuerfelbot.output.DiceOutputFormatter; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.CommandData; -import net.dv8tion.jda.api.interactions.commands.build.Commands; -import net.dv8tion.jda.api.interactions.commands.build.OptionData; import java.util.Arrays; -import java.util.List; public class SimplerollCommand implements ICommand { diff --git a/src/main/java/de/ocame/wuerfelbot/Simpleroll/help.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/help.java deleted file mode 100644 index a193927..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Simpleroll/help.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ocame.wuerfelbot.Simpleroll; - - -public class help { - - private final StringBuilder hilfstext; - private final String sprache; - - public help(String sprache) { - this.sprache = sprache; - hilfstext = new StringBuilder(); - } - - public void add(String befehl, String hilftext) { - if(this.hilfstext.length() > 0) - this.hilfstext.append("\n\n"); - this.add("**" + befehl + "** " + hilftext); - } - - public void add(String hilftext) { - this.hilfstext.append(hilftext); - } - - public void send() { - StringBuilder ausgabe = new StringBuilder(); - - } -} diff --git a/src/main/java/de/ocame/wuerfelbot/Simpleroll/language.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/language.java deleted file mode 100644 index 5e31698..0000000 --- a/src/main/java/de/ocame/wuerfelbot/Simpleroll/language.java +++ /dev/null @@ -1,89 +0,0 @@ -package de.ocame.wuerfelbot.Simpleroll; - -import java.io.*; -import java.util.Properties; - - -public class language { - - public String language = "Deutsch"; - public String emptyCommand = " der %command% befehl benötigt einen Wert"; - public String error = " Irgend was dummes ist passiert beim Verstehen von %command%"; - public String error2 = " Irgend was dummes ist passiert beim Verstehen von %command%"; - public String noNegativ = " es darf kein Negativen Wurf geben"; - public String dice = "w"; - public String resultText = " %numberOfDice%w%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; - public String basisresultText = " %numberOfDice%w%diceart%:"; - - public language() { - this.readConfig(); - } - - /** - * - * @param lang Srache - */ - public language(String lang) { - this.readConfig(lang); - } - - public void readConfig() { - this.readConfig("de"); - } - public void readConfig(String lang) { - FileInputStream input = null; - OutputStream output = null; - Properties config = new Properties(); - try { - File f = new File("shadowrun.cfg"); - if (f.isFile() && f.canRead()) { - - input = new FileInputStream("shadowrun.cfg"); - config.load(input); - if(config.containsKey(lang + ".language")) - this.language = config.getProperty(lang + ".language"); - - if(config.containsKey(lang + ".emptyCommand")) - this.emptyCommand = config.getProperty(lang + ".emptyCommand"); - if(config.containsKey(lang + ".error")) - this.error = config.getProperty(lang + ".error"); - if(config.containsKey(lang + ".error2")) - this.error2 = config.getProperty(lang + ".error2"); - if(config.containsKey(lang + ".noNegativ")) - this.noNegativ = config.getProperty(lang + ".noNegativ"); - if(config.containsKey(lang + ".dice")) - this.dice = config.getProperty(lang + ".dice"); - if(config.containsKey(lang + ".resultText")) - this.resultText = config.getProperty(lang + ".resultText"); - if(config.containsKey(lang + ".basisresultText")) - this.resultText = config.getProperty(lang + ".basisresultText"); - - } - else { - output = new FileOutputStream("shadowrun.cfg"); - config.setProperty(lang + ".language", this.language); - config.setProperty(lang + ".emptyCommand", this.emptyCommand); - config.setProperty(lang + ".error", this.error); - config.setProperty(lang + ".error2", this.error2); - config.setProperty(lang + ".noNegativ", this.noNegativ); - config.setProperty(lang + ".dice", this.dice); - config.setProperty(lang + ".resultText", this.resultText); - config.setProperty(lang + ".basisresultText", this.basisresultText); - config.store(output, null); - - } - } catch (Exception e) { - - } - finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } -} - diff --git a/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java b/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java index bbf59a1..11ecc5e 100644 --- a/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java +++ b/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java @@ -4,6 +4,7 @@ package de.ocame.wuerfelbot.commands; import de.ocame.wuerfelbot.Earthdawn.EarthdawnCommand; import de.ocame.wuerfelbot.Engel.EngelCommand; import de.ocame.wuerfelbot.Keeproll.KeeprollCommand; +import de.ocame.wuerfelbot.Shadowrun.ShadowrunCommand; import de.ocame.wuerfelbot.Simpleroll.SimplerollCommand; import de.ocame.wuerfelbot.core.LoggerUtil; import net.dv8tion.jda.api.JDA; @@ -34,10 +35,11 @@ public class CommandManager { */ private void registerCommands() { // Füge deine Befehlsimplementierungen hier hinzu - //addCommand(new SimpleRollCommand()); + addCommand(new EarthdawnCommand()); addCommand(new EngelCommand()); addCommand(new KeeprollCommand()); + addCommand(new ShadowrunCommand()); SimplerollCommand simplerollCmd = new SimplerollCommand(); addCommand(simplerollCmd); // Registriert unter "roll" diff --git a/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java b/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java index 628b39c..ef2ad32 100644 --- a/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java +++ b/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java @@ -38,13 +38,13 @@ public class DiscordBot { // Intents sind Berechtigungen, die dein Bot für bestimmte Events benötigt. JDABuilder builder = JDABuilder.createDefault(botToken) .enableIntents( - GatewayIntent.MESSAGE_CONTENT, // Für Text-Befehle (Nachrichteninhalt lesen) - GatewayIntent.GUILD_MESSAGES, // Für Nachrichten in Gilden - GatewayIntent.GUILD_MEMBERS, // Für Zugriff auf Mitgliederinformationen (falls benötigt) - GatewayIntent.GUILD_PRESENCES // Für Präsenzinformationen (falls benötigt) + GatewayIntent.MESSAGE_CONTENT //, // Für Text-Befehle (Nachrichteninhalt lesen) + //GatewayIntent.GUILD_MESSAGES, // Für Nachrichten in Gilden + //GatewayIntent.GUILD_MEMBERS, // Für Zugriff auf Mitgliederinformationen (falls benötigt) + //GatewayIntent.GUILD_PRESENCES // Für Präsenzinformationen (falls benötigt) ) // Empfohlen für größere Bots, um Caching zu optimieren - .setMemberCachePolicy(MemberCachePolicy.ALL) + //.setMemberCachePolicy(MemberCachePolicy.ALL) .setChunkingFilter(ChunkingFilter.ALL) .setStatus(OnlineStatus.ONLINE) // Setze den Online-Status .setActivity(Activity.playing("mit den Würfeln")); // Setze eine Aktivität diff --git a/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java b/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java index fa66cf8..3378c11 100644 --- a/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java +++ b/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java @@ -28,17 +28,6 @@ public class DiceOutputFormatter { return outputBox; } - /** - * Formatiert ein allgemeines Würfelergebnis. - * nur für tests - * - * @param result Das Ergebnis des Würfels. - * @param notation Die Würfelnotation (z.B. "1d6"). - * @return Der formatierte String. - */ - public String formatRollResult(int result, String notation) { - return String.format("Du hast mit %s eine **%d** gewürfelt.", notation, result); - } /** * Formatiert eine Fehlermeldung.