diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml
new file mode 100644
index 0000000..3f9f87b
--- /dev/null
+++ b/.idea/dictionaries/project.xml
@@ -0,0 +1,7 @@
+
+
+
+ earthdawn
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 11e98b6..0776eaf 100755
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ plugins {
}
-application.mainClass = "core.Main"
+application.mainClass = "de.ocame.wuerfelbot.core.Main"
group = 'de.ocame'
version = '0.20'
diff --git a/shadowrun.cfg b/shadowrun.cfg
index 41c2848..2a6b812 100755
--- a/shadowrun.cfg
+++ b/shadowrun.cfg
@@ -22,4 +22,10 @@ db.host=localhost
db.port=3306
db.database=shadowrun_log
db.name=root
-db.pw=
\ No newline at end of file
+db.pw=
+
+
+# Token, Benutzername und Passwort
+#"NTQ2ODk5MzYwMDEzODc3MjU4.D0u8wA.VfA2vJzundVhCl1-ibDiBaKuA8w"
+
+api.token=NTQ2NzEwODUwOTIxMjk5OTc5.D0sL6A.1fUd5iBr3eo2tbPXofEqyumDm6w
\ No newline at end of file
diff --git a/src/main/java/Serenity/balance.java.Deprecated b/src/main/java/Serenity/balance.java.Deprecated
deleted file mode 100644
index b0119f7..0000000
--- a/src/main/java/Serenity/balance.java.Deprecated
+++ /dev/null
@@ -1,355 +0,0 @@
-package Serenity;
-
-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 org.json.JSONArray;
-import org.json.JSONObject;
-
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.text.DecimalFormat;
-import java.util.*;
-
-public class balance extends ListenerAdapter {
-
- private String prefixPromote;
- private String prefixDegradation;
- private String prefixDetail;
- private String prefixCow;
- private String prefixCow2;
-
-
- public balance() {
- this.prefixPromote = "/konto";
- this.prefixDegradation = "/pay ";
- this.prefixDetail = "/detail";
-
- this.prefixCow = "/cow";
- this.prefixCow2 = "/Cattle";
-
-
- }
-
- @Override
- public void onMessageReceived(MessageReceivedEvent event) {
- if (event.getMessage().getContentRaw().startsWith("!ende")) { // nur zum Debugen #todo muss wieder raus
- event.getJDA().shutdown();
- }
- if (event.getMessage().getContentRaw().startsWith(this.prefixCow) || event.getMessage().getContentRaw().startsWith(this.prefixCow2)) { // nur zum Debugen #todo muss wieder raus
- event.getChannel().sendMessage("NO FUCKING COWS AND COW-LIKE ANIMALS ON THE SHIP!").queue();
- }
- if ((!event.getMessage().getContentRaw().startsWith(this.prefixPromote) &&
- !event.getMessage().getContentRaw().startsWith(this.prefixDegradation) &&
- !event.getMessage().getContentRaw().startsWith(this.prefixDetail)) || event.getChannelType() != ChannelType.TEXT) {
- return;
- }
-
- User author = event.getAuthor();
- if (!author.isBot()) {
- if (event.getMessage().getContentRaw().startsWith(this.prefixPromote))
- this.getInfo(event);
- else if (event.getMessage().getContentRaw().startsWith(this.prefixDegradation))
- this.addTransaction(event);
- else if (event.getMessage().getContentRaw().startsWith(this.prefixDetail))
- this.getInfo(event, true);
-
- }
- }
-
- private void getInfo(MessageReceivedEvent event) {
- this.getInfo(event, false);
- }
-
- /**
- * Holt Kontostand ab
- *
- * @param event JDA Event
- * @param detail true = Abrufen der Detail, Chronologich, false = gesammt Kontostand
- */
- private void getInfo(MessageReceivedEvent event, Boolean detail) {
- HttpURLConnection con = null;
- //String result = "";
- StringBuilder result_test = new StringBuilder("");
- DecimalFormat myFormatter = new DecimalFormat();
-
- Map IdConvert = new HashMap<>();
- IdConvert.put("256888865103544321", 2); // Niclos
- IdConvert.put("495895196685303818", 3); // Birgit
- IdConvert.put("385865287586545676", 7); // Felix
- IdConvert.put("493359873480720384", 5); // orko
- IdConvert.put("339859242917953537", 4); // christian
- IdConvert.put("397055491488088065", 6); // Filip
- IdConvert.put(event.getJDA().getSelfUser().getId(), 1); // Schiff
-
- try {
- // Zerlgen der Anfrage
- String parameter = "";
- if (event.getMessage().getMentions().getUsers() .size() > 0) {
- if (IdConvert.containsKey(event.getMessage().getMentions().getUsers().get(0).getId()))
- parameter = "?id=" + (IdConvert.get(event.getMessage().getMentions().getUsers().get(0).getId()));
- } else {
- parameter = "?id=1";
- }
- if (detail) {
- parameter += "&detail=1";
- }
-
- // aufbau zum REST
- URL url = new URL("http://localhost/REST/balance" + parameter);
- con = (HttpURLConnection) url.openConnection();
- con.setRequestMethod("GET");
- con.setConnectTimeout(3600);
- con.setReadTimeout(360);
- con.setUseCaches(false);
- con.connect();
-
- int status = con.getResponseCode();
- switch (status) {
- case 200:
- case 201: // auswerten der Antwort
- BufferedReader in = new BufferedReader(
- new InputStreamReader(con.getInputStream()));
- String inputLine;
- StringBuffer content = new StringBuffer();
- while ((inputLine = in.readLine()) != null) {
- content.append(inputLine);
- }
- in.close();
-
- JSONObject responseJson = new JSONObject(content.toString());
- Iterator keys = responseJson.keys();
-
- while (keys.hasNext()) {
- String key = keys.next();
- if (responseJson.get(key) instanceof JSONObject) {
- result_test.append("**").append(((JSONObject) responseJson.get(key)).get("name").toString()).append(":**\n");
-
- result_test.append("```");
- if (detail) {
- JSONArray transaction = (JSONArray) ((JSONObject) responseJson.get(key)).get("transaction");
- for (int i = 0; i < transaction.length(); i++) {
- for (int j = 7 - (myFormatter.format(Float.parseFloat(((JSONObject) transaction.get(i)).get("amount").toString()))).length(); j > 0; j--) {
- result_test.append(" ");
- }
- result_test.append( (myFormatter.format(Float.parseFloat(((JSONObject) transaction.get(i)).get("amount").toString()))));
-
-
- result_test.append(" ").append( ((JSONObject) transaction.get(i)).get("currency_name").toString()).append(" ");
-
- result_test.append(" - ").append(((JSONObject) transaction.get(i)).get("reason").toString());
-
- result_test.append( "\n");
- }
- result_test.append( "\n-------------------------------------\n");
- }
- JSONArray balance = (JSONArray) ((JSONObject) responseJson.get(key)).get("balance");
- for (int i = 0; i < balance.length(); i++) {
- for (int j = 7 - (myFormatter.format(Float.parseFloat(((JSONObject) balance.get(i)).get("amount").toString()))).length(); j > 0; j--) {
- result_test.append(" ");
- }
- result_test.append( (myFormatter.format(Float.parseFloat(((JSONObject) balance.get(i)).get("amount").toString()))));
-
-
- result_test.append(" ").append( ((JSONObject) balance.get(i)).get("currency_name").toString()).append(" ");
- result_test.append( "\n");
- }
- result_test.append( "```");
- }
- }
- event.getChannel().sendMessage(event.getMember().getAsMention() + "\n" + result_test.toString()).queue();
- break;
- default:
- System.out.println(":(");
- }
- con.disconnect();
-
- } catch (Exception e) {
- System.out.println("problem: " + e.getMessage());
- } finally {
- if (con != null) { // Verbindung schließen wenn noch offen
- try {
- con.disconnect();
- } catch (Exception ex) {
- System.out.println("final fehler");
- }
- }
- }
-
- }
-
- /**
- * Fügt neue Transaktion hinzu
- *
- * @param event JDA Event
- */
- private void addTransaction(MessageReceivedEvent event) {
- Map IdConvert = new HashMap<>();
- IdConvert.put("256888865103544321", 2); // Niclos
- IdConvert.put("495895196685303818", 3); // Birgit
- IdConvert.put("385865287586545676", 7); // Felix
- IdConvert.put("493359873480720384", 5); // orko
- IdConvert.put("339859242917953537", 4); // christian
- IdConvert.put("397055491488088065", 6); // Filip
- IdConvert.put(event.getJDA().getSelfUser().getId(), 1); // Schiff
-
-
- Map currencyConvert = new HashMap<>();
- currencyConvert.put("credit", 1);
- currencyConvert.put("c", 1);
- currencyConvert.put("doller", 2);
- currencyConvert.put("d", 2);
- currencyConvert.put("$", 2);
- currencyConvert.put("platinum", 3);
- currencyConvert.put("p", 3);
- currencyConvert.put("gold", 4);
- currencyConvert.put("g", 4);
- currencyConvert.put("silver", 5);
- currencyConvert.put("s", 5);
-
- Map currencyConvert2 = new HashMap<>();
- currencyConvert2.put(1, "Credit");
- currencyConvert2.put(2, "Doller");
- currencyConvert2.put(3, "Platinum");
- currencyConvert2.put(4, "Gold");
- currencyConvert2.put(5, "Silver");
-
- int[] ids;
- StringBuilder result = new StringBuilder("");
- boolean allfound = true;
- String[] MsgParts;
- float ammount;
-
- HttpURLConnection con = null;
-
- try {
- // Aufteilen Nachricht in Bennunungen und Rest
- String[] MsgParts_exl_Mention = event.getMessage().getContentRaw().split(event.getMessage().getMentionedUsers().get(event.getMessage().getMentionedUsers().size() - 1).getAsMention(), 2);
- MsgParts = MsgParts_exl_Mention[1].trim().split(" ");
-
- ids = new int[event.getMessage().getMentionedUsers().size()];
-
- // Pürfen ob Angebe der Währung bekannt ist
- if (!currencyConvert.containsKey(MsgParts[1].toLowerCase())) {
- event.getChannel().sendMessage(event.getMember().getAsMention() + " " + MsgParts[1] + " ist keine bekannte Währung").queue();
- return;
- }
-
- // Prüfen ob Zahl legal ist
- try {
-
- ammount = Float.parseFloat(MsgParts[0]);
- } catch (NumberFormatException e) {
- event.getChannel().sendMessage(event.getMember().getAsMention() + " " + MsgParts[MsgParts.length - 2] + " ist keine gültige Zahl").queue();
- return;
-
- }
-
-
- // Prüfen ob alle gennanten Personen zur Zahlung gehören
- for (int i = 0; i < event.getMessage().getMentionedUsers().size(); i++) {
- if (!IdConvert.containsKey(event.getMessage().getMentionedUsers().get(i).getId())) {
- allfound = false;
- result.append(" ").append(event.getMessage().getMentionedUsers().get(i).getName());
- } else {
- ids[i] = IdConvert.get(event.getMessage().getMentionedUsers().get(i).getId());
- }
- }
-
- if (!allfound) {
- event.getChannel().sendMessage(event.getMember().getAsMention() + result.toString() + " wurde(n) nicht gefunden").queue();
- return;
- }
-
- String reason = MsgParts_exl_Mention[1].trim().substring(MsgParts[0].length() + MsgParts[1].length() + 2);
-
- // Aufbau Payload zur übertragung an REST Schnittstelle
- JSONObject payload = new JSONObject();
- payload.put("ammount", ammount);
- payload.put("currency_id", currencyConvert.get(MsgParts[1].toLowerCase()));
- payload.put("ids", ids);
- payload.put("reason", reason);
-
- URL url = new URL("http://localhost/REST/balance");
- con = (HttpURLConnection) url.openConnection();
- con.setRequestMethod("POST");
- con.setConnectTimeout(3600);
- con.setReadTimeout(3600);
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setDefaultUseCaches(false);
-
- // Übertragen der Payload
- OutputStream os = con.getOutputStream();
- BufferedWriter writer = new BufferedWriter(
- new OutputStreamWriter(os, "UTF-8"));
- writer.write(payload.toString());
- writer.flush();
- writer.close();
-
- int status = con.getResponseCode();
-
- switch (status) {
- case 200:
- case 201: // Verarbeiten der Antwort
- BufferedReader in = new BufferedReader(
- new InputStreamReader(con.getInputStream()));
- String inputLine;
- StringBuffer content = new StringBuffer();
- while ((inputLine = in.readLine()) != null) {
- content.append(inputLine);
- }
- in.close();
- JSONObject responseJson = new JSONObject(content.toString());
- Iterator keys = responseJson.keys();
-
- result = new StringBuilder("");
- while (keys.hasNext()) {
- String key = keys.next();
- String id = getKey(IdConvert, Integer.parseInt(key));
-
- if (key.equals("1")) {
- result.append("Das Schiff bekommt: ").append(responseJson.get(key)).append(" ").append(currencyConvert2.get(currencyConvert.get(MsgParts[1].toLowerCase()))).append(" ");
- } else {
- result.append(event.getGuild().getMemberById(id).getAsMention()).append(" bekommt ").append(responseJson.get(key)).append(" ").append(currencyConvert2.get(currencyConvert.get(MsgParts[1].toLowerCase()))).append(" ");
- }
- }
- event.getChannel().sendMessage(event.getMember().getAsMention() + " " + result.toString()).queue();
- break;
- default:
- System.out.println(":(");
- }
- con.disconnect();
-
- } catch (Exception e) {
- System.out.println("problem: " + e.getMessage());
- } finally {
- if (con != null) { // Verbindung schließen wenn noch offen
- try {
- con.disconnect();
- } catch (Exception ex) {
- System.out.println("final fehler");
- }
- }
- }
- }
-
- /**
- * Sucht in einer Map nach Wert und gibt Schlüßel zurück
- * @param map Map mit allen Werten
- * @param value gesuchtet wert
- * @param erste Typ
- * @param zweiter typ
- * @return |null
- */
- private K getKey(Map map, V value) {
- for (Map.Entry entry : map.entrySet()) {
- if (entry.getValue().equals(value)) {
- return entry.getKey();
- }
- }
- return null;
- }
-}
diff --git a/src/main/java/core/Controller.java b/src/main/java/core/Controller.java
deleted file mode 100755
index f977e40..0000000
--- a/src/main/java/core/Controller.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package core;
-
-public class Controller {
-}
diff --git a/src/main/java/core/Main.java b/src/main/java/core/Main.java
deleted file mode 100755
index c39acbc..0000000
--- a/src/main/java/core/Main.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package core;
-
-
-//import Serenity.balance;
-import net.dv8tion.jda.api.JDA;
-import net.dv8tion.jda.api.JDABuilder;
-import net.dv8tion.jda.api.OnlineStatus;
-import net.dv8tion.jda.api.entities.*;
-import net.dv8tion.jda.api.requests.GatewayIntent;
-
-public class Main {
-
- public static void main(String[] args) {
-
- // Insert your bot's token here
- //String token = "NTQ2ODk5MzYwMDEzODc3MjU4.D0u8wA.VfA2vJzundVhCl1-ibDiBaKuA8w";
- // iro
- String token = "NTQ2NzEwODUwOTIxMjk5OTc5.D0sL6A.1fUd5iBr3eo2tbPXofEqyumDm6w";
-
- JDA jda = JDABuilder.createDefault(token)
- .enableIntents(GatewayIntent.MESSAGE_CONTENT)
- .setActivity(Activity.playing("mit den Würfeln"))
- .setStatus(OnlineStatus.ONLINE)
- //.addEventListeners(new dice())
- .addEventListeners(new Earthdawn.dice())
- .addEventListeners(new Simpleroll.dice())
- .addEventListeners(new Shadowrun.dice())
- .addEventListeners(new Engel.dice())
- .addEventListeners(new Keeproll.dice())
- .setAutoReconnect(true)
- .build();
-
- //jda.upsertCommand("sr", "Calculate ping of the bot").queue();
-
- // Thread thread = new Thread(new shadowrun(jda));
- //thread.start();
-
-
-
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/core/config.java b/src/main/java/core/config.java
deleted file mode 100755
index 3cbcac8..0000000
--- a/src/main/java/core/config.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package core;
-
-import java.io.*;
-import java.util.Properties;
-
-public class config {
- public String token;
- public String GameWatching = "Den NinjaSäuen zu";
-
- public String targetRole = "Ninjasau";
- public String authorizedRole = "Chief Ninjasau";
-
- public String userNotFound = "Benutzer nicht gefunden";
- public String noPrivilegs = "Du bist nicht berechtigt den Befehl auszuführen";
-
- public String hasGroup = "%Member% hat bereits die Gruppe %Group%";
- public String becameGroup = "%Member% wurde der Gruppe %Group% zugeteilt";
-
- public String notInGroup = "%Member% ist nicht in der Gruppe %Group%";
- public String removeGroup = "%Member% wurde aus der Gruppe %Group% entfernt";
-
-
- public void readConfig() {
- FileInputStream input = null;
- OutputStream output = null;
- Properties config = new Properties();
- try {
- File f = new File("config.cfg");
- if (f.isFile() && f.canRead()) {
-
- input = new FileInputStream("config.cfg");
- config.load(input);
- if(config.containsKey("token"))
- this.token = config.getProperty("token");
- if(config.containsKey("GameWatching"))
- this.GameWatching = config.getProperty("GameWatching");
-
- if(config.containsKey("targetRole"))
- this.targetRole = config.getProperty("targetRole");
- if(config.containsKey("authorizedRole"))
- this.authorizedRole = config.getProperty("authorizedRole");
- if(config.containsKey("userNotFound"))
- this.userNotFound = config.getProperty("userNotFound");
- if(config.containsKey("noPrivilegs"))
- this.noPrivilegs = config.getProperty("noPrivilegs");
- if(config.containsKey("hasGroup"))
- this.hasGroup = config.getProperty("hasGroup");
- if(config.containsKey("becameGroup"))
- this.becameGroup = config.getProperty("becameGroup");
- if(config.containsKey("notInGroup"))
- this.notInGroup = config.getProperty("notInGroup");
- if(config.containsKey("removeGroup"))
- this.removeGroup = config.getProperty("removeGroup");
-
- }
- else {
- output = new FileOutputStream("config.cfg");
- config.setProperty("targetRole", this.targetRole);
- config.setProperty("authorizedRole", this.authorizedRole);
- config.setProperty("userNotFound", this.userNotFound);
- config.setProperty("noPrivilegs", this.noPrivilegs);
- config.setProperty("hasGroup", this.hasGroup);
- config.setProperty("becameGroup", this.becameGroup);
- config.setProperty("notInGroup", this.notInGroup);
- config.setProperty("removeGroup", this.removeGroup);
- 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/core/sample.fxml b/src/main/java/core/sample.fxml
deleted file mode 100755
index 84730f1..0000000
--- a/src/main/java/core/sample.fxml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/java/DB/base.java b/src/main/java/de/ocame/wuerfelbot/DB/base.java
old mode 100755
new mode 100644
similarity index 96%
rename from src/main/java/DB/base.java
rename to src/main/java/de/ocame/wuerfelbot/DB/base.java
index 2929965..7555d4a
--- a/src/main/java/DB/base.java
+++ b/src/main/java/de/ocame/wuerfelbot/DB/base.java
@@ -1,8 +1,5 @@
-package DB;
+package de.ocame.wuerfelbot.DB;
-import net.dv8tion.jda.api.JDA;
-
-import javax.security.auth.login.LoginException;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
diff --git a/src/main/java/de/ocame/wuerfelbot/Earthdawn/EarthdawnCommand.java b/src/main/java/de/ocame/wuerfelbot/Earthdawn/EarthdawnCommand.java
new file mode 100644
index 0000000..03d63e9
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/Earthdawn/EarthdawnCommand.java
@@ -0,0 +1,173 @@
+package de.ocame.wuerfelbot.Earthdawn;
+
+
+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.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class EarthdawnCommand implements ICommand {
+
+ private final EarthdawnLogic earthdawnLogic;
+ private final DiceOutputFormatter outputFormatter;
+
+ public EarthdawnCommand() {
+ this.earthdawnLogic = new EarthdawnLogic();
+ this.outputFormatter = new DiceOutputFormatter();
+ }
+
+ @Override
+ public String getName() {
+ return "ed";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Führt eine Earthdawn-Probe durch (Stufe + optional Karma oder Weihewürfel).";
+ }
+
+ @Override
+ public void executeSlash(SlashCommandInteractionEvent event) {
+ Integer stufe = event.getOption("stufe").getAsInt(); // "stufe" ist der Name der Option
+ Integer karma = event.getOption("karma") != null ? event.getOption("karma").getAsInt() : 0; // "karma" ist optional
+ Integer meisterkarma = event.getOption("meisterkarma") != null ? event.getOption("meisterkarma").getAsInt() : 0;
+ Integer weiheJ = event.getOption("weihe-j") != null ? event.getOption("weihe-j").getAsInt() : 0;
+ Integer weiheA = event.getOption("weihe-a") != null ? event.getOption("weihe-a").getAsInt() : 0;
+ Integer weiheV = event.getOption("weihe-v") != null ? event.getOption("weihe-v").getAsInt() : 0;
+
+
+ if (stufe < 1) {
+ event.reply(outputFormatter.formatError("Die Stufe muss mindestens 1 sein.")).setEphemeral(true).queue();
+ return;
+ }
+ if (karma < 0 || meisterkarma < 0 || weiheJ < 0 || weiheA < 0 || weiheV < 0) {
+ event.reply(outputFormatter.formatError("Zusatzwürfel dürfen nicht negativ sein.")).setEphemeral(true).queue();
+ return;
+ }
+
+ try {
+ EarthdawnLogic.EarthdawnResult result = earthdawnLogic.performEarthdawnRoll(stufe, karma, meisterkarma, weiheJ, weiheA, weiheV);
+ EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.isGlitch());
+ event.deferReply().queue();
+ //event.reply(response).queue();
+ //event.getChannel().sendMessageEmbeds(response.build()).queue();
+ event.getHook().editOriginalEmbeds(response.build()).queue();
+ // event.replyEmbeds(response.build()).queue();
+ } catch (Exception e) {
+ LoggerUtil.log("error", "EDCommand", "Fehler bei Earthdawn-Probe: " + e.getMessage());
+ event.reply(outputFormatter.formatError("Ein Fehler ist bei der Earthdawn-Probe aufgetreten.")).setEphemeral(true).queue();
+ }
+ }
+
+ @Override
+ public void executeText(MessageReceivedEvent event, String[] args) {
+ if (args.length < 1) {
+ event.getChannel().sendMessage(outputFormatter.formatError("Verwendung: `!ed [karma]`")).queue();
+ return;
+ }
+
+ Integer stufe = 0;
+ Integer karma = 0;
+ Integer meisterkarma = 0;
+ Integer weiheJ = 0;
+ Integer weiheA = 0;
+ Integer weiheV = 0;
+
+ boolean stufeParsed = false;
+
+ for (int i = 0; i < args.length; i++) {
+ String currentElement = args[i].trim().toLowerCase(); // Leerzeichen in Elementen entfernen
+
+ if (currentElement.isEmpty()) {
+ continue; // Leere Elemente überspringen
+ }
+
+ // 1. Stufe parsen (nur einmal ganz am Anfang)
+ if (!stufeParsed && currentElement.matches("^\\d+$")) {
+ stufe = Integer.parseInt(currentElement);
+ stufeParsed = true;
+ continue; // Stufe wurde geparst, gehe zum nächsten Element
+ } else if (!stufeParsed && currentElement.matches("^\\d+.*")) {
+ Pattern pattern = Pattern.compile("^(\\d+)");
+ Matcher matcher = pattern.matcher(currentElement);
+ matcher.find();
+ stufe = Integer.parseInt(matcher.group(1));
+ stufeParsed = true;
+
+ currentElement = currentElement.replaceAll("^\\d+", "");
+
+ }
+ karma += parseCharacterStat(currentElement, 'k');
+ meisterkarma += parseCharacterStat(currentElement, 'm');
+ weiheJ += parseCharacterStat(currentElement, 'j');
+ weiheA += parseCharacterStat(currentElement, 'a');
+ weiheV += parseCharacterStat(currentElement, 'v');
+
+
+ }
+
+
+ if (stufe < 1) {
+ event.getChannel().sendMessage(outputFormatter.formatError("Die Stufe muss mindestens 1 sein.")).queue();
+ return;
+ }
+
+
+ try {
+ EarthdawnLogic.EarthdawnResult result = earthdawnLogic.performEarthdawnRoll(stufe, karma, meisterkarma, weiheJ, weiheA, weiheV);
+ EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.isGlitch());
+ event.getChannel().sendMessageEmbeds(response.build()).queue();
+ } catch (Exception e) {
+ LoggerUtil.log("error", "EDCommand", "Fehler bei Earthdawn-Probe: " + e.getMessage());
+ event.getChannel().sendMessage(outputFormatter.formatError("Ein Fehler ist bei der Earthdawn-Probe aufgetreten.")).queue();
+ }
+ }
+
+ @Override
+ public CommandData getSlashCommandData() {
+ return Commands.slash(getName(), getDescription())
+ .addOption(OptionType.INTEGER, "stufe", "Stufe der Probe", true)
+ .addOption(OptionType.INTEGER, "karma", "Optionale Anzahl der Karma (W6-Würfel)", false)
+ .addOption(OptionType.INTEGER, "meisterkarma", "Optionale Anzahl der Meister-Karma (W8-Würfel)", false)
+ .addOption(OptionType.INTEGER, "weihe-j", "Optionale Anzahl der Jünger-Weihewürfe (W4-Würfel)", false)
+ .addOption(OptionType.INTEGER, "weihe-a", "Optionale Anzahl der Anhänger-Weihewürfel (W6-Würfel)", false)
+ .addOption(OptionType.INTEGER, "weihe-v", "Optionale Anzahl der Vorbild-Weihewürfel (W8-Würfel)", 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() + " ";
+ }
+
+ 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/Earthdawn/EarthdawnLogic.java b/src/main/java/de/ocame/wuerfelbot/Earthdawn/EarthdawnLogic.java
new file mode 100644
index 0000000..3e65d42
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/Earthdawn/EarthdawnLogic.java
@@ -0,0 +1,409 @@
+package de.ocame.wuerfelbot.Earthdawn;
+
+import java.util.*;
+
+public class EarthdawnLogic {
+
+ private final Random random;
+
+ private int w4;
+ private int w6;
+ private int w8;
+ private int w10;
+ private int w12;
+ private int w20;
+ private int karma;
+ private int meisterkarma;
+ private int weiheA;
+ private int weiheJ;
+ private int weiheV;
+
+ private boolean glitches;
+ private int resultInt;
+
+ private int modifier;
+
+ StringBuilder resultStructur;
+
+ public EarthdawnLogic() {
+ this.random = new Random();
+ reset();
+ }
+
+ public EarthdawnLogic reset() {
+ w4 = 0;
+ w6 = 0;
+ w8 = 0;
+ w10 = 0;
+ w12 = 0;
+ w20 = 0;
+ karma = 0;
+ meisterkarma = 0;
+ weiheJ = 0;
+ weiheA = 0;
+ weiheV = 0;
+
+ modifier = 0;
+
+ glitches = true;
+ resultInt = 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 stufe Die Stufe die Gewürfelt werden soll (Stufe). Muss >= 1 sein.
+ * @param karma Die Anzahl der W6 (Karma), die gewürfelt werden sollen. Muss >= 0 sein.
+ * @param meisterkarma Die Anzahl der W8 (Karma), die gewürfelt werden sollen. Muss >= 0 sein.
+ * @param weiheJ Die Anzahl der W4 (Weihe Juenger), die gewürfelt werden sollen. Muss >= 0 sein.
+ * @param weiheA Die Anzahl der W6 (Weihe Anheanger), die gewürfelt werden sollen. Muss >= 0 sein.
+ * @param weiheV Die Anzahl der W8 (Weihe Vorbild), die gewürfelt werden sollen. Muss >= 0 sein.
+ * @return Ein {@link EarthdawnResult}-Objekt mit den einzelnen Würfelergebnissen und Summen.
+ * @throws IllegalArgumentException Wenn stufe < 1 oder optionale < 0 ist.
+ */
+ public EarthdawnResult performEarthdawnRoll(int stufe, int karma, int meisterkarma, int weiheJ, int weiheA, int weiheV) {
+ if (stufe < 1) {
+ throw new IllegalArgumentException("Die Stufe muss mindestens 1 sein.");
+ }
+ if (karma < 0) {
+ throw new IllegalArgumentException("Karma kann nicht negativ sein.");
+ }
+ if (meisterkarma < 0) {
+ throw new IllegalArgumentException("Meister-Karma kann nicht negativ sein");
+ }
+ if (weiheJ < 0) {
+ throw new IllegalArgumentException("Jünger-Weihewürfe kann nicht negativ sein.");
+ }
+ if (weiheA < 0) {
+ throw new IllegalArgumentException("Anhänger-Weihewürfe kann nicht negativ sein.");
+ }
+ if (weiheV < 0) {
+ throw new IllegalArgumentException("Vorbild-Weihewürfe kann nicht negativ sein.");
+ }
+ reset();
+
+ // Parameter in Würfel Konvertieren
+ calcStufe(stufe);
+ this.setKarma(karma);
+ this.setMeisterkarma(meisterkarma);
+ this.setWeiheJ(weiheJ);
+ this.setWeiheA(weiheA);
+ this.setWeiheV(weiheV);
+
+ // Würfelarten durchgehen und Würfeln, Sonderwürfel werden imm am Schluss abgearbeitet
+ StringBuilder resultConstruction = new StringBuilder();
+ List rollsToPerform = new ArrayList<>();
+ if (w4 > 0) rollsToPerform.add(new DiceRollAction(w4, 4, null));
+ if (w6 > 0) rollsToPerform.add(new DiceRollAction(w6, 6, null));
+ if (w8 > 0) rollsToPerform.add(new DiceRollAction(w8, 8, null));
+ if (w10 > 0) rollsToPerform.add(new DiceRollAction(w10, 10, null));
+ if (w12 > 0) rollsToPerform.add(new DiceRollAction(w12, 12, null));
+ if (w20 > 0) rollsToPerform.add(new DiceRollAction(w20, 20, null));
+
+ // Sonderwürfel
+ if (karma > 0) rollsToPerform.add(new DiceRollAction(karma, 6, "Karma"));
+ if (meisterkarma > 0) rollsToPerform.add(new DiceRollAction(meisterkarma, 8, "Meisterkarma"));
+ if (weiheJ > 0) rollsToPerform.add(new DiceRollAction(weiheJ, 4, "Jünger"));
+ if (weiheA > 0) rollsToPerform.add(new DiceRollAction(weiheA, 6, "Anhänger"));
+ if (weiheV > 0) rollsToPerform.add(new DiceRollAction(weiheV, 8, "Vorbild"));
+
+ for (DiceRollAction action : rollsToPerform) {
+ rollDice(action.count, action.sides);
+
+ if (!resultConstruction.isEmpty()) {
+ resultConstruction.append(" + ");
+ }
+
+ if (action.label != null) {
+ resultConstruction.append(action.count).append("w").append(action.sides).append(" (").append(action.label).append(")");
+ } else {
+ resultConstruction.append(action.count).append("w").append(action.sides);
+ }
+ }
+
+ // Modifikator separat behandeln, da er nicht gewürfelt wird
+ if (modifier != 0) {
+ resultInt += modifier; // Addiere den Modifikator zur Gesamtsum
+
+ if (!resultConstruction.isEmpty()) {
+ resultConstruction.append(modifier > 0 ? " + " : " - "); // Füge + oder - hinzu
+ }
+ resultConstruction.append(Math.abs(modifier)); // Zeige den absoluten Wert an
+ }
+
+ return new EarthdawnResult(resultStructur.toString(), resultInt, resultConstruction.toString(), isGlitches());
+ }
+
+ /**
+ * Eine innere Klasse, die das Ergebnis einer Earthdawn-Probe kapselt.
+ * Dies macht die Rückgabe mehrerer Werte einfacher und lesbarer.
+ */
+ public static class EarthdawnResult {
+ private final String resultStructur;
+ private final String resultInt;
+ private final String resultConstruction;
+ private final boolean glitch;
+
+ public boolean isGlitch() {
+ return glitch;
+ }
+
+ public EarthdawnResult(String resultStructur, int resultInt, String resultConstruction, boolean glitch) {
+ this.resultStructur = resultStructur;
+ this.resultInt = String.valueOf(resultInt);
+ this.glitch = glitch;
+ this.resultConstruction = resultConstruction;
+ }
+
+ public String getResultStructur() {
+ return resultStructur;
+ }
+
+ public String getResultInt() {
+ return resultInt;
+ }
+
+ public String getDescription() {
+ return "(" + resultStructur + ")";
+ }
+
+ public String getTitle() {
+ String message = "%rolls%: %hits%";
+ return message.replace("%rolls%", resultConstruction).replace("%hits%", resultInt);
+ }
+
+ }
+
+
+ /**
+ * Berechnet die benutzten Würfel anhand der Stufe
+ *
+ * @param stufe
+ */
+ private void calcStufe(int stufe) {
+
+ switch (stufe) {
+ case 1:
+ this.setW4(1).setModifier(-2);
+ break;
+ case 2:
+ this.setW4(1).setModifier(-1);
+ break;
+ case 3:
+ this.setW4(1);
+ break;
+ case 4:
+ this.setW6(1);
+ break;
+ case 5:
+ this.setW8(1);
+ break;
+ case 6:
+ this.setW10(1);
+ break;
+ case 7:
+ this.setW12(1);
+ break;
+ case 8:
+ this.setW6(2);
+ break;
+ case 9:
+ this.setW8(1).setW6(1);
+ break;
+ case 10:
+ this.setW8(2);
+ break;
+ case 11:
+ this.setW10(1).setW8(1);
+ break;
+ case 12:
+ this.setW10(2);
+ case 13:
+ this.setW12(1).setW10(1);
+ break;
+ case 14:
+ this.setW12(2);
+ break;
+ case 15:
+ this.setW12(1).setW6(2);
+ break;
+ case 16:
+ this.setW12(1).setW8(1).setW6(1);
+ break;
+ case 17:
+ this.setW12(1).setW8(2);
+ break;
+ case 18:
+ this.setW12(1).setW10(1).setW8(1);
+ break;
+ default:
+ int w20 = 0;
+ w20 = (stufe-8)/11;
+ switch ((stufe-8)%11) {
+ case 0:
+ this.setW20(w20).setW6(2);
+ break;
+ case 1:
+ this.setW20(w20).setW8(1).setW6(1);
+ break;
+ case 2:
+ this.setW20(w20).setW8(2);
+ break;
+ case 3:
+ this.setW20(w20).setW10(1).setW8(1);
+ break;
+ case 4:
+ this.setW20(w20).setW10(2);
+ break;
+ case 5:
+ this.setW20(w20).setW12(1).setW10(1);
+ break;
+ case 6:
+ this.setW20(w20).setW12(2);
+ break;
+ case 7:
+ this.setW20(w20).setW12(1).setW6(2);
+ break;
+ case 8:
+ this.setW20(w20).setW12(1).setW8(1).setW6(1);
+ break;
+ case 9:
+ this.setW20(w20).setW12(1).setW8(2);
+ break;
+ case 10:
+ this.setW20(w20).setW12(1).setW10(1).setW8(1);
+ break;
+ }
+
+ }
+
+
+ /*
+ diceList[30] = "2W20+2W6";
+ diceList[31] = "2W20+W8+W6";
+ diceList[32] = "2W20+2W8";
+ diceList[33] = "2W20+W10+W8";
+ diceList[34] = "2W20+2W10";
+ diceList[35] = "2W20+W12+W10";
+ diceList[36] = "2W20+2W12";
+ diceList[37] = "2W20+W12+2W6";
+ diceList[38] = "2W20+W12+W8+W6";
+ diceList[39] = "2W20+W12+2W8";
+ diceList[40] = "2W20+W12+W10+W8";
+ */
+
+ }
+
+
+ public EarthdawnLogic setW4(int w4) {
+ this.w4 = w4;
+ return this;
+ }
+
+ public EarthdawnLogic setW6(int w6) {
+ this.w6 = w6;
+ return this;
+ }
+
+
+ public EarthdawnLogic setW8(int w8) {
+ this.w8 = w8;
+ return this;
+ }
+
+ public EarthdawnLogic setW10(int w10) {
+ this.w10 = w10;
+ return this;
+ }
+
+ public EarthdawnLogic setW12(int w12) {
+ this.w12 = w12;
+ return this;
+ }
+
+ public EarthdawnLogic setW20(int w20) {
+ this.w20 = w20;
+ return this;
+ }
+
+
+ public EarthdawnLogic setKarma(int karma) {
+ this.karma = karma;
+ return this;
+ }
+
+
+ public EarthdawnLogic setMeisterkarma(int meisterkarma) {
+ this.meisterkarma = meisterkarma;
+ return this;
+ }
+
+ public EarthdawnLogic setWeiheA(int weiheA) {
+ this.weiheA = weiheA;
+ return this;
+ }
+
+
+ public EarthdawnLogic setWeiheJ(int weiheJ) {
+ this.weiheJ = weiheJ;
+ return this;
+ }
+
+
+ public EarthdawnLogic setWeiheV(int weiheV) {
+ this.weiheV = weiheV;
+ return this;
+ }
+
+ public boolean isGlitches() {
+ return glitches;
+ }
+
+ public EarthdawnLogic setGlitches(boolean glitches) {
+ this.glitches = glitches;
+ return this;
+ }
+
+
+ public EarthdawnLogic setModifier(int modifier) {
+ this.modifier = modifier;
+ return this;
+ }
+
+
+
+ private void rollDice(int numberOfDice, int diceart) {
+ int dice;
+ for(int i = 0; i < numberOfDice; i++) {
+ dice = random.nextInt(diceart);
+ if(resultStructur.length() > 0) {
+ resultStructur.append(" ");
+ }
+ resultStructur.append(dice+1);
+ resultStructur.append("/");
+ resultStructur.append(diceart);
+ resultInt += dice+1;
+ if(dice+1 == diceart)
+ i--;
+ if(dice > 0)
+ glitches = false;
+ }
+ }
+ static class DiceRollAction {
+ int count;
+ int sides;
+ String label; // Optionaler Beschreibungslabel
+
+ public DiceRollAction(int count, int sides, String label) {
+ this.count = count;
+ this.sides = sides;
+ this.label = label;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/Earthdawn/dice.java b/src/main/java/de/ocame/wuerfelbot/Earthdawn/dice.java
similarity index 78%
rename from src/main/java/Earthdawn/dice.java
rename to src/main/java/de/ocame/wuerfelbot/Earthdawn/dice.java
index 6ef991b..40114b9 100644
--- a/src/main/java/Earthdawn/dice.java
+++ b/src/main/java/de/ocame/wuerfelbot/Earthdawn/dice.java
@@ -1,36 +1,24 @@
-package Earthdawn;
+package de.ocame.wuerfelbot.Earthdawn;
-import Shadowrun.db_connect;
-import Shadowrun.help;
+import de.ocame.wuerfelbot.Shadowrun.db_connect;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.ChannelType;
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.lang.reflect.Array;
-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 String prefixIni;
-
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;
@@ -43,19 +31,6 @@ public class dice extends ListenerAdapter {
this.prefixSr = "/ed";
//this.prefixIni = "/ini";
-
- helpDe.add("Alle Befehle können in einen Channel geschrieben werden oder per Direkt Nachricht gesendet");
- 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");
-
-
this.db = new db_connect();
}
@@ -85,7 +60,7 @@ public class dice extends ListenerAdapter {
author.isBot();
if (true) {
if (event.getMessage().getContentRaw().startsWith(this.prefixSr))
- this.srroll(event);
+ this.roll(event);
}
}
@@ -95,68 +70,7 @@ public class dice extends ListenerAdapter {
*
* @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().sendMessage(test.build().toString()).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) {
+ private void roll(MessageReceivedEvent event) {
EmbedBuilder outputBox = new EmbedBuilder();
diff --git a/src/main/java/Earthdawn/language.java b/src/main/java/de/ocame/wuerfelbot/Earthdawn/language.java
similarity index 98%
rename from src/main/java/Earthdawn/language.java
rename to src/main/java/de/ocame/wuerfelbot/Earthdawn/language.java
index b8153f2..cab5059 100644
--- a/src/main/java/Earthdawn/language.java
+++ b/src/main/java/de/ocame/wuerfelbot/Earthdawn/language.java
@@ -1,4 +1,4 @@
-package Earthdawn;
+package de.ocame.wuerfelbot.Earthdawn;
import java.io.*;
import java.util.Properties;
diff --git a/src/main/java/Earthdawn/messageInterpreter.java b/src/main/java/de/ocame/wuerfelbot/Earthdawn/messageInterpreter.java
similarity index 98%
rename from src/main/java/Earthdawn/messageInterpreter.java
rename to src/main/java/de/ocame/wuerfelbot/Earthdawn/messageInterpreter.java
index 69de82b..781d5d8 100644
--- a/src/main/java/Earthdawn/messageInterpreter.java
+++ b/src/main/java/de/ocame/wuerfelbot/Earthdawn/messageInterpreter.java
@@ -1,4 +1,4 @@
-package Earthdawn;
+package de.ocame.wuerfelbot.Earthdawn;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
diff --git a/src/main/java/Earthdawn/step.java b/src/main/java/de/ocame/wuerfelbot/Earthdawn/step.java
similarity index 99%
rename from src/main/java/Earthdawn/step.java
rename to src/main/java/de/ocame/wuerfelbot/Earthdawn/step.java
index 3e8524f..50bbd4f 100644
--- a/src/main/java/Earthdawn/step.java
+++ b/src/main/java/de/ocame/wuerfelbot/Earthdawn/step.java
@@ -1,4 +1,4 @@
-package Earthdawn;
+package de.ocame.wuerfelbot.Earthdawn;
import java.util.Random;
diff --git a/src/main/java/Engel/arcana.java b/src/main/java/de/ocame/wuerfelbot/Engel/arcana.java
similarity index 97%
rename from src/main/java/Engel/arcana.java
rename to src/main/java/de/ocame/wuerfelbot/Engel/arcana.java
index 97e5fbd..f16099a 100644
--- a/src/main/java/Engel/arcana.java
+++ b/src/main/java/de/ocame/wuerfelbot/Engel/arcana.java
@@ -1,4 +1,4 @@
-package Engel;
+package de.ocame.wuerfelbot.Engel;
public class arcana {
private final String name;
diff --git a/src/main/java/Engel/arcanaList.java b/src/main/java/de/ocame/wuerfelbot/Engel/arcanaList.java
similarity index 99%
rename from src/main/java/Engel/arcanaList.java
rename to src/main/java/de/ocame/wuerfelbot/Engel/arcanaList.java
index dd6ccc8..4211fc4 100644
--- a/src/main/java/Engel/arcanaList.java
+++ b/src/main/java/de/ocame/wuerfelbot/Engel/arcanaList.java
@@ -1,8 +1,7 @@
-package Engel;
+package de.ocame.wuerfelbot.Engel;
import net.dv8tion.jda.api.EmbedBuilder;
-import java.awt.*;
import java.util.Random;
public class arcanaList {
diff --git a/src/main/java/Engel/dice.java b/src/main/java/de/ocame/wuerfelbot/Engel/dice.java
similarity index 96%
rename from src/main/java/Engel/dice.java
rename to src/main/java/de/ocame/wuerfelbot/Engel/dice.java
index f68a54e..115a14a 100644
--- a/src/main/java/Engel/dice.java
+++ b/src/main/java/de/ocame/wuerfelbot/Engel/dice.java
@@ -1,8 +1,8 @@
-package Engel;
+package de.ocame.wuerfelbot.Engel;
-import Shadowrun.db_connect;
-import Simpleroll.help;
-import Simpleroll.language;
+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;
@@ -12,7 +12,6 @@ import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
-import java.util.Random;
public class dice extends ListenerAdapter {
diff --git a/src/main/java/Engel/language.java b/src/main/java/de/ocame/wuerfelbot/Engel/language.java
similarity index 98%
rename from src/main/java/Engel/language.java
rename to src/main/java/de/ocame/wuerfelbot/Engel/language.java
index cef2b76..add3186 100644
--- a/src/main/java/Engel/language.java
+++ b/src/main/java/de/ocame/wuerfelbot/Engel/language.java
@@ -1,4 +1,4 @@
-package Engel;
+package de.ocame.wuerfelbot.Engel;
import java.io.*;
import java.util.Properties;
diff --git a/src/main/java/Keeproll/dice.java b/src/main/java/de/ocame/wuerfelbot/Keeproll/dice.java
similarity index 98%
rename from src/main/java/Keeproll/dice.java
rename to src/main/java/de/ocame/wuerfelbot/Keeproll/dice.java
index 335111f..c805883 100644
--- a/src/main/java/Keeproll/dice.java
+++ b/src/main/java/de/ocame/wuerfelbot/Keeproll/dice.java
@@ -1,8 +1,8 @@
-package Keeproll;
+package de.ocame.wuerfelbot.Keeproll;
-import Shadowrun.db_connect;
-import Simpleroll.help;
-import Simpleroll.language;
+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;
diff --git a/src/main/java/Keeproll/result.java b/src/main/java/de/ocame/wuerfelbot/Keeproll/result.java
similarity index 98%
rename from src/main/java/Keeproll/result.java
rename to src/main/java/de/ocame/wuerfelbot/Keeproll/result.java
index c182f9e..3ab57b5 100644
--- a/src/main/java/Keeproll/result.java
+++ b/src/main/java/de/ocame/wuerfelbot/Keeproll/result.java
@@ -1,4 +1,4 @@
-package Keeproll;
+package de.ocame.wuerfelbot.Keeproll;
import java.util.Random;
diff --git a/src/main/java/Shadowrun/db_connect.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/db_connect.java
old mode 100755
new mode 100644
similarity index 98%
rename from src/main/java/Shadowrun/db_connect.java
rename to src/main/java/de/ocame/wuerfelbot/Shadowrun/db_connect.java
index 16de9cd..8b32a16
--- a/src/main/java/Shadowrun/db_connect.java
+++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/db_connect.java
@@ -1,6 +1,5 @@
-package Shadowrun;
+package de.ocame.wuerfelbot.Shadowrun;
-import javax.print.DocFlavor;
import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -8,7 +7,7 @@ import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
-public class db_connect extends DB.base {
+public class db_connect extends de.ocame.wuerfelbot.DB.base {
Connection conn;
public db_connect() {
diff --git a/src/main/java/Shadowrun/dice.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/dice.java
old mode 100755
new mode 100644
similarity index 99%
rename from src/main/java/Shadowrun/dice.java
rename to src/main/java/de/ocame/wuerfelbot/Shadowrun/dice.java
index 4befcfb..c1fb1d0
--- a/src/main/java/Shadowrun/dice.java
+++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/dice.java
@@ -1,16 +1,13 @@
-package Shadowrun;
+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.Member;
-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 net.dv8tion.jda.api.requests.restaction.*;
import java.awt.*;
diff --git a/src/main/java/Simpleroll/help.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/help.java
similarity index 93%
rename from src/main/java/Simpleroll/help.java
rename to src/main/java/de/ocame/wuerfelbot/Shadowrun/help.java
index a973a4a..2962615 100644
--- a/src/main/java/Simpleroll/help.java
+++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/help.java
@@ -1,4 +1,4 @@
-package Simpleroll;
+package de.ocame.wuerfelbot.Shadowrun;
public class help {
diff --git a/src/main/java/Shadowrun/language.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/language.java
old mode 100755
new mode 100644
similarity index 98%
rename from src/main/java/Shadowrun/language.java
rename to src/main/java/de/ocame/wuerfelbot/Shadowrun/language.java
index 4dfafae..162b482
--- a/src/main/java/Shadowrun/language.java
+++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/language.java
@@ -1,4 +1,4 @@
-package Shadowrun;
+package de.ocame.wuerfelbot.Shadowrun;
import java.io.*;
import java.util.Properties;
diff --git a/src/main/java/Shadowrun/messageInterpreter.java b/src/main/java/de/ocame/wuerfelbot/Shadowrun/messageInterpreter.java
similarity index 98%
rename from src/main/java/Shadowrun/messageInterpreter.java
rename to src/main/java/de/ocame/wuerfelbot/Shadowrun/messageInterpreter.java
index f9e1bee..a65cd0a 100644
--- a/src/main/java/Shadowrun/messageInterpreter.java
+++ b/src/main/java/de/ocame/wuerfelbot/Shadowrun/messageInterpreter.java
@@ -1,4 +1,4 @@
-package Shadowrun;
+package de.ocame.wuerfelbot.Shadowrun;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
diff --git a/src/main/java/Simpleroll/dice.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/dice.java
similarity index 98%
rename from src/main/java/Simpleroll/dice.java
rename to src/main/java/de/ocame/wuerfelbot/Simpleroll/dice.java
index 4af073b..dfc66a4 100644
--- a/src/main/java/Simpleroll/dice.java
+++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/dice.java
@@ -1,6 +1,6 @@
-package Simpleroll;
+package de.ocame.wuerfelbot.Simpleroll;
-import Shadowrun.db_connect;
+import de.ocame.wuerfelbot.Shadowrun.db_connect;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.ChannelType;
@@ -10,7 +10,6 @@ import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
-import java.util.Random;
public class dice extends ListenerAdapter {
diff --git a/src/main/java/Simpleroll/diceOld.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/diceOld.java
similarity index 97%
rename from src/main/java/Simpleroll/diceOld.java
rename to src/main/java/de/ocame/wuerfelbot/Simpleroll/diceOld.java
index cab5ecd..0be2eb6 100644
--- a/src/main/java/Simpleroll/diceOld.java
+++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/diceOld.java
@@ -1,6 +1,6 @@
-package Simpleroll;
+package de.ocame.wuerfelbot.Simpleroll;
-import Shadowrun.db_connect;
+import de.ocame.wuerfelbot.Shadowrun.db_connect;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.User;
@@ -227,9 +227,9 @@ public class diceOld extends ListenerAdapter {
result.append("Ich kann aktuell folgent Wüfe:\n");
result.append("**/r** bzw. **/roll** für Allgemeine würfe. Ohne eine angabe vom Würfeltyp wird ein W6 benuzt\n\n");
- result.append("**/sr** für Shadowrun 5\n\n");
- result.append("**/ed** für Earthdawn 4\n\n");
- result.append("**/e** bzw **/engel** für die Arcane Version von Engel\n\n");
+ result.append("**/sr** für de.ocame.wuerfelbot.Shadowrun 5\n\n");
+ result.append("**/ed** für de.ocame.wuerfelbot.Earthdawn 4\n\n");
+ result.append("**/e** bzw **/engel** für die Arcane Version von de.ocame.wuerfelbot.Engel\n\n");
result.append("**/l5r** bzw **/keep** für Legend of the 5 Rings\n");
outputBox.setDescription(result);
diff --git a/src/main/java/Shadowrun/help.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/help.java
old mode 100755
new mode 100644
similarity index 87%
rename from src/main/java/Shadowrun/help.java
rename to src/main/java/de/ocame/wuerfelbot/Simpleroll/help.java
index 729b902..a193927
--- a/src/main/java/Shadowrun/help.java
+++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/help.java
@@ -1,6 +1,4 @@
-package Shadowrun;
-
-import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+package de.ocame.wuerfelbot.Simpleroll;
public class help {
diff --git a/src/main/java/Simpleroll/language.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/language.java
similarity index 98%
rename from src/main/java/Simpleroll/language.java
rename to src/main/java/de/ocame/wuerfelbot/Simpleroll/language.java
index 9bd035b..5e31698 100644
--- a/src/main/java/Simpleroll/language.java
+++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/language.java
@@ -1,4 +1,4 @@
-package Simpleroll;
+package de.ocame.wuerfelbot.Simpleroll;
import java.io.*;
import java.util.Properties;
diff --git a/src/main/java/Simpleroll/messageInterpreter.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/messageInterpreter.java
similarity index 99%
rename from src/main/java/Simpleroll/messageInterpreter.java
rename to src/main/java/de/ocame/wuerfelbot/Simpleroll/messageInterpreter.java
index 027260e..b96a10b 100644
--- a/src/main/java/Simpleroll/messageInterpreter.java
+++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/messageInterpreter.java
@@ -1,6 +1,4 @@
-package Simpleroll;
-
-import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+package de.ocame.wuerfelbot.Simpleroll;
import java.util.Random;
import java.util.regex.Matcher;
diff --git a/src/main/java/Simpleroll/subpart.java b/src/main/java/de/ocame/wuerfelbot/Simpleroll/subpart.java
similarity index 97%
rename from src/main/java/Simpleroll/subpart.java
rename to src/main/java/de/ocame/wuerfelbot/Simpleroll/subpart.java
index e432ac4..90548d4 100644
--- a/src/main/java/Simpleroll/subpart.java
+++ b/src/main/java/de/ocame/wuerfelbot/Simpleroll/subpart.java
@@ -1,4 +1,4 @@
-package Simpleroll;
+package de.ocame.wuerfelbot.Simpleroll;
public class subpart {
private StringBuilder bodyOutput;
diff --git a/src/main/java/Socket/shadowrun.java b/src/main/java/de/ocame/wuerfelbot/Socket/shadowrun.java
old mode 100755
new mode 100644
similarity index 98%
rename from src/main/java/Socket/shadowrun.java
rename to src/main/java/de/ocame/wuerfelbot/Socket/shadowrun.java
index 5eb97fa..4d57b83
--- a/src/main/java/Socket/shadowrun.java
+++ b/src/main/java/de/ocame/wuerfelbot/Socket/shadowrun.java
@@ -1,4 +1,4 @@
-package Socket;
+package de.ocame.wuerfelbot.Socket;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
@@ -27,7 +27,7 @@ public class shadowrun implements Runnable{
public void run() {
int port = 11112;
try (ServerSocket listener = new ServerSocket(port)) {
- System.out.println("Socket Server laeuft...");
+ System.out.println("de.ocame.wuerfelbot.Socket Server laeuft...");
ExecutorService pool = Executors.newFixedThreadPool(20);
while (true) {
pool.execute(new iniEcho(listener.accept(), jda));
diff --git a/src/main/java/Vampire/dice.java b/src/main/java/de/ocame/wuerfelbot/Vampire/dice.java
similarity index 98%
rename from src/main/java/Vampire/dice.java
rename to src/main/java/de/ocame/wuerfelbot/Vampire/dice.java
index 1a47179..b13500a 100644
--- a/src/main/java/Vampire/dice.java
+++ b/src/main/java/de/ocame/wuerfelbot/Vampire/dice.java
@@ -1,8 +1,8 @@
-package Vampire;
+package de.ocame.wuerfelbot.Vampire;
-import Shadowrun.db_connect;
-import Simpleroll.help;
-import Simpleroll.language;
+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;
diff --git a/src/main/java/Vampire/result.java b/src/main/java/de/ocame/wuerfelbot/Vampire/result.java
similarity index 98%
rename from src/main/java/Vampire/result.java
rename to src/main/java/de/ocame/wuerfelbot/Vampire/result.java
index 160efa8..98cf7fc 100644
--- a/src/main/java/Vampire/result.java
+++ b/src/main/java/de/ocame/wuerfelbot/Vampire/result.java
@@ -1,4 +1,4 @@
-package Vampire;
+package de.ocame.wuerfelbot.Vampire;
import java.util.Random;
diff --git a/src/main/java/de/ocame/wuerfelbot/commands/CommandListener.java b/src/main/java/de/ocame/wuerfelbot/commands/CommandListener.java
new file mode 100644
index 0000000..adb19b0
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/commands/CommandListener.java
@@ -0,0 +1,113 @@
+package de.ocame.wuerfelbot.commands;
+
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.ChannelType;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+
+public class CommandListener extends ListenerAdapter {
+
+ private final String prefix;
+ private final CommandManager commandManager;
+
+
+ public CommandListener(CommandManager commandManager, String prefix) {
+ this.commandManager = commandManager;
+ this.prefix = prefix;
+ }
+
+
+ public void onMessageReceivedX(MessageReceivedEvent event) {
+ if ((!event.getMessage().getContentRaw().startsWith(this.prefix))
+ || (event.getChannelType() != ChannelType.TEXT && event.getChannelType() != ChannelType.PRIVATE)) {
+ return;
+ }
+
+
+
+ User author = event.getAuthor();
+ author.isBot();
+ /*if (true) {
+ if (event.getMessage().getContentRaw().startsWith(this.prefixSr))
+ this.roll(event);
+ }*/
+ }
+
+
+ /**
+ * Behandelt Slash-Befehle.
+ * Dies ist die empfohlene Methode zur Befehlsverarbeitung in modernen Discord-Bots.
+ */
+ @Override
+ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
+ // Ignoriere Bots, damit dein Bot nicht auf Befehle von anderen Bots reagiert
+ if (event.getUser().isBot()) {
+ return;
+ }
+
+ // Delegiere das Event an den CommandManager
+ // Der CommandManager ist dafür zuständig, den passenden ICommand zu finden und auszuführen.
+ commandManager.handleSlashCommand(event);
+ }
+
+ /**
+ * Behandelt traditionelle Text-Befehle.
+ * Dies ist nützlich für ältere Bots oder spezifische Anwendungsfälle.
+ */
+ @Override
+ public void onMessageReceived(MessageReceivedEvent event) {
+ // Ignoriere Bots
+ if (event.getAuthor().isBot()) {
+ //return; // ausgemacht für christian
+ }
+
+ String messageContent = event.getMessage().getContentRaw();
+
+ // Überprüfe, ob die Nachricht mit dem definierten Präfix beginnt
+ if (messageContent.startsWith(prefix)) {
+ // Entferne den Präfix und teile die Nachricht in Befehl und Argumente
+ String[] args = messageContent.substring(prefix.length()).trim().split("\\s+");
+ if (args.length == 0) {
+ return; // Leere Nachricht nach Präfix
+ }
+
+ String commandName = args[0].toLowerCase(); // Der Befehlsname (z.B. "roll", "ed")
+
+ // Erzeuge ein neues Array für die Argumente ohne den Befehlsnamen
+ String[] commandArgs = new String[args.length - 1];
+ System.arraycopy(args, 1, commandArgs, 0, args.length - 1);
+
+ // Delegiere den Text-Befehl an den CommandManager
+ commandManager.handleTextMessage(event, commandName, commandArgs);
+ }
+ }
+
+ /**
+ * Optional: Methode zur Registrierung von Slash-Befehlen beim Start des Bots.
+ * Diese Methode könnte auch in DiscordBot.java oder CommandManager.java liegen.
+ * Hier nur als Beispiel, wie sie im Listener aussehen könnte, wenn er dafür zuständig wäre.
+ */
+ public void registerSlashCommands() {
+ // Erstelle eine Liste von Befehlen, die du registrieren möchtest
+ // Diese Befehle sollten den Definitionen in deinen ICommand-Implementierungen entsprechen
+ // CommandData rollCommand = Commands.slash("roll", "Würfelt eine Zahl")
+ // .addOption(OptionType.STRING, "notation", "Die Würfelnotation, z.B. 1d6", true);
+ //
+ // CommandData edCommand = Commands.slash("ed", "Führt eine Earthdawn-Operation aus")
+ // .addOption(OptionType.INTEGER, "zahl", "Eine Zahl für die Earthdawn-Operation", true);
+ //
+ // commandManager.getJda().updateCommands() // Für globale Befehle
+ // .addCommands(rollCommand, edCommand)
+ // .queue();
+
+ // Oder für Gilden-spezifische Befehle (schneller zu testen):
+ // Guild guild = commandManager.getJda().getGuildById("DEINE_GILDE_ID");
+ // if (guild != null) {
+ // guild.updateCommands()
+ // .addCommands(rollCommand, edCommand)
+ // .queue();
+ // }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java b/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java
new file mode 100644
index 0000000..915e362
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/commands/CommandManager.java
@@ -0,0 +1,146 @@
+package de.ocame.wuerfelbot.commands;
+
+
+import de.ocame.wuerfelbot.Earthdawn.EarthdawnCommand;
+import de.ocame.wuerfelbot.core.LoggerUtil;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.interactions.commands.build.CommandData; // Wichtig für die Registrierung
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class CommandManager {
+
+ private final Map commands;
+ private final JDA jda; // Referenz zur JDA-Instanz, um Befehle zu registrieren
+
+ public CommandManager(JDA jda) {
+ this.jda = jda;
+ this.commands = new HashMap<>();
+ registerCommands(); // Befehle beim Start registrieren
+ }
+
+ /**
+ * Registriert alle Befehle des Bots.
+ * Hier werden die konkreten Implementierungen der ICommand-Schnittstelle hinzugefügt.
+ */
+ private void registerCommands() {
+ // Füge deine Befehlsimplementierungen hier hinzu
+ //addCommand(new SimpleRollCommand());
+ addCommand(new EarthdawnCommand());
+
+ // Hier können wir auch die Slash-Befehle bei Discord registrieren
+ updateSlashCommands();
+ }
+
+ /**
+ * Fügt einen Befehl zur internen Map hinzu.
+ * @param command Die Instanz des zu registrierenden Befehls.
+ */
+ private void addCommand(ICommand command) {
+ if (commands.containsKey(command.getName())) {
+ LoggerUtil.log("warn", "ComMan", "Befehl '" + command.getName() + "' ist bereits registriert und wird überschrieben.");
+ }
+ commands.put(command.getName().toLowerCase(), command); // Befehlsnamen klein speichern für konsistente Suche
+ LoggerUtil.log("info", "ComMan", "Befehl registriert: " + command.getName());
+ }
+
+ /**
+ * Behandelt einen eingehenden Slash-Befehl.
+ * Sucht den passenden Befehl und führt ihn aus.
+ *
+ * @param event Das SlashCommandInteractionEvent von JDA.
+ */
+ public void handleSlashCommand(SlashCommandInteractionEvent event) {
+ String commandName = event.getName().toLowerCase();
+ ICommand command = commands.get(commandName);
+
+ if (command != null) {
+ try {
+ // Führe den Befehl aus
+ command.executeSlash(event);
+ } catch (Exception e) {
+ LoggerUtil.log("error", "ComMan", "Fehler beim Ausführen von Slash-Befehl '" + commandName + "': " + e.getMessage());
+ event.reply("Hoppla! Beim Ausführen des Befehls ist ein Fehler aufgetreten.").setEphemeral(true).queue();
+ }
+ } else {
+ // Dies sollte bei Slash-Befehlen eigentlich nicht vorkommen,
+ // da Discord nur registrierte Befehle sendet.
+ event.reply("Unbekannter Slash-Befehl: " + commandName).setEphemeral(true).queue();
+ LoggerUtil.log("warn", "ComMan", "Unbekannter Slash-Befehl empfangen: " + commandName);
+ }
+ }
+
+ /**
+ * Behandelt einen eingehenden Text-Befehl.
+ * Sucht den passenden Befehl und führt ihn aus.
+ *
+ * @param event Das MessageReceivedEvent von JDA.
+ * @param commandName Der Name des Befehls (ohne Präfix).
+ * @param args Die Argumente des Befehls.
+ */
+ public void handleTextMessage(MessageReceivedEvent event, String commandName, String[] args) {
+ ICommand command = commands.get(commandName);
+
+ if (command != null) {
+ try {
+ // Führe den Befehl aus
+ command.executeText(event, args);
+ } catch (Exception e) {
+ LoggerUtil.log("error", "ComMan", "Fehler beim Ausführen von Text-Befehl '" + commandName + "': " + e.getMessage());
+ event.getChannel().sendMessage("Hoppla! Beim Ausführen des Befehls ist ein Fehler aufgetreten.").queue();
+ }
+ } else {
+ event.getChannel().sendMessage("Unbekannter Befehl: `" + commandName + "`").queue();
+ LoggerUtil.log("error", "ComMan", "Unbekannter Text-Befehl empfangen: " + commandName);
+ }
+ }
+
+ /**
+ * Registriert oder aktualisiert die Slash-Befehle bei Discord.
+ * Diese Methode sollte beim Start des Bots einmalig aufgerufen werden.
+ */
+ public void updateSlashCommands() {
+ // Sammle alle CommandData-Objekte von den registrierten Befehlen
+ Set slashCommandData = commands.values().stream()
+ .map(ICommand::getSlashCommandData) // Ruft die Methode im ICommand Interface auf
+ .filter(Objects::nonNull) // Nur Befehle, die auch SlashCommandData liefern
+ .collect(Collectors.toSet());
+
+ if (slashCommandData.isEmpty()) {
+ LoggerUtil.log("warn", "ComMan", "Keine Slash-Befehle zum Registrieren gefunden.");
+ return;
+ }
+
+ // Beispiel: Registriere globale Befehle
+ // Für Entwicklung und schnelle Tests empfiehlt es sich, gilden-spezifische Befehle zu nutzen.
+ // jda.updateCommands().addCommands(slashCommandData).queue();
+
+ // Beispiel: Registriere gilden-spezifische Befehle (empfohlen für Entwicklung)
+ // Ersetze "DEINE_GILDE_ID" durch die tatsächliche ID deiner Test-Gilde.
+ String guildId = System.getenv("404979829537243148"); // Aus Umgebungsvariable lesen
+ if (guildId != null && !guildId.isEmpty()) {
+ jda.getGuildById(guildId)
+ .updateCommands()
+ .addCommands(slashCommandData)
+ .queue(
+ success -> LoggerUtil.log("info", "ComMan", "Slash-Befehle für Gilde " + guildId + " erfolgreich aktualisiert."),
+ failure -> LoggerUtil.log("error", "ComMan", "Fehler beim Aktualisieren der Slash-Befehle für Gilde " + guildId + ": " + failure.getMessage())
+ );
+ } else {
+ // Wenn keine Gilden-ID konfiguriert ist, globale Befehle registrieren
+ jda.updateCommands()
+ .addCommands(slashCommandData)
+ .queue(
+ success -> LoggerUtil.log("info", "ComMan", "Globale Slash-Befehle erfolgreich aktualisiert."),
+ failure -> LoggerUtil.log("error", "ComMan", "Fehler beim Aktualisieren der globalen Slash-Befehle: " + failure.getMessage())
+ );
+ }
+ LoggerUtil.log("info", "ComMan", "Registrierungsanfrage für " + slashCommandData.size() + " Slash-Befehle gesendet.");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/ocame/wuerfelbot/commands/ICommand.java b/src/main/java/de/ocame/wuerfelbot/commands/ICommand.java
new file mode 100644
index 0000000..dc766c5
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/commands/ICommand.java
@@ -0,0 +1,53 @@
+package de.ocame.wuerfelbot.commands;
+
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.interactions.commands.build.CommandData;
+
+public interface ICommand {
+
+ /**
+ * Gibt den Namen des Befehls zurück.
+ * Dieser Name wird sowohl für Slash-Befehle als auch für Text-Befehle verwendet
+ * und sollte eindeutig sein (z.B. "roll", "ed").
+ *
+ * @return Der Name des Befehls.
+ */
+ String getName();
+
+ /**
+ * Gibt eine kurze Beschreibung des Befehls zurück.
+ * Diese Beschreibung wird in der Discord-UI für Slash-Befehle angezeigt.
+ *
+ * @return Eine kurze Beschreibung des Befehls.
+ */
+ String getDescription();
+
+ /**
+ * Führt die Logik des Befehls aus, wenn er als Slash-Befehl empfangen wird.
+ * Implementierungen sollten hier die spezifische Befehlslogik verarbeiten und auf das Event antworten.
+ *
+ * @param event Das {@link SlashCommandInteractionEvent}, das von JDA ausgelöst wurde.
+ */
+ void executeSlash(SlashCommandInteractionEvent event);
+
+ /**
+ * Führt die Logik des Befehls aus, wenn er als traditioneller Text-Befehl empfangen wird.
+ * Diese Methode ist optional, falls dein Bot nur Slash-Befehle unterstützt.
+ * Implementierungen sollten hier die spezifische Befehlslogik verarbeiten und im Kanal antworten.
+ *
+ * @param event Das {@link MessageReceivedEvent}, das von JDA ausgelöst wurde.
+ * @param args Ein Array von Strings, das die Argumente des Befehls enthält (ohne den Befehlsnamen selbst).
+ */
+ void executeText(MessageReceivedEvent event, String[] args);
+
+ /**
+ * Gibt die {@link CommandData} zurück, die zur Registrierung des Slash-Befehls bei Discord benötigt wird.
+ * Jede Befehlsimplementierung, die ein Slash-Befehl sein soll, muss diese Methode implementieren,
+ * um die Struktur des Befehls (Name, Beschreibung, Optionen) zu definieren.
+ * Wenn ein Befehl kein Slash-Befehl ist, kann diese Methode {@code null} zurückgeben.
+ *
+ * @return Ein {@link CommandData}-Objekt für den Slash-Befehl oder {@code null}, wenn es kein Slash-Befehl ist.
+ */
+ CommandData getSlashCommandData();
+}
\ No newline at end of file
diff --git a/src/main/java/de/ocame/wuerfelbot/core/ConfigLoader.java b/src/main/java/de/ocame/wuerfelbot/core/ConfigLoader.java
new file mode 100644
index 0000000..664f2ed
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/core/ConfigLoader.java
@@ -0,0 +1,66 @@
+package de.ocame.wuerfelbot.core;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class ConfigLoader {
+
+ private final Properties properties;
+
+ public ConfigLoader() {
+ properties = new Properties();
+ try (FileInputStream input = new FileInputStream("shadowrun.cfg")) {
+ properties.load(input);
+ } catch (IOException e) {
+ LoggerUtil.log("info", "ConfigLoader", "Konfigurationsdatei konnte nicht geladen werden: " + e.getMessage());
+ e.printStackTrace();
+ }
+ LoggerUtil.log("info", "ConfigLoader", "Konfigurationsdatei wurde geladen");
+ }
+
+ public String getToken() {
+ return properties.getProperty("api.token");
+ }
+
+ public String getUsername() {
+ return properties.getProperty("ff.username");
+ }
+
+ public String getPassword() {
+ return properties.getProperty("ff.password");
+ }
+
+ public String getFfFavList() {
+ return properties.getProperty("ff.favList");
+ }
+
+ public Long getDebugChannel() {
+ return Long.parseLong(properties.getProperty("debug.Channel"));
+ }
+
+ public boolean getFFActive() {
+ return Boolean.parseBoolean(properties.getProperty("ff.active", "true"));
+ }
+
+ public String getMySQLHost() {
+ return properties.getProperty("mysql.host", "localhost");
+ }
+
+ public String getMySQLPort() {
+ return properties.getProperty("mysql.port", "3306");
+ }
+
+ public String getMySQLUsername() {
+ return properties.getProperty("mysql.username", "");
+ }
+
+ public String getMySQLPassword() {
+ return properties.getProperty("mysql.password", "");
+ }
+
+ public String getMySQLDatabase() {
+ return properties.getProperty("mysql.database", "fuchsbot");
+ }
+
+}
diff --git a/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java b/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java
new file mode 100644
index 0000000..628b39c
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/core/DiscordBot.java
@@ -0,0 +1,99 @@
+package de.ocame.wuerfelbot.core;
+
+
+import de.ocame.wuerfelbot.commands.CommandListener;
+import de.ocame.wuerfelbot.commands.CommandManager;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.JDABuilder;
+import net.dv8tion.jda.api.OnlineStatus;
+import net.dv8tion.jda.api.entities.Activity;
+import net.dv8tion.jda.api.requests.GatewayIntent;
+import net.dv8tion.jda.api.utils.ChunkingFilter;
+import net.dv8tion.jda.api.utils.MemberCachePolicy;
+import net.dv8tion.jda.api.hooks.ListenerAdapter; // JDA ListenerAdapter
+import net.dv8tion.jda.api.exceptions.InvalidTokenException; // Für Token-Fehler
+
+import javax.security.auth.login.LoginException; // Für Login-Fehler
+
+public class DiscordBot {
+
+ private JDA jda;
+ private final String botToken;
+ private final String testGuildId; // Für gilden-spezifische Slash-Befehle
+ private CommandManager commandManager;
+
+ public DiscordBot(String botToken, String testGuildId) {
+ this.botToken = botToken;
+ this.testGuildId = testGuildId; // Kann null sein, wenn nicht verwendet
+ }
+
+ /**
+ * Startet den Discord Bot.
+ * Initialisiert JDA, registriert Listener und Befehle.
+ * @throws LoginException Wenn der Bot-Token ungültig ist oder ein Anmeldefehler auftritt.
+ * @throws InterruptedException Wenn der Thread beim Warten auf den Bot unterbrochen wird.
+ */
+ public void start() throws LoginException, InterruptedException, InvalidTokenException {
+ // Konfiguriere JDABuilder mit notwendigen Intents
+ // 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)
+ )
+ // Empfohlen für größere Bots, um Caching zu optimieren
+ .setMemberCachePolicy(MemberCachePolicy.ALL)
+ .setChunkingFilter(ChunkingFilter.ALL)
+ .setStatus(OnlineStatus.ONLINE) // Setze den Online-Status
+ .setActivity(Activity.playing("mit den Würfeln")); // Setze eine Aktivität
+
+ // Baue die JDA-Instanz. Dies blockiert, bis der Bot bereit ist.
+ this.jda = builder.build();
+
+ // Warte, bis JDA vollständig geladen und verbunden ist
+ jda.awaitReady();
+
+ // Initialisiere den CommandManager mit der JDA-Instanz
+ this.commandManager = new CommandManager(jda);
+
+ // Erstelle und registriere den CommandListener
+ // Der Präfix für Text-Befehle ist hier auf "!" gesetzt.
+ CommandListener commandListener = new CommandListener(commandManager, "/");
+ jda.addEventListener(commandListener);
+
+ LoggerUtil.log("info", "DiscordBot", "JDA ist bereit. Bot ist online!");
+
+ // Registriere Slash-Befehle beim Start.
+ // Dies wird nun vom CommandManager übernommen, der eine Referenz auf JDA hat.
+ // Der CommandManager wird seine eigene updateSlashCommands() Methode aufrufen.
+ // commandManager.updateSlashCommands(); // Wird bereits im CommandManager-Konstruktor aufgerufen
+ }
+
+ /**
+ * Fährt den Discord Bot sauber herunter.
+ */
+ public void shutdown() {
+ if (jda != null) {
+ jda.shutdownNow(); // Beendet JDA sofort
+ LoggerUtil.log("info", "DiscordBot", "JDA Instanz wurde heruntergefahren.");
+ }
+ }
+
+ /**
+ * Gibt die JDA-Instanz zurück.
+ * @return Die {@link JDA}-Instanz.
+ */
+ public JDA getJda() {
+ return jda;
+ }
+
+ /**
+ * Gibt den CommandManager zurück.
+ * @return Den {@link CommandManager}.
+ */
+ public CommandManager getCommandManager() {
+ return commandManager;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/ocame/wuerfelbot/core/LoggerUtil.java b/src/main/java/de/ocame/wuerfelbot/core/LoggerUtil.java
new file mode 100644
index 0000000..cdd9301
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/core/LoggerUtil.java
@@ -0,0 +1,39 @@
+package de.ocame.wuerfelbot.core;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LoggerUtil {
+ //private static final Logger logger = LoggerFactory.getLogger(LoggerUtil.class);
+
+ /**
+ * Erstellt einen Logeintrag basierend auf Typ, Modul und Nachricht.
+ *
+ * @param logType Der Typ des Logs: "trace", "debug", "info", "warn", "error".
+ * @param module Der Name des Moduls oder Kontextes.
+ * @param message Die Nachricht, die geloggt werden soll.
+ */
+ public static void log(String logType, String module, String message) {
+ Logger logger = LoggerFactory.getLogger(module);
+ switch (logType.toLowerCase()) {
+ case "trace":
+ logger.trace(message);
+ break;
+ case "debug":
+ logger.debug(message);
+ break;
+ case "info":
+ logger.info(message);
+ break;
+ case "warn":
+ logger.warn(message);
+ break;
+ case "error":
+ logger.error(message);
+ break;
+ default:
+ logger.warn("Unbekannter Log-Typ: {}. Nachricht: {}", logType, message);
+
+ }
+ }
+}
diff --git a/src/main/java/de/ocame/wuerfelbot/core/Main.java b/src/main/java/de/ocame/wuerfelbot/core/Main.java
new file mode 100644
index 0000000..71fbb1a
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/core/Main.java
@@ -0,0 +1,66 @@
+package de.ocame.wuerfelbot.core;
+
+
+//import Serenity.balance;
+import de.ocame.wuerfelbot.core.ConfigLoader;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.JDABuilder;
+import net.dv8tion.jda.api.OnlineStatus;
+import net.dv8tion.jda.api.entities.*;
+import net.dv8tion.jda.api.requests.GatewayIntent;
+
+public class Main {
+
+ public static void main(String[] args) {
+
+
+ ConfigLoader configLoader = new ConfigLoader();
+
+ String token = configLoader.getToken();
+
+ try {
+ // Erstelle eine neue Instanz deines DiscordBots
+ LoggerUtil.log("info", "Main", "Discord Bot wird gestartet...");
+
+ DiscordBot bot = new DiscordBot(token, null);
+ bot.start(); // Starte den Bot
+
+ LoggerUtil.log("info", "Main", "Bot ist online und bereit!" );
+
+
+ // Du könntest hier einen Hook hinzufügen, um den Bot sauber herunterzufahren,
+ // wenn das Programm beendet wird.
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ LoggerUtil.log("info", "Main", "Bot wird heruntergefahren...");
+ bot.shutdown();
+ LoggerUtil.log("info", "Main", "Bot wurde heruntergefahren.");
+ }));
+
+ } catch (Exception e) {
+ LoggerUtil.log("error", "Main", "Ein schwerwiegender Fehler ist beim Starten des Bots aufgetreten: " + e.getMessage());
+ e.printStackTrace();
+ }
+
+/*
+ JDA jda = JDABuilder.createDefault(token)
+ .enableIntents(GatewayIntent.MESSAGE_CONTENT)
+ .setActivity(Activity.playing("mit den Würfeln"))
+ .setStatus(OnlineStatus.ONLINE)
+ //.addEventListeners(new dice())
+ .addEventListeners(new de.ocame.wuerfelbot.Earthdawn.dice())
+ .addEventListeners(new de.ocame.wuerfelbot.Simpleroll.dice())
+ .addEventListeners(new de.ocame.wuerfelbot.Shadowrun.dice())
+ .addEventListeners(new de.ocame.wuerfelbot.Engel.dice())
+ .addEventListeners(new de.ocame.wuerfelbot.Keeproll.dice())
+ .setAutoReconnect(true)
+ .build();
+*/
+
+ // Thread thread = new Thread(new shadowrun(jda));
+ //thread.start();
+
+
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/de/ocame/wuerfelbot/dicebase/DiceResult.java b/src/main/java/de/ocame/wuerfelbot/dicebase/DiceResult.java
new file mode 100644
index 0000000..ba05550
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/dicebase/DiceResult.java
@@ -0,0 +1,41 @@
+package de.ocame.wuerfelbot.dicebase;
+
+import java.util.List;
+
+public class DiceResult {
+ private final List rolls;
+ private final int total;
+ private final String breakdown;
+ private final boolean glitch;
+
+ public DiceResult(List rolls, int total, String breakdown, boolean glitch) {
+ this.rolls = rolls;
+ this.total = total;
+ this.breakdown = breakdown;
+ this.glitch = glitch;
+ }
+
+ public List getRolls() {
+ return rolls;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public String getBreakdown() {
+ return breakdown;
+ }
+
+ public boolean isGlitch() {
+ return glitch;
+ }
+
+ @Override
+ public String toString() {
+ return "Ergebnis: " + total + "\n" +
+ "Würfe: " + rolls + "\n" +
+ "Details: " + breakdown +
+ (glitch ? "\n Patzer erkannt!" : "");
+ }
+}
diff --git a/src/main/java/de/ocame/wuerfelbot/dicebase/DiceSystem.java b/src/main/java/de/ocame/wuerfelbot/dicebase/DiceSystem.java
new file mode 100644
index 0000000..55ba2cb
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/dicebase/DiceSystem.java
@@ -0,0 +1,24 @@
+package de.ocame.wuerfelbot.dicebase;
+
+import de.ocame.wuerfelbot.dicebase.DiceResult;
+
+public interface DiceSystem {
+ /**
+ * Gibt den internen Namen des Systems zurück, z.B. "earthdawn" oder "shadowrun".
+ */
+ String getName();
+
+ /**
+ * Führt einen Wurf mit dem angegebenen Nutzereingabe-String aus.
+ * @param input Der Eingabestring, z.B. "5" für Earthdawn-Stufe 5 oder "4w6+1" für klassische Systeme.
+ * @return Ein DiceResult-Objekt mit allen relevanten Würfelinformationen.
+ */
+ DiceResult roll(String input);
+
+ /**
+ * Gibt eine kurze Beschreibung oder Hilfe zu diesem Würfelsystem zurück.
+ */
+ default String getDescription() {
+ return "Kein Beschreibungstext verfügbar.";
+ }
+}
diff --git a/src/main/java/de/ocame/wuerfelbot/dicebase/dice.java b/src/main/java/de/ocame/wuerfelbot/dicebase/dice.java
new file mode 100644
index 0000000..07b29c6
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/dicebase/dice.java
@@ -0,0 +1,96 @@
+package de.ocame.wuerfelbot.dicebase;
+
+import de.ocame.wuerfelbot.Earthdawn.language;
+import de.ocame.wuerfelbot.Earthdawn.messageInterpreter;
+import de.ocame.wuerfelbot.Earthdawn.step;
+import de.ocame.wuerfelbot.Shadowrun.db_connect;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.ChannelType;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+import java.awt.*;
+import java.util.HashMap;
+import java.util.Map;
+
+public class dice extends ListenerAdapter {
+
+ private final String prefixSr;
+
+ 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<>();
+
+ private final step dieRoll = new step();
+
+
+ public dice() {
+ this.prefixSr = "/ed";
+ //this.prefixIni = "/ini";
+
+ this.db = new db_connect();
+ }
+
+ @Override
+ public void onMessageReceived(MessageReceivedEvent event) {
+ if ((!event.getMessage().getContentRaw().startsWith(this.prefixSr))
+ || (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();
+ author.isBot();
+ if (true) {
+ if (event.getMessage().getContentRaw().startsWith(this.prefixSr))
+ this.roll(event);
+ }
+ }
+
+
+ /**
+ *
+ *
+ * @param event JDA Event
+ */
+ private void roll(MessageReceivedEvent 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() + " ";
+ }
+
+}
diff --git a/src/main/java/de/ocame/wuerfelbot/dicebase/output/OutputContentElement.java b/src/main/java/de/ocame/wuerfelbot/dicebase/output/OutputContentElement.java
new file mode 100644
index 0000000..1e9a26b
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/dicebase/output/OutputContentElement.java
@@ -0,0 +1,39 @@
+package de.ocame.wuerfelbot.dicebase.output;
+
+import java.awt.*;
+
+public class OutputContentElement {
+
+ private final String message;
+ private final String image;
+ private final Color color;
+
+ public OutputContentElement(String message) {
+ this.message = message;
+ this.image = null;
+ this.color = new Color(36, 153, 245);
+ }
+ public OutputContentElement(String message, String image) {
+ this.message = message;
+ this.image = image;
+ this.color = new Color(36, 153, 245);
+ }
+ public OutputContentElement(String message, String image, Color color) {
+ this.message = message;
+ this.image = image;
+ this.color = color;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+}
diff --git a/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java b/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java
new file mode 100644
index 0000000..9afa106
--- /dev/null
+++ b/src/main/java/de/ocame/wuerfelbot/output/DiceOutputFormatter.java
@@ -0,0 +1,53 @@
+package de.ocame.wuerfelbot.output;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+
+import java.awt.*;
+
+
+public class DiceOutputFormatter {
+
+ /**
+ * Formatiert das Ergebnis in einer Standart Discord-Ausgabe.
+ *
+ * @param glitch True = rote Balken sonst Grüner.
+ * @param title Überschrift der Box.
+ * @param description Inhalt der Box z.b. Würfelergebnise.
+ * @return Eine formatierte String-Nachricht für Discord.
+ */
+
+ public EmbedBuilder DCDefaultOutput(String title, String description, boolean glitch) {
+ EmbedBuilder outputBox = new EmbedBuilder();
+
+ if(glitch) { // Patzer
+ outputBox.setColor(Color.red);
+ }
+ else { // Erfolg
+ outputBox.setColor(Color.green);
+ }
+
+ outputBox.setTitle(title);
+ outputBox.setDescription(description);
+
+ return outputBox;
+ }
+
+ /**
+ * Formatiert ein allgemeines Würfelergebnis.
+ * @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.
+ * @param message Die Fehlermeldung.
+ * @return Der formatierte String.
+ */
+ public String formatError(String message) {
+ return String.format("❌ Fehler: %s", message);
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..a614181
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ %d{dd.MM.YY HH:mm:ss.SSS} %boldCyan(%-34.-34thread) %red(%10.10X{jda.shard}) %boldGreen(%-15.-15logger{0}) %highlight(%-6level) %msg%n
+
+
+
+
+
+
+
\ No newline at end of file