Update Shadowrun + clean

This commit is contained in:
Ocame
2025-07-24 21:04:07 +02:00
parent 327cd764a4
commit c21ac91ca2
17 changed files with 382 additions and 1346 deletions

View File

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

View File

@ -1,7 +1,5 @@
package de.ocame.wuerfelbot.Engel;
import net.dv8tion.jda.api.EmbedBuilder;
import java.util.Random;
public class EngelLogic {

View File

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

View File

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

View File

@ -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) {

View File

@ -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 <stufe> [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() + " ";
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 {

View File

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

View File

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

View File

@ -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"

View File

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

View File

@ -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.