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 channelList = new HashMap<>(); public dice() { this.prefixSr = "/sr"; this.prefixIni = "/ini"; this.prefixTest = "/rollTest"; this.prefixZitat = "/zitat"; this.prefixCId = "/cid"; helpDe.add("Alle Befehle können in einen Channel geschrieben werden oder per Direkt Nachricht gesender werden"); helpDe.add(this.prefixSr + "Zahl", "Würfelt Zahl x W6. Gewürfelte 5. und 6. Werden als Erfolge gezählt, 1. als Misserfolge.\n" + "Erreicht oder übersteigt die Anzhal der 1. die hälfte der gewürfelten Würfel, zählt dies als ein Patzer. Gibt es mind. 1 Erfolg wird die Markierung der Ausgabe Gelb." + "wird aber kein Erfolg gewürfelt zählt dies als Kritischer Patzer und die Markierung wird Rot **Wichtig: Vor- und Nachteile die Einfluss auf die Patzer Changse haben werden nicht berücksichtigt"); helpDe.add(this.prefixSr + "+ Zahl", "Gleich wie bei " + this.prefixSr + "Zahl. Mit dem Unterschied dass alle gewürfelten 6. ein zuzätlichen Würfel generien."); helpDe.add(this.prefixSr + " Zahl_1 + Zahl_2", "Würfelt Zahl_2 x W6 und addiert Zahl_1 hinzu, um die Initative zu bestimmen"); helpDe.add(this.prefixIni + " Zahl_1 + Zahl_2", "Synonym für " + this.prefixSr + " Zahl_1 + Zahl_2"); helpDe.add(this.prefixCId, "Gibt aktuelle Channel ID zurück"); this.db = new db_connect(); } @Override public void onMessageReceived(MessageReceivedEvent event) { if ((!event.getMessage().getContentRaw().startsWith(this.prefixSr) && !event.getMessage().getContentRaw().startsWith(this.prefixIni) && !event.getMessage().getContentRaw().startsWith(this.prefixZitat) && !event.getMessage().getContentRaw().startsWith(this.prefixTest) && !event.getMessage().getContentRaw().startsWith(this.prefixCId)) || (event.getChannelType() != ChannelType.TEXT && event.getChannelType() != ChannelType.PRIVATE)) { return; } if(!channelList.containsKey(event.getChannel().getId())) { Map Einstellungen = db.getChannelSettings(event.getChannel().getId()); channelList.put(event.getChannel().getId(), Einstellungen.get("lang")); } switch (channelList.get(event.getChannel().getId())) { case "de": activLang = langDe; break; case "en": activLang = langEn; break; default: activLang = langDe; } User author = event.getAuthor(); if (event.getMessage().getContentRaw().startsWith(this.prefixSr)) this.srroll(event); else if (event.getMessage().getContentRaw().startsWith(this.prefixIni)) this.ini(event); else if (event.getMessage().getContentRaw().startsWith(this.prefixTest)) this.rollTest(event); else if (event.getMessage().getContentRaw().startsWith(this.prefixZitat)) this.zitat(event); else if (event.getMessage().getContentRaw().startsWith(this.prefixCId)) this.cid(event); } /*@Override public void onMessageReactionAdd(MessageReactionAddEvent event) { User user = event.getUser(); if(!channelList.containsKey(event.getChannel().getId())) { Map Einstellungen = db.getChannelSettings(event.getChannel().getId()); channelList.put(event.getChannel().getId(), Einstellungen.get("lang").toString()); } switch (channelList.get(event.getChannel().getId())) { case "de": activLang = langDe; break; case "en": activLang = langEn; break; default: activLang = langDe; } if (!user.isBot()) { if(event.getReactionEmote().getId().equals("517528156014510111")) { // SR Reaktion - reroll reaktionRerollEdge(event); } else if(event.getReactionEmote().getId().equals("517545127376322596")) { // ausgedehnte probe extensionroll(event); } } }*/ /** * rolltest * * @param event JDA Event */ private void rollTest(MessageReceivedEvent event) { EmbedBuilder test = new EmbedBuilder(); test.setTitle("Das ist ein Test"); test.setColor(Color.red); test.setDescription("Text " + getAsMention(event)); int[] verteilung = new int[6]; int[] verteilung2 = new int[6]; int[] verteilung3 = new int[6]; int dice1, dice2, dice3; try { String[] MsgParts_exl_Mention = event.getMessage().getContentRaw().split(" "); int rounds = Integer.parseInt(MsgParts_exl_Mention[1]); if(rounds <= 0) { event.getChannel().sendMessage("Nope").queue(); return; } for(int i = 0; i < rounds; i++) { dice1 = new Random().nextInt(6); dice2 = new SecureRandom().nextInt(6); //dice3 = new ThreadLocalRandom().current().nextInt(6); dice3 = ThreadLocalRandom.current().nextInt(0, 6); verteilung[dice1]++; verteilung2[dice2]++; verteilung3[dice3]++; } for(int i = 0; i < 6; i++) { float pro = verteilung[i]*100f/rounds; test.addField(Integer.toString(i+1), verteilung[i] + " - " + String.format("%.2f", pro) + "%", true); } test.addBlankField(false); for(int i = 0; i < 6; i++) { float pro = verteilung2[i]*100f/rounds; test.addField(Integer.toString(i+1), verteilung2[i] + " - " + String.format("%.2f", pro) + "%", true); } test.addBlankField(false); for(int i = 0; i < 6; i++) { float pro = verteilung3[i]*100f/rounds; test.addField(Integer.toString(i+1), verteilung3[i] + " - " + String.format("%.2f", pro) + "%", true); } event.getChannel().sendMessageEmbeds(test.build()).queue(); } catch (NumberFormatException e) { event.getChannel().sendMessage("Nope").queue(); } catch (Exception e) { System.out.println("problem: " + e.getMessage()); } } /** * rolltest * * @param event JDA Event */ private void srroll(MessageReceivedEvent event) { int numberOfDice = 1; int diceart = 6; boolean edge = false; try { // Prüfen ob Edge wurf if(event.getMessage().getContentRaw().startsWith(this.prefixSr+"+") || event.getMessage().getContentRaw().startsWith(this.prefixSr+" +")) { edge = true; } // korrikiert Edge eingabe von /sr + zu /sr+ String ContentRaw = event.getMessage().getContentRaw(); if(event.getMessage().getContentRaw().startsWith(this.prefixSr+" +")) { ContentRaw = ContentRaw.replace(this.prefixSr+" +", this.prefixSr+"+ ").replace(" ", " "); } // Prüfen ob Leerer Command gesendet wird String[] MsgParts = ContentRaw.split(" ", 2); if(MsgParts.length < 2) { String message = activLang.emptyCommand; message = message.replace("%command%", this.prefixSr); event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } if(MsgParts[1].contains("+")) { this.ini(event); return; } if(MsgParts[1].trim().matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden if(MsgParts[1].trim().equalsIgnoreCase("de")) { activLang = langDe; channelList.put(event.getChannel().getId(), "de"); event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); db.setChannelSettings(event.getChannel().getId(), "de", event.getGuild().getId(), event.getChannel().getName()); return; } else if(MsgParts[1].trim().equalsIgnoreCase("en")) { activLang = langEn; channelList.put(event.getChannel().getId(), "en"); event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); db.setChannelSettings(event.getChannel().getId(), "en", event.getGuild().getId(), event.getChannel().getName()); return; } if(MsgParts[1].trim().toLowerCase().replace(" ", "").matches("([0-9]*)[dw]([0-9].*)")) { // format besteh aus (Zahlen)d(Zahlen) oder (Zahlen)w(Zahlen) String[] diceInterpreter = MsgParts[1].trim().toLowerCase().replace(" ", "").split("[wd]"); try { diceart = Integer.parseInt(diceInterpreter[1]); numberOfDice = Integer.parseInt(diceInterpreter[0]); } catch (NumberFormatException e) { String message = activLang.error; message = message.replace("%command%", MsgParts[1].trim().toLowerCase()); event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } } else { String message = activLang.error; message = message.replace("%command%", MsgParts[1].trim()); event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } } else { try { numberOfDice = Integer.parseInt(MsgParts[1].trim().replace(" ", "")); } catch (NumberFormatException e) { String message = activLang.error; message = message.replace("%command%", MsgParts[1].trim()); event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } } srrollOut(numberOfDice, diceart, edge, event.getChannel(), event.getAuthor(), getEffectiveName(event), event.getMessage().getContentRaw(), -1, 0, event.getJDA()); } catch (NumberFormatException e) { event.getChannel().sendMessage("Nope").queue(); } catch (Exception e) { System.out.println("problem: " + e.getMessage()); } } /** * srrollOut * * @param numberOfDice * @param diceart * @param edge * @param channel * @param user * @param effectiveName * @param inputMessage * @param hitBasis * @param type */ private void srrollOut(int numberOfDice, int diceart, boolean edge, MessageChannel channel, User user, String effectiveName, String inputMessage, int hitBasis, int type, JDA jda) { EmbedBuilder outputBox = new EmbedBuilder(); int[] verteilung = new int[diceart]; int dice1; StringBuilder result = new StringBuilder(); StringBuilder rollString = new StringBuilder(); int hits = 0; boolean glitches = false; try { if(numberOfDice <= 0) { String message = activLang.noNegativ; channel.sendMessage(user.getAsMention() + message).queue(); return; } int bonusEdegeDice = 0; int dicecorrection = hitBasis < 0 ? 0 : hitBasis; for(int i = 0; i < numberOfDice+bonusEdegeDice; i++) { dice1 = new Random().nextInt(diceart); if(edge && dice1 == 5) bonusEdegeDice++; if(dice1 >= 4) { hits++; } verteilung[dice1]++; if((dice1 >= 4) || (dice1 == 0)) result.append("**").append(dice1+1).append("**"); else result.append(dice1+1); result.append(" "); } if (verteilung[0] > (numberOfDice+bonusEdegeDice+dicecorrection)/2f) { // Patzer nur bei über er Hälfte an 1er glitches = true; } if(hits+dicecorrection == 0 && !glitches) { // kein Erfolg, kein Patzer outputBox.setColor(Color.gray); } else if(hits+dicecorrection == 0 && glitches) { // kritischer Patzer outputBox.setColor(Color.red); } else if(glitches) { // Patzer outputBox.setColor(Color.yellow); } else { // Erfolg outputBox.setColor(Color.green); } String addition = ""; if(bonusEdegeDice > 0) { addition = " + " + bonusEdegeDice + activLang.dice + diceart; } String message = ""; if(type == 1) { message = activLang.resultText; //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)).replace("%EdgeDice%", addition).replace("%hits%", hits + "\t Gesamt: " + (hits + hitBasis)).replace("%oneHits%", String.valueOf(verteilung[0])); outputBox.setTitle(effectiveName + " Edgereroll " + message); } if(type == 2) { message = activLang.resultTextExtent; //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)).replace("%EdgeDice%", addition).replace("%hits%", hits + "\t Gesamt: " + (hits + hitBasis)).replace("%oneHits%", String.valueOf(verteilung[0])); outputBox.setTitle(effectiveName + " Ausgedehnt " + message); } else { message = activLang.resultText; //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)).replace("%EdgeDice%", addition).replace("%hits%", String.valueOf(hits)).replace("%oneHits%", String.valueOf(verteilung[0])); outputBox.setTitle(effectiveName + message); } outputBox.setDescription("(" + result.toString().trim() + ")"); //outputBox.appendDescription("\r" + jda.getEmoteById("517528156014510111").getAsMention() + " Edge reroll"); //outputBox.appendDescription("\r" + jda.getEmoteById("517545127376322596").getAsMention() + " Ausgedehnte Probe"); //JDA::getEmoteById(); for(int i = 0; i < diceart; i++) { float pro = verteilung[i]*100f/numberOfDice; //outputBox.addField(Integer.toString(i+1), Integer.toString(verteilung[i]) + " - " + String.format("%.2f", pro) + "%", true); } rollString.append(numberOfDice).append("|").append(hits+dicecorrection).append("|").append(verteilung[0]); //event.getChannel().sendMessage(outputBox.build()).queue(); long[] messageId = new long[1]; boolean finalEdge = edge; String finalRollData = rollString.toString(); channel.sendMessageEmbeds(outputBox.build()).queue(message1 -> { if(!finalEdge && type == 0) { //message1.addReaction("sr:517528156014510111").queue(); } if(!finalEdge && (type == 0 || type == 2)) { //message1.addReaction("test:517545127376322596").queue(); } messageId[0] = message1.getIdLong(); if(channel.getType() == ChannelType.PRIVATE) { db.insertDice(user.getName(), user.getId(), inputMessage, result.toString().trim(), channel.getId(), messageId[0], finalRollData); } else { db.insertDice(user.getName(), user.getId(), inputMessage, result.toString().trim(), channel.getId(), messageId[0], finalRollData); } }); } catch (NumberFormatException e) { channel.sendMessage("Nope").queue(); } catch (Exception e) { System.out.println("problem: " + e.getMessage()); } } private void ini(MessageReceivedEvent event) { EmbedBuilder outputBox = new EmbedBuilder(); int dice1; int numberOfDice = 1; int diceart = 6; int iniBase = 0; int ini = 0; StringBuilder result = new StringBuilder(); try { String[] MsgParts = event.getMessage().getContentRaw().split(" ", 2); if(MsgParts.length < 2) { // Leerer Befehl String message = activLang.emptyCommand; message = message.replace("%command%", this.prefixIni); event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } if(MsgParts[1].trim().matches(".*[^0-9].*")) { // es wurden andere zeichen als Zahlen gefunden if(MsgParts[1].trim().equalsIgnoreCase("de")) { activLang = langDe; channelList.put(event.getChannel().getId(), "de"); event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); return; } else if(MsgParts[1].trim().equalsIgnoreCase("en")) { activLang = langEn; channelList.put(event.getChannel().getId(), "en"); event.getChannel().sendMessage(getAsMention(event) + activLang.language).queue(); return; } String[] iniParts = MsgParts[1].trim().toLowerCase().split("\\+", 2); messageInterpreter mI = new messageInterpreter(event, activLang); if(iniParts.length == 1) { // Nachricht hat kein + Zeichen mI.inputInterpreter(iniParts[0]); if(mI.isNum()) { numberOfDice = mI.getIntResult(); } else if(mI.isDice()) { diceart = mI.getDiceart(); numberOfDice = mI.getNumberOfDice(); } } else { mI.inputInterpreter(iniParts[0]); // Vor dem + if(mI.isNum()) { iniBase = mI.getIntResult(); } else if(mI.isDice()) { iniBase = mI.getNumberOfDice(); } mI.inputInterpreter(iniParts[1]); // Nach dem + if(mI.isNum()) { numberOfDice = mI.getIntResult(); } else if(mI.isDice()) { diceart = mI.getDiceart(); numberOfDice = mI.getNumberOfDice(); } } } else { try { numberOfDice = Integer.parseInt(MsgParts[1].trim().replace(" ", "")); } catch (NumberFormatException e) { String message = activLang.error; message = message.replace("%command%", MsgParts[1].trim()); event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } } if(numberOfDice <= 0) { String message = activLang.noNegativ; event.getChannel().sendMessage(getAsMention(event) + message).queue(); return; } ini += iniBase; for(int i = 0; i < numberOfDice; i++) { dice1 = new Random().nextInt(diceart); result.append(dice1+1).append(" "); ini += (dice1+1); } outputBox.setColor(new Color(104, 34, 139)); String message = "%iniBase%+%numberOfDice%w%diceart%\tIni: %ini%"; //activLang.resultText; //%numberOfDice%%dice%%diceart% %EdgeDice%:\tErfolge: %hits%\tMisserfolge: %oneHits%"; message = message.replace("%numberOfDice%", String.valueOf(numberOfDice)).replace("%diceart%", String.valueOf(diceart)) .replace("%iniBase%", String.valueOf(iniBase)).replace("%ini%", String.valueOf(ini)); outputBox.setTitle(getEffectiveName(event) + message); outputBox.setDescription(iniBase + " + (" + result.toString().trim().replace(" ", "+") + ")"); event.getChannel().sendMessageEmbeds(outputBox.build()).queue(); } catch (NumberFormatException e) { event.getChannel().sendMessage("Nope").queue(); } catch (IllegalArgumentException e) { event.getChannel().sendMessage(e.getMessage()).queue(); } catch (Exception e) { System.out.println("problem: " + e.getMessage()); } } private void zitat(MessageReceivedEvent event) { String[] quotes = new String[7]; quotes[0] = "*quiek quiek quiek*"; quotes[1] = "(\\\\______/)\n" + "( ͡ ͡° ͜ ʖ ͡ ͡°) *snuff snuff*\n" + "\\\\╭☞ \\\\╭☞\n"; quotes[2] = "(づ。◕‿‿◕。)づ"; quotes[3] = "zzzZZZZZzzZZ"; quotes[4] = "piiiep"; quotes[5] = "grrrrr"; //quotes[6] = "ʕᵔᴥᵔʔ =*Auto translator*=> In meiner psychophysischen Konstituton manifestiert sich eine absolute Dominanz positiver Effekte für die Individualität Deiner Person. "; int dice = new Random().nextInt(600); event.getChannel().sendMessage(quotes[dice%6]).queue(); } private void cid(MessageReceivedEvent event) { event.getChannel().sendMessage(getAsMention(event) + " " + event.getChannel().getId()).queue(); } private String getEffectiveName(MessageReceivedEvent event) { if(event.getMember() == null) { return ""; } return event.getMember().getEffectiveName() + " "; } private String getAsMention(MessageReceivedEvent event) { if(event.getMember() == null) { return ""; } return event.getMember().getAsMention() + " "; } private void reaktionRerollEdge(MessageReactionAddEvent event) { Map wurf = db.getMesssage(event.getMessageIdLong()); if(!wurf.containsKey("benutzerId")) { return; } else if(!wurf.get("benutzerId").equals(event.getUserId())) { return; } String[] wurfParts = wurf.get("wurfdaten").split("\\|"); int dice = Integer.parseInt(wurfParts[0]); int hits = Integer.parseInt(wurfParts[1]); int miss = Integer.parseInt(wurfParts[2]); String effectName = ""; if(event.getMember().getEffectiveName() != "") { effectName = event.getMember().getEffectiveName(); } srrollOut(dice-hits, 6, false, event.getChannel(), event.getUser(), effectName, "Edege Reroll", hits, 1, event.getJDA()); } private void extensionroll(MessageReactionAddEvent event) { Map wurf = db.getMesssage(event.getMessageIdLong()); if(!wurf.containsKey("benutzerId")) { return; } else if(!wurf.get("benutzerId").equals(event.getUserId())) { return; } String[] wurfParts = wurf.get("wurfdaten").split("\\|"); int dice = Integer.parseInt(wurfParts[0]); int hits = Integer.parseInt(wurfParts[1]); int miss = Integer.parseInt(wurfParts[2]); String effectName = ""; if(event.getMember().getEffectiveName() != "") { effectName = event.getMember().getEffectiveName(); } if(dice == 1) { event.getChannel().sendMessage(event.getUser().getAsMention() + " mehr geht nicht, du hast **" + hits + "** Erfolge").queue(); } else { srrollOut(dice - 1, 6, false, event.getChannel(), event.getUser(), effectName, "Extent Roll", hits, 2, event.getJDA()); } } }