4 Commits

Author SHA1 Message Date
c21ac91ca2 Update Shadowrun + clean 2025-07-24 21:04:07 +02:00
327cd764a4 Update Keeprool, Engel + Aufräumen 2025-07-24 08:21:44 +02:00
cb221e6bb2 roll Implemntation 2025-07-17 23:02:05 +02:00
e2b9694e09 grundlegente Umstellung + Earthdawn Implemntation 2025-07-06 16:22:48 +02:00
51 changed files with 2388 additions and 4132 deletions

7
.idea/dictionaries/project.xml generated Normal file
View File

@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="project">
<words>
<w>earthdawn</w>
</words>
</dictionary>
</component>

View File

@ -5,7 +5,7 @@ plugins {
}
application.mainClass = "core.Main"
application.mainClass = "de.ocame.wuerfelbot.core.Main"
group = 'de.ocame'
version = '0.20'

View File

@ -22,4 +22,10 @@ db.host=localhost
db.port=3306
db.database=shadowrun_log
db.name=root
db.pw=
db.pw=
# Token, Benutzername und Passwort
#"NTQ2ODk5MzYwMDEzODc3MjU4.D0u8wA.VfA2vJzundVhCl1-ibDiBaKuA8w"
api.token=NTQ2NzEwODUwOTIxMjk5OTc5.D0sL6A.1fUd5iBr3eo2tbPXofEqyumDm6w

View File

@ -1,480 +0,0 @@
package Earthdawn;
import Shadowrun.db_connect;
import Shadowrun.help;
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;
private final Map<String, String> channelList = new HashMap<>();
private final step dieRoll = new step();
public dice() {
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();
}
@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<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();
author.isBot();
if (true) {
if (event.getMessage().getContentRaw().startsWith(this.prefixSr))
this.srroll(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().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) {
EmbedBuilder outputBox = new EmbedBuilder();
int[] verteilung = new int[6];
int dice1;
int numberOfDice = 1;
int diceart = 6;
StringBuilder result = new StringBuilder();
int hits = 0;
boolean glitches = false;
boolean karma = false;
boolean doppelkarma = false;
boolean weiheJunger = false;
boolean doppelweiheJunger = false;
boolean weiheAnheanger = false;
boolean doppelweiheAnheanger = false;
boolean weiheVorbild = false;
boolean doppelweiheVorbild = false;
int stufe = 0;
int modifier = 1;
try {
dieRoll.reset();
// Alte Erkennung für Karma ect
// Prüfen ob Karma wurf
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"+") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" +")) {
karma = true;
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"++") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" ++")) {
doppelkarma = true;
}
// Prüfen ob weihepunkte wurf
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"j") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" j")) {
weiheJunger = true;
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"jj") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" jj")) {
doppelweiheJunger = true;
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"a") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" a")) {
weiheAnheanger = true;
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"aa") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" aa")) {
doppelweiheAnheanger = true;
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"v") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" v")) {
weiheVorbild = true;
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"vv") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" vv")) {
doppelweiheVorbild = true;
}
// korrikiert Karama eingabe von /ed + zu /ed+
String ContentRaw = event.getMessage().getContentRaw();
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+" +")) {
ContentRaw = ContentRaw.replace(this.prefixSr+" +", this.prefixSr+"+ ").replace(" ", " ");
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+" j")) {
ContentRaw = ContentRaw.replace(this.prefixSr+" j", this.prefixSr+"j ").replace(" ", " ");
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+" a")) {
ContentRaw = ContentRaw.replace(this.prefixSr+" a", this.prefixSr+"a ").replace(" ", " ");
}
if(event.getMessage().getContentRaw().startsWith(this.prefixSr+" v")) {
ContentRaw = ContentRaw.replace(this.prefixSr+" v", this.prefixSr+"v ").replace(" ", " ");
}
String[] MsgParts = ContentRaw.split(" ", 2);
if(MsgParts.length < 2) { // Leerer Befehl
String message = activLang.emptyCommand;
message = message.replace("%command%", this.prefixSr);
event.getChannel().sendMessage(getAsMention(event) + message).queue();
return;
}
String DicePart = MsgParts[1].trim().toLowerCase();
if(MsgParts[1].trim().matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden
if(DicePart.equals("de")) {
activLang = langDe;
channelList.put(event.getChannel().getId(), "de");
event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue();
return;
}
else if(DicePart.equals("en")) {
activLang = langEn;
channelList.put(event.getChannel().getId(), "en");
event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue();
return;
}
for (int i = 0; i < DicePart.length(); i++) {
if (DicePart.charAt(i) == 'k') {
dieRoll.addKarma(1);
}
else if (DicePart.charAt(i) == 'j') {
dieRoll.addWeiheA(1);
}
else if (DicePart.charAt(i) == 'a') {
dieRoll.addWeiheJ(1);
}
else if (DicePart.charAt(i) == 'v') {
dieRoll.addWeiheV(1);
}
}
DicePart = DicePart.replace("k", "");
DicePart = DicePart.replace("j", "");
DicePart = DicePart.replace("a", "");
DicePart = DicePart.replace("v", "");
String[] iniParts = DicePart.split("[\\+\\-]", 2);
messageInterpreter mI = new messageInterpreter(event, activLang);
rollStufe(Integer.parseInt(iniParts[0].replaceAll("[^0-9]", "")));
if(iniParts.length > 1) { // Nachricht hat kein + Zeichen
rollStufe(Integer.parseInt(iniParts[0].replaceAll("[^0-9]", "")));
if(DicePart.matches("\\-")) // Prüft auf Negativen Modifizier wenn Ja
modifier = -1;
dieRoll.addModifier(Integer.parseInt(iniParts[1].trim())*modifier);
}
}
else {
try {
rollStufe(Integer.parseInt(DicePart));
}
catch (NumberFormatException e) {
String message = activLang.error;
message = message.replace("%command%", MsgParts[1].trim());
event.getChannel().sendMessage(getAsMention(event) + message).queue();
return;
}
}
if(karma)
dieRoll.addKarma(1);
if(doppelkarma)
dieRoll.addKarma(1);
if(weiheAnheanger)
dieRoll.addWeiheA(1);
if(doppelweiheAnheanger)
dieRoll.addWeiheA(1);
if(weiheJunger)
dieRoll.addWeiheJ(1);
if(doppelweiheJunger)
dieRoll.addWeiheJ(1);
if(weiheVorbild)
dieRoll.addWeiheV(1);
if(doppelweiheVorbild)
dieRoll.addWeiheV(1);
dieRoll.roll();
if(dieRoll.isGlitches()) { // Patzer
outputBox.setColor(Color.red);
}
else { // Erfolg
outputBox.setColor(Color.green);
}
String message = activLang.resultText;
message = "%rolls%: %hits%";
message = message.replace("%rolls%", dieRoll.getDiceStructur()).replace("%hits%", String.valueOf(dieRoll.getResultInt()));
outputBox.setTitle(getEffectiveName(event) + message);
outputBox.setDescription("(" + dieRoll.getResultStructur() + ")");
event.getChannel().sendMessageEmbeds(outputBox.build()).queue();
}
catch (NumberFormatException e) {
event.getChannel().sendMessage("Nope").queue();
}
catch (Exception e) {
System.out.println("problem: " + e.getMessage());
}
}
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 rollStufe(int stufe) {
switch (stufe) {
case 1:
dieRoll.setW4(1).setModifier(-2);
break;
case 2:
dieRoll.setW4(1).setModifier(-1);
break;
case 3:
dieRoll.setW4(1);
break;
case 4:
dieRoll.setW6(1);
break;
case 5:
dieRoll.setW8(1);
break;
case 6:
dieRoll.setW10(1);
break;
case 7:
dieRoll.setW12(1);
break;
case 8:
dieRoll.setW6(2);
break;
case 9:
dieRoll.setW8(1).setW6(1);
break;
case 10:
dieRoll.setW8(2);
break;
case 11:
dieRoll.setW10(1).setW8(1);
break;
case 12:
dieRoll.setW10(2);
case 13:
dieRoll.setW12(1).setW10(1);
break;
case 14:
dieRoll.setW12(2);
break;
case 15:
dieRoll.setW12(1).setW6(2);
break;
case 16:
dieRoll.setW12(1).setW8(1).setW6(1);
break;
case 17:
dieRoll.setW12(1).setW8(2);
break;
case 18:
dieRoll.setW12(1).setW10(1).setW8(1);
break;
default:
int w20 = 0;
w20 = (stufe-8)/11;
switch ((stufe-8)%11) {
case 0:
dieRoll.setW20(w20).setW6(2);
break;
case 1:
dieRoll.setW20(w20).setW8(1).setW6(1);
break;
case 2:
dieRoll.setW20(w20).setW8(2);
break;
case 3:
dieRoll.setW20(w20).setW10(1).setW8(1);
break;
case 4:
dieRoll.setW20(w20).setW10(2);
break;
case 5:
dieRoll.setW20(w20).setW12(1).setW10(1);
break;
case 6:
dieRoll.setW20(w20).setW12(2);
break;
case 7:
dieRoll.setW20(w20).setW12(1).setW6(2);
break;
case 8:
dieRoll.setW20(w20).setW12(1).setW8(1).setW6(1);
break;
case 9:
dieRoll.setW20(w20).setW12(1).setW8(2);
break;
case 10:
dieRoll.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";
*/
}
}

View File

@ -1,89 +0,0 @@
package Earthdawn;
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

@ -1,117 +0,0 @@
package Earthdawn;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import java.util.Random;
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;
boolean glitches = true;
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());
StringBuilder resultString = new StringBuilder();
Integer PartValue = 0;
int dice1;
if(sc.hasNextInt()) { // ist eine Zahl
typ = 1;
intResult = Integer.parseInt(Input.trim());
}
else {
String[] MalusParts= Input.trim().toLowerCase().replace(" ", "").split("\\-");
for (String MalusPart : MalusParts) {
String[] Parts = MalusPart.split("\\+");
for (String Part : Parts ) {
PartValue = 0;
sc = new Scanner(Part);
if(sc.hasNextInt()) {
PartValue += Integer.parseInt(Part);
}
else {
if (Part.matches("([0-9]*)[dw]([0-9].*)")) { // format besteh aus (Zahlen)d(Zahlen) oder (Zahlen)w(Zahlen)
String[] diceInterpreter = Part.split("[wd]");
try {
diceart = Integer.parseInt(diceInterpreter[1]);
numberOfDice = Integer.parseInt(diceInterpreter[0]);
for(int i = 0; i < numberOfDice; i++) {
dice1 = new Random().nextInt(diceart);
resultString.append(dice1+1);
resultString.append(" ");
PartValue += dice1+1;
if(dice1 > 0)
glitches = false;
}
} catch (NumberFormatException e) {
String message = activLang.error;
message = message.replace("%command%", Input.trim().toLowerCase());
typ = -1;
throw new IllegalArgumentException( message );
}
}
else {
String message = activLang.error;
message = message.replace("%command%", Input.trim().toLowerCase());
typ = -1;
throw new IllegalArgumentException( message );
}
}
}
if(intResult == 0)
intResult = PartValue;
else
intResult -= PartValue;
}
}
}
}

View File

@ -1,292 +0,0 @@
package Earthdawn;
import java.util.Random;
public class step {
private int w4;
private int w6;
private int w8;
private int w10;
private int w12;
private int w20;
private int karma;
private int weiheA;
private int weiheJ;
private int weiheV;
private boolean glitches = true;
private String diceStructur = "";
private String diceResult = "";
private int resultInt = 0;
private int modifier = 0;
StringBuilder resultStructur = new StringBuilder();
public int getW4() {
return w4;
}
public step setW4(int w4) {
this.w4 = w4;
return this;
}
public int getW6() {
return w6;
}
public step setW6(int w6) {
this.w6 = w6;
return this;
}
public int getW8() {
return w8;
}
public step setW8(int w8) {
this.w8 = w8;
return this;
}
public int getW10() {
return w10;
}
public step setW10(int w10) {
this.w10 = w10;
return this;
}
public int getW12() {
return w12;
}
public step setW12(int w12) {
this.w12 = w12;
return this;
}
public int getW20() {
return w20;
}
public step setW20(int w20) {
this.w20 = w20;
return this;
}
public void addW4(int w4) {
this.w4 += w4;
}
public void addW6(int w6) {
this.w6 += w6;
}
public void addW8(int w8) {
this.w8 += w8;
}
public void addW10(int w10) {
this.w10 += w10;
}
public void addW12(int w12) {
this.w12 += w12;
}
public void addW20(int w20) {
this.w20 += w20;
}
public int getModifier() {
return modifier;
}
public int getKarma() {
return karma;
}
public step setKarma(int karma) {
this.karma = karma;
return this;
}
public step addKarma(int karma) {
this.karma += karma;
return this;
}
public step addWeiheJ(int weiheJ) {
this.weiheJ += weiheJ;
return this;
}
public step addWeiheA(int weiheA) {
this.weiheA += weiheA;
return this;
}
public step addWeiheV(int weiheV) {
this.weiheV += weiheV;
return this;
}
public step setModifier(int modifier) {
this.modifier = modifier;
return this;
}
public step addModifier(int modifier) {
this.modifier += modifier;
return this;
}
public boolean isGlitches() {
return glitches;
}
public String getDiceStructur() {
return diceStructur;
}
public String getDiceResult() {
return diceResult;
}
public int getResultInt() {
return resultInt;
}
public String getResultStructur() {
return resultStructur.toString();
}
public step reset() {
w4 = 0;
w6 = 0;
w8 = 0;
w10 = 0;
w12 = 0;
w20 = 0;
karma = 0;
weiheJ = 0;
weiheA = 0;
weiheV = 0;
modifier = 0;
glitches = true;
diceStructur = "";
diceResult = "";
resultInt = 0;
resultStructur = new StringBuilder();
return this;
}
public void roll() {
StringBuilder resultConstruction = new StringBuilder();
if(w4 > 0) {
rollDice(w4, 4);
if(resultConstruction.length() > 0)
resultConstruction.append("+");
resultConstruction.append(w4).append("w4");
}
if(w6 > 0) {
rollDice(w6, 6);
if(resultConstruction.length() > 0)
resultConstruction.append("+");
resultConstruction.append(w6).append("w6");
}
if(w8 > 0) {
rollDice(w8, 8);
if(resultConstruction.length() > 0)
resultConstruction.append("+");
resultConstruction.append(w8).append("w8");
}
if(w10 > 0) {
rollDice(w10, 10);
if(resultConstruction.length() > 0)
resultConstruction.append("+");
resultConstruction.append(w10).append("w10");
}
if(w12 > 0) {
rollDice(w12, 12);
if(resultConstruction.length() > 0)
resultConstruction.append("+");
resultConstruction.append(w12).append("w12");
}
if(w20 > 0) {
rollDice(w20, 20);
if(resultConstruction.length() > 0)
resultConstruction.append(" + ");
resultConstruction.append(w20).append("w20");
}
if(karma > 0) {
rollDice(karma, 6);
if(resultConstruction.length() > 0)
resultConstruction.append(" + ");
resultConstruction.append(karma).append("w6");
}
if(weiheJ > 0) {
rollDice(weiheJ, 4);
if(resultConstruction.length() > 0)
resultConstruction.append(" + ");
resultConstruction.append(weiheJ).append("w4");
}
if(weiheA > 0) {
rollDice(weiheA, 6);
if(resultConstruction.length() > 0)
resultConstruction.append(" + ");
resultConstruction.append(weiheA).append("w6");
}
if(weiheV > 0) {
rollDice(weiheV, 8);
if(resultConstruction.length() > 0)
resultConstruction.append(" + ");
resultConstruction.append(weiheV).append("w8");
}
if(modifier != 0) {
resultInt += modifier;
if(modifier > 0)
resultConstruction.append(" + ");
resultConstruction.append(modifier);
}
diceStructur = resultConstruction.toString();
if(resultInt <= 0)
resultInt = 1;
}
private void rollDice(int numberOfDice, int diceart) {
int dice;
for(int i = 0; i < numberOfDice; i++) {
dice = new 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;
}
}
}

View File

@ -1,140 +0,0 @@
package Engel;
import Shadowrun.db_connect;
import Simpleroll.help;
import 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.HashMap;
import java.util.Map;
import java.util.Random;
public class dice extends ListenerAdapter {
private final String prefixEngel;
private final String prefixEngelShort;
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 arcanaList activArcanaList;
private final db_connect db;
private final Map<String, String> channelList = new HashMap<>();
private final Map<String, arcanaList> arcanaList = new HashMap<>();
public dice() {
this.prefixEngel = "/engel";
this.prefixEngelShort = "/e";
this.db = new db_connect();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if ((!event.getMessage().getContentRaw().startsWith(this.prefixEngel)
&& !event.getMessage().getContentRaw().startsWith(this.prefixEngelShort))
|| (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;
}
if(!arcanaList.containsKey(event.getChannel().getId())) {
arcanaList.put(event.getChannel().getId(), new arcanaList());
}
activArcanaList = arcanaList.get(event.getChannel().getId());
User author = event.getAuthor();
if (event.getMessage().getContentRaw().startsWith(this.prefixEngel) || event.getMessage().getContentRaw().startsWith(this.prefixEngelShort + " "))
this.draw(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() + " ";
}
/**
* draw
*
* @param event JDA Event
*/
private void draw(MessageReceivedEvent event) {
EmbedBuilder outputBox = new EmbedBuilder();
StringBuilder result = new StringBuilder();
try {
String ContentRaw = event.getMessage().getContentRaw();
String NameAdd = "";
activArcanaList.draw();
if(activArcanaList.isLoF()) {
outputBox.setColor(Color.red);
}
else if(!activArcanaList.isSide()) {
outputBox.setColor(Color.green);
}
else {
outputBox.setColor(Color.orange);
NameAdd = " Umgekehrt ";
}
outputBox.setTitle(getEffectiveName(event) + "du ziehst " + NameAdd + activArcanaList.getName());
result.append("**").append(activArcanaList.getMeaning()).append("**");
result.append("\n").append(activArcanaList.getExplain());
outputBox.setDescription(result.toString().trim());
outputBox.setImage(activArcanaList.getImage());
event.getChannel().sendMessageEmbeds(outputBox.build()).queue();
}
catch (NumberFormatException e) {
event.getChannel().sendMessage("Nope").queue();
}
catch (Exception e) {
System.out.println("problem: " + e.getMessage());
}
}
}

View File

@ -1,89 +0,0 @@
package Engel;
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

@ -1,319 +0,0 @@
package Keeproll;
import Shadowrun.db_connect;
import Simpleroll.help;
import 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 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.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

@ -1,105 +0,0 @@
package Keeproll;
import java.util.Random;
public class result {
private StringBuilder text;
private int value;
private final int diceart;
private Boolean reroll9;
private Boolean reroll1;
private Boolean maxReroll;
private Boolean noreroll;
public result() {
diceart = 10;
text = new StringBuilder();
value = 0;
reroll9 = false;
reroll1 = false;
maxReroll = false;
noreroll = false;
}
public String getText() {
return text.toString();
}
public void setText(String text) {
this.text = new StringBuilder();
this.text.append(text);
}
public void setMarket() {
String tmp = this.text.toString();
this.text = new StringBuilder();
this.text.append("**").append(tmp).append("**");
}
public int getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public result setReroll9(Boolean reroll9) {
this.reroll9 = reroll9;
return this;
}
public result setReroll1(Boolean reroll1) {
this.reroll1 = reroll1;
return this;
}
public result setMaxReroll(Boolean maxReroll) {
this.maxReroll = maxReroll;
return this;
}
public result setNoreroll(Boolean noreroll) {
this.noreroll = noreroll;
return this;
}
public result roll() {
int dice;
int rolls = 0;
Boolean reroll = false;
do{
reroll = false;
dice = new Random().nextInt(diceart);
dice++;
if(text.length() > 0) {
text.append("+");
}
if(reroll1 && dice == 1 && rolls <= 0) {
text.append("~~ ").append(dice).append(" ~~ ");
}
else {
text.append(dice);
}
value += dice;
if(!noreroll) {
if (dice == 10) {
reroll = rolls <= 0 || !maxReroll; // wenn maxRolls an und schon einmal gerollt wurde kein reroll
++rolls;
} else if (reroll9 && dice == 9) {
reroll = rolls <= 0 || !maxReroll;
} else if (reroll1 && dice == 1 && rolls <= 0) {
reroll = true;
value--;
}
}
} while(reroll);
return this;
}
}

View File

@ -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<String, Integer> 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<String> 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<String, Integer> 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<String, Integer> 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<Integer, String> 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<String> 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 <K> erste Typ
* @param <V> zweiter typ
* @return <K,V>|null
*/
private <K, V> K getKey(Map<K, V> map, V value) {
for (Map.Entry<K, V> entry : map.entrySet()) {
if (entry.getValue().equals(value)) {
return entry.getKey();
}
}
return null;
}
}

View File

@ -1,635 +0,0 @@
package 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.*;
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,30 +0,0 @@
package Shadowrun;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
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 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 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

@ -1,174 +0,0 @@
package Simpleroll;
import 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;
import java.util.Random;
public class dice extends ListenerAdapter {
private final String prefixR;
private final String prefixRoll;
private final String prefixHelp;
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.prefixR = "/roll";
this.prefixRoll = "/r ";
this.prefixHelp = "/help";
this.db = new db_connect();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if ((!event.getMessage().getContentRaw().startsWith(this.prefixR)
&& !event.getMessage().getContentRaw().startsWith(this.prefixRoll) && !event.getMessage().getContentRaw().startsWith(this.prefixHelp))
|| (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 "en":
activLang = langEn;
break;
case "de":
default:
activLang = langDe;
}
User author = event.getAuthor();
if (event.getMessage().getContentRaw().startsWith(this.prefixR) || event.getMessage().getContentRaw().startsWith(this.prefixRoll))
this.roll(event);
if (event.getMessage().getContentRaw().startsWith(this.prefixHelp))
this.help(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() + " ";
}
/**
* rolltest
*
* @param event JDA Event
*/
private void roll(MessageReceivedEvent event) {
EmbedBuilder outputBox = new EmbedBuilder();
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.prefixRoll);
event.getChannel().sendMessage(getAsMention(event) + message).queue();
return;
}
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;
}
messageInterpreter mI = new messageInterpreter(activLang, MsgParts[1]);
outputBox.setColor(Color.green);
outputBox.setTitle(getEffectiveName(event) + " " + mI.getHeaderOutput() + ": " + mI.getResult());
if(mI.isComplex())
outputBox.setDescription(mI.getResolveOutput() + "\n" + mI.getBodyOutput());
else
outputBox.setDescription(mI.getBodyOutput());
event.getChannel().sendMessageEmbeds(outputBox.build()).queue();
//System.runFinalization();
System.gc();
}
catch (NumberFormatException e) {
event.getChannel().sendMessage("Nope").queue();
}
catch (Exception e) {
System.out.println("problem: " + e.getMessage());
}
}
private void help(MessageReceivedEvent event) {
EmbedBuilder outputBox = new EmbedBuilder();
StringBuilder result = new StringBuilder();
outputBox.setTitle("Hallo ich exestieren aktuell in der Version: 0.10\n");
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("**/l5r** bzw **/keep** für Legend of the 5 Rings\n");
outputBox.setDescription(result);
event.getChannel().sendMessageEmbeds(outputBox.build()).queue();
}
//7d4+19+1d7
}

View File

@ -1,238 +0,0 @@
package Simpleroll;
import Shadowrun.db_connect;
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.HashMap;
import java.util.Map;
import java.util.Random;
public class diceOld extends ListenerAdapter {
private final String prefixR;
private final String prefixRoll;
private final String prefixHelp;
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 diceOld() {
this.prefixR = "/roll";
this.prefixRoll = "/r ";
this.prefixHelp = "/help";
this.db = new db_connect();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if ((!event.getMessage().getContentRaw().startsWith(this.prefixR)
&& !event.getMessage().getContentRaw().startsWith(this.prefixRoll) && !event.getMessage().getContentRaw().startsWith(this.prefixHelp))
|| (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.prefixR) || event.getMessage().getContentRaw().startsWith(this.prefixRoll))
this.roll(event);
if (event.getMessage().getContentRaw().startsWith(this.prefixHelp))
this.help(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() + " ";
}
/**
* rolltest
*
* @param event JDA Event
*/
private void roll(MessageReceivedEvent event) {
EmbedBuilder outputBox = new EmbedBuilder();
int[] verteilung = new int[6];
int dice1;
int numberOfDice = 1;
int diceart = 6;
StringBuilder result = new StringBuilder();
int hits = 0;
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.prefixRoll);
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();
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]);
verteilung = new int[diceart];
}
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;
}
}
if(numberOfDice <= 0) {
String message = activLang.noNegativ;
event.getChannel().sendMessage(getAsMention(event) + message).queue();
return;
}
for(int i = 0; i < numberOfDice; i++) {
dice1 = new Random().nextInt(diceart);
verteilung[dice1]++;
result.append(dice1+1);
result.append(" ");
}
outputBox.setColor(Color.green);
String addition = "";
String message = activLang.basisresultText;
//%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%";
message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart));
outputBox.setTitle(getEffectiveName(event) + message);
outputBox.setDescription("(" + result.toString().trim() + ")");
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);
}
event.getChannel().sendMessageEmbeds(outputBox.build()).queue();
/*event.getChannel().sendMessage(outputBox.build()).queue(message1 -> {
message1.addReaction("sr:517528156014510111").queue();
message1.addReaction("test:517545127376322596").queue();
});*/
/*
if(event.getChannelType() == ChannelType.PRIVATE) {
db.insertDice(event.getAuthor().getName(), event.getAuthor().getId(), event.getMessage().getContentRaw(), result.toString().trim(), event.getChannel().getId());
}
else {
db.insertDice(event.getMember().getEffectiveName(), event.getMember().getUser().getId(), event.getMessage().getContentRaw(), result.toString().trim(), event.getChannel().getId());
}*/
}
catch (NumberFormatException e) {
event.getChannel().sendMessage("Nope").queue();
}
catch (Exception e) {
System.out.println("problem: " + e.getMessage());
}
}
private void help(MessageReceivedEvent event) {
EmbedBuilder outputBox = new EmbedBuilder();
StringBuilder result = new StringBuilder();
outputBox.setTitle("Hallo ich exestieren aktuell in der Version: 0.8\n");
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("**/l5r** bzw **/keep** für Legend of the 5 Rings\n");
outputBox.setDescription(result);
event.getChannel().sendMessage(outputBox.build().toString()).queue();
}
}

View File

@ -1,28 +0,0 @@
package 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 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

@ -1,227 +0,0 @@
package Simpleroll;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class messageInterpreter {
private Integer intResult = 0;
private final language activLang;
private final StringBuilder bodyOutput;
private final StringBuilder resolveOutput;
private final StringBuilder headerOutput;
private boolean isComplex;
public Integer getIntResult() {
return intResult;
}
/**
*
* @param activLang Aktive Sprache
*/
public messageInterpreter(language activLang) {
this.activLang = activLang;
bodyOutput = new StringBuilder();
resolveOutput = new StringBuilder();
headerOutput = new StringBuilder();
isComplex = false;
}
public messageInterpreter(language activLang, String Input) {
this(activLang);
inputInterpreter(Input);
}
public void inputInterpreter(String Input) {
if(Input.trim().toLowerCase().replace(" ", "").matches("\\d+")) {
Input = Input.trim().toLowerCase().replace(" ", "") + "w6";
}
subpart result = new subpart();
result = subPartAnalyse(Input);
resolveOutput.append(result.getResolveOutput());
bodyOutput.append(result.getBodyOutput());
headerOutput.append(result.getHeaderOutput());
intResult = result.getResolve();
}
private subpart subPartAnalyse(String part) {
subpart result = new subpart();
part = part.trim().toLowerCase().replace(" ", "");
boolean first = true;
/*
if(part.contains("max(")) {
/*
1d6 + max(5d5+10,2d4+2) + 15
* /
Pattern pattern = Pattern.compile("(?:.*)max\\((.*?)\\).*");
Matcher matcher = pattern.matcher(part);
if(matcher.find()) {
//String pre = part.substring(0, (matcher.start() - 3));
//String operation = part.substring((matcher.start() + 1), (matcher.end()-1));
//String after = part.substring(matcher.end());
StringBuilder newBody = new StringBuilder("max(");
StringBuilder newHeader = new StringBuilder("max(");
String[] subParts = matcher.group(1).split(",");
subpart[] tempSubparts = new subpart[subParts.length];
int i = 0;
int highest = 0;
for(String subPart : subParts) { // Vergleichen welcher wert der höhste ist
tempSubparts[i] = subPartAnalyse(subPart);
if(i != highest && tempSubparts[i].getResolve() > tempSubparts[highest].getResolve()) {
highest = i;
}
if(i > 0) {
newBody.append("), ");
newHeader.append(", ");
}
newBody.append("(");
newBody.append(tempSubparts[i].getBodyOutput());
newHeader.append(tempSubparts[i].getHeaderOutput());
i++;
}
newBody.append(")");
newHeader.append(")");
int partmarker = new Random().nextInt(1500);
//subPartAnalyse(part.substring(0, (matcher.start() - 3)) + tempSubparts[highest].getResolve() + part.substring(matcher.end()));
subpart contAnalyser = subPartAnalyse(part.substring(0, (matcher.start(1) - 4)) + " ###b" + tempSubparts[highest].getResolve() + "##" + partmarker + "e### " + part.substring(matcher.end(1)+1));
tempSubparts[highest].getResolve();
result.appendBodyOutput(contAnalyser.getBodyOutput().replaceAll("###b" + tempSubparts[highest].getResolve() + "##" + partmarker + "e###", newBody.toString()));
result.appendResolveOutput(contAnalyser.getResolveOutput().replaceAll("###b" + tempSubparts[highest].getResolve() + "##" + partmarker + "e###", "max(" + contAnalyser.getResolve().toString() + ")"));
result.appendHeaderOutput(contAnalyser.getHeaderOutput().replaceAll("###b" + tempSubparts[highest].getResolve() + "##" + partmarker + "e###", newHeader.toString()));
result.addResolve(contAnalyser.getResolve());
}
//part.matches("")
return result;
}
if(part.contains("min(")) {
}*/
if(part.contains("+")) {
String[] subParts = part.trim().split("\\+");
subpart tempSubpart;
for(String subPart : subParts) {
tempSubpart = subPartAnalyse(subPart);
if(!first) {
result.appendBodyOutput(" + ");
result.appendResolveOutput(" + ");
result.appendHeaderOutput(" + ");
}
first = false;
result.appendBodyOutput(tempSubpart.getBodyOutput());
result.appendResolveOutput(tempSubpart.getResolveOutput());
result.appendHeaderOutput(tempSubpart.getHeaderOutput());
result.addResolve(tempSubpart.getResolve());
}
isComplex = true;
return result;
}
if(part.contains("-")) {
String[] subParts = part.trim().split("\\-");
subpart tempSubpart;
for(String subPart : subParts) {
tempSubpart = subPartAnalyse(subPart);
if(!first) {
result.appendBodyOutput(" - ");
result.appendResolveOutput(" - ");
result.appendHeaderOutput(" - ");
result.addResolve(tempSubpart.getResolve()*-1);
}
else
result.addResolve(tempSubpart.getResolve());
first = false;
result.appendBodyOutput(tempSubpart.getBodyOutput());
result.appendResolveOutput(tempSubpart.getResolveOutput());
result.appendHeaderOutput(tempSubpart.getHeaderOutput());
}
isComplex = true;
return result;
}
if(part.matches("([0-9]*)[dw]([0-9]*)")) {
String[] diceInterpreter = part.split("[wd]");
try {
int diceart = Integer.parseInt(diceInterpreter[1]);
int numberOfDice = 1;
if(!diceInterpreter[0].isEmpty())
numberOfDice = Integer.parseInt(diceInterpreter[0]);
result = roll(diceart, numberOfDice);
} catch (NumberFormatException e) {
String message = activLang.error;
message = message.replace("%command%", part.trim().toLowerCase());
throw new IllegalArgumentException( message );
}
}
else if(part.matches("\\d+")) {
result.addResolve(Integer.parseInt(part));
result.appendBodyOutput(part);
result.appendHeaderOutput(part);
result.appendResolveOutput(part);
}
else if(part.matches("###b\\d+##\\d+e###")) {
Pattern pattern = Pattern.compile("###b(\\d+)##\\d+e###");
Matcher matcher = pattern.matcher(part);
matcher.find();
result.addResolve(Integer.parseInt(matcher.group(1)));
result.appendBodyOutput(part);
result.appendHeaderOutput(part);
result.appendResolveOutput(part);
}
return result;
}
subpart roll(Integer diceart, Integer numberOfDice) {
int dice = 0;
subpart result = new subpart();
result.appendHeaderOutput(numberOfDice.toString() + "w" + diceart.toString());
result.appendBodyOutput("(");
for(int i = 0; i < numberOfDice; i++) {
dice = new Random().nextInt(diceart);
if(i > 0) {
result.appendBodyOutput(", ");
}
result.appendBodyOutput(dice+1);
result.addResolve(dice+1);
}
result.appendBodyOutput(")");
result.appendResolveOutput("(" + result.getResolve() + ")");
return result;
}
public String getBodyOutput() {
return bodyOutput.toString();
}
public String getResolveOutput() {
return resolveOutput.toString();
}
public String getHeaderOutput() {
return headerOutput.toString();
}
public Integer getResult() {
return intResult;
}
public boolean isComplex() {
return isComplex;
}
}

View File

@ -1,69 +0,0 @@
package Simpleroll;
public class subpart {
private StringBuilder bodyOutput;
private StringBuilder resolveOutput;
private StringBuilder headerOutput;
private Integer resolve;
public subpart() {
bodyOutput = new StringBuilder();
resolveOutput = new StringBuilder();
headerOutput = new StringBuilder();
resolve = 0;
}
public String getBodyOutput() {
return bodyOutput.toString();
}
public void appendBodyOutput(String bodyOutput) {
this.bodyOutput.append(bodyOutput);
}
public void appendBodyOutput(Integer bodyOutput) {
this.bodyOutput.append(bodyOutput);
}
public String getResolveOutput() {
return resolveOutput.toString();
}
public void appendResolveOutput(String resolveOutput) {
this.resolveOutput.append(resolveOutput);
}
public String getHeaderOutput() {
return headerOutput.toString();
}
public void appendHeaderOutput(String headerOutput) {
this.headerOutput.append(headerOutput);
}
public Integer getResolve() {
return resolve;
}
public void setResolve(Integer resolve) {
this.resolve = resolve;
}
public void setBodyOutput(String bodyOutput) {
this.bodyOutput = new StringBuilder(bodyOutput);
}
public void setResolveOutput(String resolveOutput) {
this.resolveOutput = new StringBuilder(resolveOutput);
}
public void setHeaderOutput(String headerOutput) {
this.headerOutput = new StringBuilder(headerOutput);
}
public void addResolve(Integer i) {
this.resolve += i;
}
}

View File

@ -1,302 +0,0 @@
package Vampire;
import Shadowrun.db_connect;
import Simpleroll.help;
import 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 String prefixVeryShort;
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.prefixlong = "/vampire";
this.prefixShort = "/v";
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.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))
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();
StringBuilder resultDice = new StringBuilder();
StringBuilder resultHungerDice = new StringBuilder();
String msgText = "";
String rollState = "";
int numberOfDice, numberOfHungerDice, successes, difficult, dice1;
numberOfDice = numberOfHungerDice = successes = difficult = 0;
int[] verteilungGesammt = new int[11];
int[] verteilungHunger = new int[11];
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.toLowerCase().matches(".*([0-9]+) +([0-9]+) +([0-9]+).*")) { // X Y Z Aufbau in der Anfrage
Pattern pattern = Pattern.compile("([0-9]+) +([0-9]+) +([0-9]+)");
Matcher matcher = pattern.matcher(msgText.toLowerCase());
matcher.find();
MatchResult elements = matcher.toMatchResult();
numberOfDice = Integer.parseInt(elements.group(1));
numberOfHungerDice = Integer.parseInt(elements.group(2));
difficult = Integer.parseInt(elements.group(3));
}
else if(msgText.toLowerCase().matches(".*([0-9]+) +([0-9]+).*")) { // XkY Aufbau in der Anfrage
Pattern pattern = Pattern.compile("([0-9]+) +([0-9]+)");
Matcher matcher = pattern.matcher(msgText.toLowerCase());
matcher.find();
MatchResult elements = matcher.toMatchResult();
numberOfDice = Integer.parseInt(elements.group(1));
numberOfHungerDice = 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 <= 0) {
String message = activLang.noNegativ;
event.getChannel().sendMessage(getAsMention(event) + message).queue();
return;
}
if(numberOfDice < numberOfHungerDice) {
numberOfHungerDice = numberOfDice;
}
for(int i = 0; i < numberOfDice-numberOfHungerDice; i++) {
dice1 = new Random().nextInt(10);
dice1++;
if(dice1 >= 6) {
successes++;
}
verteilungGesammt[dice1]++;
if(resultDice.length() > 0)
resultDice.append(" ");
if((dice1 >= 6))
resultDice.append("**").append(dice1).append("**");
else
resultDice.append(dice1);
}
for(int i = 0; i < numberOfHungerDice; i++) {
dice1 = new Random().nextInt(10);
dice1++;
if(dice1 >= 6) {
successes++;
}
verteilungGesammt[dice1]++;
verteilungHunger[dice1]++;
if(resultHungerDice.length() > 0)
resultHungerDice.append(" ");
if((dice1 >= 6))
resultHungerDice.append("**").append(dice1).append("**");
else
resultHungerDice.append(dice1);
}
if(verteilungGesammt[10] > 2) {
successes += 2;
}
if((difficult > 0 && successes > difficult) || (difficult == 0 && successes > 0)) { // erfolg
if(verteilungGesammt[10] > 2) {
if(verteilungHunger[10] > 0) {
rollState = "Krit";
outputBox.setColor(Color.green);
}
else {
rollState = "Schmutziger Triumphe";
outputBox.setColor(Color.red);
}
}
else {
rollState = "Erfolg";
outputBox.setColor(Color.green);
}
}
else if(difficult > 0 && successes > 0) { // Fehlschlag
if(verteilungHunger[1] > 0) {
rollState = "Bestialischer Fehlschlag";
outputBox.setColor(Color.red);
}
else {
rollState = "Fehlschlag";
outputBox.setColor(Color.darkGray);
}
}
else if(successes == 0) { // Totaler Fehlschlag
if(verteilungHunger[1] > 0) {
rollState = "Bestialischer Fehlschlag";
outputBox.setColor(Color.red);
}
else {
rollState = "Totaler Fehlschlag";
outputBox.setColor(Color.darkGray);
}
}
// Ausgabe beginn
String addition = "";
if(difficult > 0) {
addition += " Schwierigkeit " + difficult;
}
String title = getEffectiveName(event) + "Pool " + numberOfDice;
if(numberOfHungerDice > 0) {
title += " Hunger " + numberOfHungerDice;
}
if(difficult > 0) {
title += " Schwierigkeit " + difficult;
}
outputBox.setTitle(title);
/*
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().sendMessage(outputBox.build().toString()).queue();
}
catch (NumberFormatException e) {
event.getChannel().sendMessage("Nope").queue();
}
catch (Exception e) {
System.out.println("problem: " + e.getMessage());
}
}
}

View File

@ -1,4 +0,0 @@
package core;
public class Controller {
}

View File

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

View File

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

View File

@ -1,8 +0,0 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<GridPane fx:controller="core.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

View File

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

View File

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

View File

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

View File

@ -0,0 +1,139 @@
package de.ocame.wuerfelbot.Engel;
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.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import java.awt.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EngelCommand implements ICommand {
private final DiceOutputFormatter outputFormatter;
public EngelCommand() {
this.outputFormatter = new DiceOutputFormatter();
}
@Override
public String getName() {
return "engel";
}
@Override
public String getDescription() {
return "Zieht eine Karte aus dem Engel-Taro-Deck und Zeigt die Bedeutung.";
}
@Override
public void executeSlash(SlashCommandInteractionEvent event) {
try {
EngelLogic result = new EngelLogic();
result.draw();
String NameAdd = "";
Color color;
if(result.isLoF()) {
color = Color.red;
}
else if(!result.isSide()) {
color = Color.green;
}
else {
color = Color.orange;
NameAdd = " Umgekehrt ";
}
EmbedBuilder response = outputFormatter.DCDefaultOutput(
getEffectiveName(event) + "du ziehst " + NameAdd + result.getName(),
result.getDescription(),
color);
response.setImage(result.getImage());
event.deferReply().queue();
event.getHook().editOriginalEmbeds(response.build()).queue();
// event.replyEmbeds(response.build()).queue();
} catch (Exception e) {
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();
}
}
@Override
public void executeText(MessageReceivedEvent event, String[] args) {
try {
EngelLogic result = new EngelLogic();
result.draw();
String NameAdd = "";
Color color;
if(result.isLoF()) {
color = Color.red;
}
else if(!result.isSide()) {
color = Color.green;
}
else {
color = Color.orange;
NameAdd = " Umgekehrt ";
}
EmbedBuilder response = outputFormatter.DCDefaultOutput(
getEffectiveName(event) + "du ziehst " + NameAdd + result.getName(),
result.getDescription(),
color);
response.setImage(result.getImage());
event.getChannel().sendMessageEmbeds(response.build()).queue();
} catch (Exception e) {
LoggerUtil.log("error", "EngelCommand", "Fehler bei Engel-Probe: " + e.getMessage());
event.getChannel().sendMessage(outputFormatter.formatError("Ein Fehler ist bei der Engel-Probe aufgetreten.")).queue();
}
}
@Override
public CommandData getSlashCommandData() {
return Commands.slash(getName(), getDescription());
}
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;
}
}

View File

@ -1,11 +1,8 @@
package Engel;
package de.ocame.wuerfelbot.Engel;
import net.dv8tion.jda.api.EmbedBuilder;
import java.awt.*;
import java.util.Random;
public class arcanaList {
public class EngelLogic {
private arcana[] arcanas;
@ -24,7 +21,7 @@ public class arcanaList {
private boolean LoF;
public arcanaList() {
public EngelLogic() {
usedCard = new boolean[22];
for(int i = 0; i < 22; i++)
usedCard[i] = false;
@ -42,8 +39,6 @@ public class arcanaList {
}
public void draw() {
EmbedBuilder outputBox = new EmbedBuilder();
StringBuilder resultConstruction = new StringBuilder();
if(stack < 1) {
reset();
@ -92,6 +87,13 @@ public class arcanaList {
}
}
public String getDescription() {
StringBuilder result = new StringBuilder();
result.append("**").append(getMeaning()).append("**");
result.append("\n").append(getExplain());
return result.toString().trim();
}
public String getImage() {
String baseURL = "http://ocame.de/engelcards/";
if(activArcana == -1)

View File

@ -1,4 +1,4 @@
package Engel;
package de.ocame.wuerfelbot.Engel;
public class arcana {
private final String name;

View File

@ -0,0 +1,198 @@
package de.ocame.wuerfelbot.Keeproll;
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 KeeprollCommand implements ICommand {
private final KeeprollLogic keeprollLogic;
private final DiceOutputFormatter outputFormatter;
public KeeprollCommand() {
this.keeprollLogic = new KeeprollLogic();
this.outputFormatter = new DiceOutputFormatter();
}
@Override
public String getName() {
return "k";
}
@Override
public String getDescription() {
return "Führt eine X keep Y-Probe mit W10 durch. X > 10 wird 2:1 auf Y Übertragen";
}
@Override
public void executeSlash(SlashCommandInteractionEvent event) {
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 && 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) {
event.reply(outputFormatter.formatError("Die Anzahl der Würfel muss mindestens 1 sein.")).setEphemeral(true).queue();
}
if (diceCount < 1) {
event.reply(outputFormatter.formatError("Die Anzahl der behaltende Würfelergebnisse muss mindestens 1 sein.")).setEphemeral(true).queue();
}
if (target < 0) {
event.reply(outputFormatter.formatError("Ziel darf nicht negativ sein.")).setEphemeral(true).queue();
}
if (explode < 1 || explode > 10) {
event.reply(outputFormatter.formatError("Würfel können nicht unter 1 oder über 10 Explodieren")).setEphemeral(true).queue();
}
return;
}
try {
KeeprollLogic.KeeprollResult result = keeprollLogic.performKeeprollRoll(numberOfDice, diceCount, target, modifier, unskilled, emphases, explode, explodedOnce);
EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.isGlitch());
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 diceCount = 1;
int target = 0;
int modifier = 0;
boolean unskilled = false;
boolean emphases = false;
int explode = 10;
boolean explodedOnce = false;
String ContentRaw = event.getMessage().getContentRaw();
// Prüfen ob Leerer Command gesendet wird
String[] MsgParts = ContentRaw.replace(" ", " ").split(" ", 2);
String msgText = MsgParts[1].trim();
if(msgText.equalsIgnoreCase("help") || msgText.equalsIgnoreCase("hilfe")) {
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"
+ "! - 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("!")) {
explode = 9;
msgText = msgText.replace("!", "");
}
if(msgText.contains("e")) {
emphases = true;
msgText = msgText.replace("e", "");
}
if(msgText.contains("#")) {
explodedOnce = true;
msgText = msgText.replace("#", "");
}
if(msgText.contains("n")) {
unskilled = 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();
modifier = Integer.parseInt(elements.group(2));
if(elements.group(1).equals("-")) {
modifier *= -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));
target = 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));
}
try {
KeeprollLogic.KeeprollResult result = keeprollLogic.performKeeprollRoll(numberOfDice, diceCount, target, modifier, unskilled, emphases, explode, explodedOnce);
EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.isGlitch());
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, "keep", "Die Anzahl behaltende Würfelergebnisse", true)
.addOption(OptionType.INTEGER, "ziel", "Ziel Wert, Zeigt optisch Ergebnis an", false)
.addOption(OptionType.INTEGER, "modifier", "Bonus oder Abzug auf Ergebnis", false)
.addOption(OptionType.BOOLEAN, "unskilled", "Würfel explodieren nicht", false)
.addOption(OptionType.BOOLEAN, "emphases", "gewürfelte 1 werden neu gewürfelt", false)
.addOption(OptionType.INTEGER, "explode", "Ab wann Explodieren Würfel, Standard ist 10", false)
.addOption(OptionType.BOOLEAN, "exploded-once", "Würfel explodieren nur einmal", 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,216 @@
package de.ocame.wuerfelbot.Keeproll;
import java.util.*;
public class KeeprollLogic {
private final Random random;
private int numberOfDice;
private int diceCount;
private int target;
private int modifier;
private boolean unskilled;
private boolean emphases;
private int explode;
private boolean explodedOnce;
private result[] rolls;
private boolean glitches;
private int resultInt;
StringBuilder resultStructur;
public KeeprollLogic() {
this.random = new Random();
reset();
}
public KeeprollLogic reset() {
glitches = false;
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 numberOfDicePar Die Anzahl der zu würfelende Würfeln
* @param diceCountPar Die Anzahl behaltende Würfelergebnisse
* @param targetPar Ziel Wert, Zeigt optisch Ergebnis an
* @param modifierPar Bonus oder Abzug auf Ergebnis
* @param unskilledPar Würfel explodieren nicht.
* @param emphasesPar gewürfelte 1 werden neu gewürfelt
* @param explodePar Ab wann Explodieren Würfel, Standard ist 10
* @param explodedOncePar Würfel explodieren nur einma
*
* @return Ein {@link KeeprollResult}-Objekt mit den einzelnen Würfelergebnissen und Summen.
* @throws IllegalArgumentException Wenn stufe < 1 oder optionale < 0 ist.
*/
public KeeprollResult performKeeprollRoll(int numberOfDicePar, int diceCountPar, int targetPar, int modifierPar, boolean unskilledPar, boolean emphasesPar, int explodePar, boolean explodedOncePar) {
if (numberOfDicePar < 1) {
throw new IllegalArgumentException("Die Stufe muss mindestens 1 sein.");
}
if (diceCountPar < 0) {
throw new IllegalArgumentException("Karma kann nicht negativ sein.");
}
if (targetPar < 0) {
throw new IllegalArgumentException("Meister-Karma kann nicht negativ sein");
}
this.numberOfDice = numberOfDicePar;
this.diceCount = diceCountPar;
this.target = targetPar;
this.modifier = modifierPar;
this.unskilled = unskilledPar;
this.emphases = emphasesPar;
this.explode = explodePar;
this.explodedOnce = explodedOncePar;
reset();
// Korrektur gewürfelte Würfel dürfen nicht kleiner sein als gezählte Würfel
if(numberOfDice < diceCount && numberOfDice <= 10) {
numberOfDice = diceCount;
}
// Überzähle gewürfelte Würfel werden mit 2:1 auf gewertete Würfel verlegt
if(numberOfDice > 10) {
int diceOvflow = numberOfDice-10;
numberOfDice = 10;
// Wenn gewertete 10 oder mehr, überzählige gewürfelte werden 1:2 auf Modifier gerechnet
if(diceCount > 10) {
modifier += diceOvflow*2;
}
else {
if(diceCount + Math.floorDiv(diceOvflow, 2) <= 10) {
diceCount += Math.floorDiv(diceOvflow, 2);
}
else {
diceCount = 10;
modifier += (diceCount + Math.floorDiv(diceOvflow, 2) - 10)*2;
}
}
}
if(diceCount > 10) {
modifier += (diceCount-10)*2;
diceCount = 10;
}
// Würfelarten durchgehen und Würfeln, Sonderwürfel werden imm am Schluss abgearbeitet
StringBuilder resultConstruction = new StringBuilder();
rollDice();
// 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 KeeprollResult(numberOfDice, diceCount, modifier, target, resultInt, rolls, isGlitches()); }
/**
* Eine innere Klasse, die das Ergebnis einer Earthdawn-Probe kapselt.
* Dies macht die Rückgabe mehrerer Werte einfacher und lesbarer.
*/
public static class KeeprollResult {
private final String resultStructur;
private final boolean glitch;
private final String title;
public boolean isGlitch() {
return glitch;
}
public KeeprollResult(int numberOfDice, int diceCount, int modifier, int target, int resultInt, result[] rolls, boolean glitch) {
this.glitch = glitch;
String addition = "";
if(modifier != 0) {
if(modifier < 0) {
addition += " - " + (modifier*-1) + " ";
}
else {
addition += " + " + modifier + " ";
}
}
if(target > 0) {
addition += " Schwierigkeit " + target;
}
title = numberOfDice + "k" + diceCount + addition + ": " + resultInt;
StringBuilder description = new StringBuilder();
for(int i = 0; i < numberOfDice; i++) {
if(description.length() > 0) {
description.append(", ");
}
description.append(rolls[i].getText());
}
resultStructur = description.toString();
}
public String getDescription() {
return "(" + resultStructur + ")";
}
public String getTitle() {
return title;
}
}
public boolean isGlitches() {
return glitches;
}
private void rollDice() {
rolls = new result[numberOfDice];
int [][] sortRolls = new int[numberOfDice][2];
resultInt = 0;
for(int i = 0; i < numberOfDice; i++) {
rolls[i] = new result();
rolls[i].setMaxReroll(explodedOnce).setReroll1(emphases).setExplode(explode).setNoreroll(unskilled);
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--) {
resultInt += sortRolls[i-1][1];
rolls[sortRolls[i-1][0]].setMarket();
}
resultInt += modifier;
// Border Farbe
if(resultInt < target) {
glitches = true;
}
}
}

View File

@ -1,4 +1,4 @@
package Vampire;
package de.ocame.wuerfelbot.Keeproll;
import java.util.Random;
@ -6,29 +6,24 @@ public class result {
private StringBuilder text;
private int value;
private final int diceart;
private Boolean reroll9;
private Boolean reroll1;
private Boolean maxReroll;
private Boolean noreroll;
private Integer explode;
public result() {
diceart = 10;
text = new StringBuilder();
value = 0;
reroll9 = false;
reroll1 = false;
maxReroll = false;
noreroll = false;
explode = 10;
}
public String getText() {
return text.toString();
}
public void setText(String text) {
this.text = new StringBuilder();
this.text.append(text);
}
public void setMarket() {
String tmp = this.text.toString();
@ -40,14 +35,6 @@ public class result {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public result setReroll9(Boolean reroll9) {
this.reroll9 = reroll9;
return this;
}
public result setReroll1(Boolean reroll1) {
this.reroll1 = reroll1;
@ -64,17 +51,22 @@ public class result {
return this;
}
public result setExplode(Integer explode) {
this.explode = explode;
return this;
}
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) {
@ -87,11 +79,9 @@ public class result {
value += dice;
if(!noreroll) {
if (dice == 10) {
if (dice >= explode) {
reroll = rolls <= 0 || !maxReroll; // wenn maxRolls an und schon einmal gerollt wurde kein reroll
++rolls;
} else if (reroll9 && dice == 9) {
reroll = rolls <= 0 || !maxReroll;
} else if (reroll1 && dice == 1 && rolls <= 0) {
reroll = true;
value--;

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,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() {

View File

@ -0,0 +1,97 @@
package de.ocame.wuerfelbot.Simpleroll;
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.build.CommandData;
import java.util.Arrays;
public class SimplerollCommand implements ICommand {
private final SimplerollLogic rollLogic;
private final DiceOutputFormatter outputFormatter;
public SimplerollCommand() {
this.rollLogic = new SimplerollLogic();
this.outputFormatter = new DiceOutputFormatter();
}
@Override
public String getName() {
// Der primäre Name für den Text-Befehl
return "roll";
}
@Override
public String getDescription() {
return "Würfelt Würfel nach verschiedenen Notationen (z.B. 9, 9d4, 3w8, 9 +4).";
}
// --- Slash Command Handling (Wird leer gelassen oder eine Fehlermeldung gesendet) ---
@Override
public void executeSlash(SlashCommandInteractionEvent event) {
// Dieser Befehl ist nicht für Slash-Commands vorgesehen.
event.reply(outputFormatter.formatError("Dieser Befehl ist nur als Text-Befehl (!roll oder !r) verfügbar.")).setEphemeral(true).queue();
}
// --- Text Command Handling (Bestehend, mit Erweiterungen) ---
@Override
public void executeText(MessageReceivedEvent event, String[] args) {
if (args.length == 0) {
event.getChannel().sendMessage(outputFormatter.formatError("Verwendung: `!roll <notation> [+<modifikator>]` oder `!r <notation> [+<modifikator>]`")).queue();
return;
}
String notation = args[0];
int modifier = 0;
// Versuche, einen optionalen Modifikator zu parsen, wenn mehr Argumente vorhanden sind
if (args.length > 1) {
// Kombiniere die restlichen Argumente zu einem String und versuche zu parsen
String modifierPart = String.join("", Arrays.copyOfRange(args, 1, args.length));
try {
if (modifierPart.startsWith("+") || modifierPart.startsWith("-")) {
modifier = Integer.parseInt(modifierPart); // Parser handhabt +/-
} else {
// Wenn es keine + oder - gibt, aber weitere Argumente, behandle es als Fehler
event.getChannel().sendMessage(outputFormatter.formatError("Ungültiger Modifikator-Format. Verwende `+4` oder `-2`.")).queue();
return;
}
} catch (NumberFormatException e) {
event.getChannel().sendMessage(outputFormatter.formatError("Ungültiger Modifikator: '" + modifierPart + "'. Bitte gib eine Zahl ein.")).queue();
return;
}
}
try {
SimplerollLogic.RollResult result = rollLogic.performRoll(notation, modifier);
// EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), result.isGlitch());
EmbedBuilder response = outputFormatter.DCDefaultOutput(getEffectiveName(event) + result.getTitle(), result.getDescription(), false);
event.getChannel().sendMessageEmbeds(response.build()).queue();
} catch (IllegalArgumentException e) {
event.getChannel().sendMessage(outputFormatter.formatError(e.getMessage())).queue();
} catch (Exception e) {
LoggerUtil.log("error", "SimbelRollCommand", "Fehler beim Ausführen von Text-Befehl roll/r: " + e.getMessage());
event.getChannel().sendMessage(outputFormatter.formatError("Ein unerwarteter Fehler ist beim Würfeln aufgetreten.")).queue();
}
}
@Override
public CommandData getSlashCommandData() {
return null;
}
private String getEffectiveName(MessageReceivedEvent event) {
if (event.getMember() == null) {
return "";
}
return event.getMember().getEffectiveName() + " ";
}
}

View File

@ -0,0 +1,119 @@
package de.ocame.wuerfelbot.Simpleroll;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class SimplerollLogic {
// Eine einzige Instanz von Random für alle Würfeloperationen
private final Random random;
// Pattern für Notationen wie "9d4" oder "3w8"
private static final Pattern DICE_NOTATION_PATTERN = Pattern.compile("(\\d+)[dw](\\d+)");
public SimplerollLogic() {
this.random = new Random();
}
/**
* Führt einen Würfelwurf basierend auf der Notation und einem optionalen Modifikator durch.
*
* @param notation Die Würfelnotation (z.B. "9", "9d4", "3w8").
* @param modifier Ein optionaler Integer-Modifikator, der zur Gesamtsum addiert wird.
* @return Ein {@link RollResult}-Objekt mit den detaillierten Ergebnissen.
* @throws IllegalArgumentException Wenn die Notation ungültig ist oder andere Parameterfehler auftreten.
*/
public RollResult performRoll(String notation, int modifier) {
if (notation == null || notation.trim().isEmpty()) {
throw new IllegalArgumentException("Würfelnotation darf nicht leer sein.");
}
int numberOfDice;
int sides;
String parsedNotation = notation.trim().toLowerCase(); // Normalize input
Matcher matcher = DICE_NOTATION_PATTERN.matcher(parsedNotation);
if (matcher.matches()) {
// Format: XdY oder XwY (z.B. "9d4", "3w8")
numberOfDice = Integer.parseInt(matcher.group(1));
sides = Integer.parseInt(matcher.group(2));
} else {
// Format: X (z.B. "9") -> Würfelt X W6
try {
numberOfDice = Integer.parseInt(parsedNotation);
sides = 6; // Standard: W6, wenn nur Anzahl angegeben
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Ungültige Würfelnotation: '" + notation + "'. Erwartet wird Zahl (z.B. 9) oder NdS (z.B. 9d4).");
}
}
if (numberOfDice < 1 || numberOfDice > 1000) { // Angemessene Grenzen festlegen
throw new IllegalArgumentException("Anzahl der Würfel muss zwischen 1 und 1000 liegen.");
}
if (sides < 2 || sides > 1000) { // Angemessene Grenzen festlegen (mind. 2 Seiten, max 1000)
throw new IllegalArgumentException("Würfel müssen mindestens 2 und höchstens 1000 Seiten haben.");
}
List<Integer> rolls = new ArrayList<>(numberOfDice);
int sum = 0;
for (int i = 0; i < numberOfDice; i++) {
int roll = random.nextInt(sides) + 1; // Würfelt 1 bis 'sides'
rolls.add(roll);
sum += roll;
}
// Addiere den Modifikator zur Summe
sum += modifier;
return new RollResult(rolls, sum, notation + "w" + sides, modifier);
}
/**
* Innere Klasse zum Kapseln der Würfelergebnisse.
*/
public static class RollResult {
private final List<Integer> rolls;
private final int sum;
private final String notation;
private final int modifier;
public RollResult(List<Integer> rolls, int sum, String notation, int modifier) {
this.rolls = rolls;
this.sum = sum;
this.notation = notation;
this.modifier = modifier;
}
public List<Integer> getRolls() {
return rolls;
}
public int getSum() {
return sum;
}
public String getNotation() {
return notation;
}
public int getModifier() {
return modifier;
}
public String getDescription() {
return "(" + rolls.stream().map(String::valueOf)
.collect(Collectors.joining(", ")) + ")";
}
public String getTitle() {
String message = "%rolls%: %hits%";
return message.replace("%rolls%", rolls.size() + (modifier!=0 ? (modifier<0?"-":"+") + modifier : "")).replace("%hits%", Integer.toString(sum));
}
}
}

View File

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

View File

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

View File

@ -0,0 +1,157 @@
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;
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<String, ICommand> 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 EarthdawnCommand());
addCommand(new EngelCommand());
addCommand(new KeeprollCommand());
addCommand(new ShadowrunCommand());
SimplerollCommand simplerollCmd = new SimplerollCommand();
addCommand(simplerollCmd); // Registriert unter "roll"
commands.put("r", simplerollCmd); // Alias für SimpleRollCommand
// 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<CommandData> 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.");
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,40 @@
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) {
return DCDefaultOutput(title, description, glitch?Color.red:Color.green);
}
public EmbedBuilder DCDefaultOutput(String title, String description, Color color) {
EmbedBuilder outputBox = new EmbedBuilder();
outputBox.setColor(color);
outputBox.setTitle(title);
outputBox.setDescription(description);
return outputBox;
}
/**
* Formatiert eine Fehlermeldung.
* @param message Die Fehlermeldung.
* @return Der formatierte String.
*/
public String formatError(String message) {
return String.format("❌ Fehler: %s", message);
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{dd.MM.YY HH:mm:ss.SSS} %boldCyan(%-34.-34thread) %red(%10.10X{jda.shard}) %boldGreen(%-15.-15logger{0}) %highlight(%-6level) %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>