summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/META-INF/MANIFEST.MF3
-rw-r--r--src/main/java/de/romjaki/selfbot/Config.java85
-rw-r--r--src/main/java/de/romjaki/selfbot/Configurable.java14
-rw-r--r--src/main/java/de/romjaki/selfbot/Main.java34
-rw-r--r--src/main/java/de/romjaki/selfbot/MessageListener.java206
-rw-r--r--src/main/java/de/romjaki/selfbot/Rot.java140
-rw-r--r--src/main/java/de/romjaki/selfbot/Util.java34
7 files changed, 516 insertions, 0 deletions
diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7d5fa1c
--- /dev/null
+++ b/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: de.romjaki.selfbot.Main
+
diff --git a/src/main/java/de/romjaki/selfbot/Config.java b/src/main/java/de/romjaki/selfbot/Config.java
new file mode 100644
index 0000000..26bbd38
--- /dev/null
+++ b/src/main/java/de/romjaki/selfbot/Config.java
@@ -0,0 +1,85 @@
+package de.romjaki.selfbot;
+
+import net.dv8tion.jda.core.utils.SimpleLog;
+
+import java.io.*;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+/**
+ * Created by RGR on 21.05.2017.
+ */
+public class Config {
+ @Configurable
+ public String TOKEN;
+ @Configurable
+ public String NAME;
+ @Configurable
+ public String WEBLINK;
+
+
+ private Config() {
+ }
+
+ public static Config getConfig(String file) {
+ return getConfig(new File(file));
+ }
+
+ public static Config getConfig(File file) {
+ if (file.isDirectory()) {
+ SimpleLog.getLog("startup").fatal("Config file is a directory");
+ System.exit(1);
+ }
+ try (Scanner s = new Scanner(file)) {
+ Config c = new Config();
+ Class<? extends Config> clazz = c.getClass();
+ while (s.hasNextLine()) {
+ String line = s.nextLine();
+ String[] tmp = line.split(":", 2);
+ String key = tmp[0].trim();
+ String val = tmp[1].trim();
+ if (val.isEmpty()) continue;
+ try {
+ Field f = clazz.getField(key.toUpperCase());
+ if (f == null || !f.isAnnotationPresent(Configurable.class) || Modifier.isStatic(f.getModifiers()))
+ continue;
+ f.set(c, val);
+ } catch (Exception e) {
+ continue;
+ }
+ }
+ return c;
+ } catch (FileNotFoundException e) {
+ SimpleLog.getLog("startup").fatal("Config not found. Trying to generate file. Fill in the information and restart.");
+ if (!file.getParentFile().exists()) {
+ file.getParentFile().mkdirs();
+ if (!file.getParentFile().exists()) {
+ SimpleLog.getLog("startup").fatal(String.format("Failed to create config directory. %s", e));
+ System.exit(1);
+ }
+ }
+ if (!file.exists()) {
+ Config.writeTemplateToFile(file);
+ }
+ System.exit(1);
+ }
+ return null;
+ }
+
+ private static void writeTemplateToFile(File file) {
+ try (PrintStream ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(file)))) {
+ ps.print(buildTemplate());
+ } catch (IOException e) {
+ SimpleLog.getLog("startup").fatal(String.format("Failed to write template to file. %s", e));
+ System.exit(1);
+ }
+ }
+
+ private static String buildTemplate() {
+ StringBuilder sb = new StringBuilder();
+ Stream.of(Config.class.getFields()).forEach(s -> sb.append(s.getName().toUpperCase()).append(':').append(System.lineSeparator()));
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/de/romjaki/selfbot/Configurable.java b/src/main/java/de/romjaki/selfbot/Configurable.java
new file mode 100644
index 0000000..f690a4a
--- /dev/null
+++ b/src/main/java/de/romjaki/selfbot/Configurable.java
@@ -0,0 +1,14 @@
+package de.romjaki.selfbot;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by RGR on 21.05.2017.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Configurable {
+}
diff --git a/src/main/java/de/romjaki/selfbot/Main.java b/src/main/java/de/romjaki/selfbot/Main.java
new file mode 100644
index 0000000..69ccdbc
--- /dev/null
+++ b/src/main/java/de/romjaki/selfbot/Main.java
@@ -0,0 +1,34 @@
+package de.romjaki.selfbot;
+
+import net.dv8tion.jda.core.AccountType;
+import net.dv8tion.jda.core.JDA;
+import net.dv8tion.jda.core.JDABuilder;
+import net.dv8tion.jda.core.exceptions.RateLimitedException;
+import net.dv8tion.jda.core.utils.SimpleLog;
+
+import javax.security.auth.login.LoginException;
+
+/**
+ * Created by RGR on 21.05.2017.
+ */
+public class Main {
+ private Main() {
+ Util.singleton(Main.class);
+ }
+
+ public static void main(String[] args) {
+ Config c = Config.getConfig(String.join(" ", args));
+ JDA jda = null;
+ try {
+ jda = new JDABuilder(AccountType.CLIENT)
+ .setToken(c.TOKEN)
+ .addEventListener(new MessageListener(c))
+ .buildAsync();
+ } catch (LoginException | RateLimitedException e) {
+ SimpleLog.getLog("startup").fatal(String.format("Failed to connect: %s", e));
+ System.exit(1);
+ }
+
+ }
+
+}
diff --git a/src/main/java/de/romjaki/selfbot/MessageListener.java b/src/main/java/de/romjaki/selfbot/MessageListener.java
new file mode 100644
index 0000000..ac166e1
--- /dev/null
+++ b/src/main/java/de/romjaki/selfbot/MessageListener.java
@@ -0,0 +1,206 @@
+package de.romjaki.selfbot;
+
+import net.dv8tion.jda.core.EmbedBuilder;
+import net.dv8tion.jda.core.entities.Game;
+import net.dv8tion.jda.core.entities.Message;
+import net.dv8tion.jda.core.entities.MessageHistory;
+import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.core.hooks.ListenerAdapter;
+import net.dv8tion.jda.core.utils.SimpleLog;
+
+import java.awt.*;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+/**
+ * Created by RGR on 21.05.2017.
+ */
+public class MessageListener extends ListenerAdapter {
+ private static final Rot rotter = new Rot();
+ private Config config;
+
+ public MessageListener(Config c) {
+ this.config = c;
+ }
+
+ @Override
+ public void onMessageReceived(MessageReceivedEvent event) {
+ if (!event.getAuthor().equals(event.getJDA().getSelfUser())) {
+ return;
+ }
+ Message message = event.getMessage();
+ String raw = message.getRawContent();
+ Message mes = null;
+ boolean deleteAfter = false;
+ if (raw.startsWith(":>")) {
+ raw = raw.replaceFirst(":>", "::");
+ deleteAfter = true;
+ }
+ if (raw.matches("(?si)^::embed\\s.*")) {
+ mes = embed(event);
+ }
+ if (raw.matches("(?is)^::cite\\s.*")) {
+ mes = cite(event);
+ }
+ if (raw.matches("(?si)^::game\\s.*")) {
+ mes = game(event);
+ }
+ if (raw.matches("(?is)^::time.*")) {
+ mes = time(event);
+ }
+ if (raw.matches("(?is)^::google\\s.*")) {
+ try {
+ mes = google(event);
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+ if (raw.matches("(?is)^::spam\\s.*")) {
+ mes = spam(event);
+ }
+ if (raw.matches("(?is)^::rot\\s.+")) {
+ mes = rot(event);
+ }
+ if (deleteAfter && mes != null) {
+ mes.delete().queueAfter(5, SECONDS);
+ }
+ }
+
+ private Message rot(MessageReceivedEvent event) {
+ String[] parts = event.getMessage().getRawContent().replaceFirst("(?i)^:[:>]rot\\s+", "").split("\\s+", 2);
+ event.getMessage().delete().queue();
+ if (parts.length < 2) {
+ return event.getChannel().sendMessage(new EmbedBuilder()
+ .setTitle("Error")
+ .setColor(Color.red)
+ .setDescription("Too few arguments: `::rot <rotN> <text>`")
+ .build()).complete();
+ }
+ int rot = Integer.parseInt(parts[0]) % 26;
+ String message = parts[1];
+
+ return event.getChannel().sendMessage(rotter.encrypt(message, rot * 2, false)).complete();
+ }
+
+ private Message spam(MessageReceivedEvent event) {
+ String[] tmp = event.getMessage().getRawContent().replaceFirst("(?i)^:[:>]spam\\s+", "").split("\\s+", 2);
+ if (tmp.length == 0) {
+ return null;
+ }
+ String rep = "";
+ int repc = 16;
+ if (tmp.length == 1) {
+ rep = tmp[0];
+ }
+ if (tmp.length == 2) {
+ rep = tmp[1];
+ repc = Integer.parseInt(tmp[0]);
+ }
+ if (repc > 0) {
+ StringBuilder txt = new StringBuilder(repc * rep.length());
+ for (int i = 0; i < repc; i++) {
+ txt.append(rep + "\n");
+ }
+ event.getMessage().delete().queue();
+ SimpleLog.getLog("command").info(String.format("Command spam executed: {\"text\":\"%s\",count=%d}", rep, repc));
+ return event.getChannel().sendMessage(txt.toString()).complete();
+ }
+ if (repc < 0) {
+ SimpleLog.getLog("command").info(String.format("Command spam executed with separated messages: {\"text\":\"%s\",count=%d}", rep, -repc));
+ event.getMessage().delete().queue();
+ for (int i = 0; i < -repc; i++) {
+ event.getChannel().sendMessage(rep).queue();
+ }
+ }
+ return null;
+ }
+
+ private Message google(MessageReceivedEvent event) throws UnsupportedEncodingException {
+ String text = event.getMessage().getRawContent().replaceFirst("(?i)^:[:>]google\\s+", "");
+ String raw = text.replace(' ', '+');
+ EmbedBuilder embed = new EmbedBuilder();
+ embed.setColor(Color.red);
+ embed.setTitle(text, "https://google.com/search?q=" + raw);
+ embed.setImage("https://lh4.googleusercontent.com/-v0soe-ievYE/AAAAAAAAAAI/AAAAAAADwG4/8CFr3X3I_Fs/s0-c-k-no-ns/photo.jpg");
+ event.getMessage().delete().queue();
+ SimpleLog.getLog("command").info(String.format("Executed command google: {text:\"%s\"", text));
+ return event.getChannel().sendMessage(embed.build()).complete();
+ }
+
+ private Message time(MessageReceivedEvent event) {
+ EmbedBuilder embed = new EmbedBuilder();
+ embed.setColor(Color.cyan);
+ embed.setTitle("Uhrzeit", "https://www.google.de/search?q=uhrzeit");
+ embed.addField(":timer:", new SimpleDateFormat("HH:mm:ss.SSS").format(new Date()), true);
+ event.getMessage().delete().queue();
+ SimpleLog.getLog("command").info("Executed command time.");
+ Message ret = event.getChannel().sendMessage(embed.build()).complete();
+ return ret;
+ }
+
+ private Message game(MessageReceivedEvent event) {
+ String line = event.getMessage().getRawContent();
+ String args = line.replaceFirst("(?i)^:[>:]game\\s+", "");
+ Game g = Game.of(args);
+ event.getJDA().getPresence().setGame(g);
+ SimpleLog.getLog("command").info(String.format("Executed command game: {name: \"%s\"}", args));
+ event.getMessage().delete().queue();
+ return null;
+ }
+
+
+ private Message cite(MessageReceivedEvent event) {
+ String line = event.getMessage().getRawContent();
+ String[] args = line.replaceFirst("^(?i):[:>]cite\\s+", "").split("\\s+", 2);
+ EmbedBuilder embed = new EmbedBuilder();
+ MessageHistory h = event.getChannel().getHistoryAround(args[0], 2).complete();
+ Message cited = h.getMessageById(args[0]);
+ embed.setAuthor(cited.getAuthor().getName(), "https://discordapp.com", cited.getAuthor().getAvatarUrl());
+ embed.setColor(Color.CYAN);
+ embed.setDescription(cited.getContent());
+ embed.addField("**" + event.getJDA().getSelfUser().getName() + "** kommentiert:", args[1], true);
+ event.getMessage().delete().queue();
+ SimpleLog.getLog("command").info(String.format("Executed command cite: {messageId: %s, description:\"%s\"}", cited.getId(), args[1]));
+ return event.getChannel().sendMessage(embed.build()).complete();
+ }
+
+ private Message embed(MessageReceivedEvent event) {
+
+ String line = event.getMessage().getRawContent();
+ String[] args = line.replaceFirst("^(?i):[>:]embed\\s+", "").split("\\s+", 2);
+ EmbedBuilder embed = new EmbedBuilder();
+ String text = args[1];
+ String color = args[0];
+ Color col = Color.green;
+ if (color.startsWith("#")) {
+ col = new Color(Integer.parseInt(color.replaceFirst("#", ""), 16));
+ } else if (color.matches("^(?i)[a-z]+$")) {
+ Class<Color> clazz = Color.class;
+ try {
+ Field f = clazz.getField(color.toLowerCase());
+ col = (Color) f.get(null);
+ } catch (Exception e) {
+ SimpleLog.getLog("command").info(String.format("Color %s not found.", color));
+ }
+ } else if (color.matches("^[0-9]+$")) {
+ col = new Color(Integer.valueOf(color));
+ } else {
+ SimpleLog.getLog("command").info(String.format("No match found: %s", color));
+ }
+ embed.setColor(col);
+ if (text.contains("\n")) {
+ String[] tmp = text.split("\n", 2);
+ embed.setTitle(tmp[0], config.WEBLINK);
+ embed.setDescription(tmp[1]);
+ } else {
+ embed.setDescription(text);
+ }
+ event.getMessage().delete().queue();
+ SimpleLog.getLog("command").info(String.format("Executed \"embed\" command: {color:\"%s\",text:\"%s\"}", col, text));
+ return event.getChannel().sendMessage(embed.build()).complete();
+ }
+}
diff --git a/src/main/java/de/romjaki/selfbot/Rot.java b/src/main/java/de/romjaki/selfbot/Rot.java
new file mode 100644
index 0000000..5dfb44f
--- /dev/null
+++ b/src/main/java/de/romjaki/selfbot/Rot.java
@@ -0,0 +1,140 @@
+package de.romjaki.selfbot;
+
+import java.util.ArrayList;
+
+/**
+ * COMP 249 - Assignment 4 Q1
+ * Due Friday, April 11, 2014
+ *
+ * Rot-N algorithm, Encryption / Decryption
+ * @version 1.0
+ * */
+public class Rot {
+ private ArrayList<String> letters;
+ private ArrayList<String> encryptedLetters;
+
+ public Rot(){
+ letters = new ArrayList<String>();
+ encryptedLetters = new ArrayList<String>();
+ }
+
+ /**
+ * Encrypt text
+ * @param message Message to encrypt
+ * @param rotN Rot number
+ * @param encryptDigit True or False
+ * @return encrypted message
+ * */
+ public String encrypt(String message, int rotN, boolean encryptDigit){
+ String out = "";
+ char encryptedCurrent;
+ char current;
+ int typeAlpha;
+
+ //clear arrays
+ letters.clear();
+ encryptedLetters.clear();
+
+ for(int i=0; i<message.length();i++){
+ current = message.charAt(i);
+ if((typeAlpha = typeAlpha(current)) != 0){
+ encryptedCurrent = (char) (current + rotN);
+ if(typeAlpha == 1 && encryptedCurrent > 'z' || typeAlpha == 2 && encryptedCurrent > 'Z')
+ encryptedCurrent -= 'z' - 'a' + 1;
+ }else if(encryptDigit && isNumeric(current)){
+ encryptedCurrent = (char) (current + rotN%10);
+ if(encryptedCurrent > '9')
+ encryptedCurrent -= '9' - '0' + 1;
+ } else {
+ encryptedCurrent = current;
+ }
+
+ if((typeAlpha != 0 || (isNumeric(current) && encryptDigit)) && letters.indexOf(current+"") == -1){
+ letters.add(current+"");
+ encryptedLetters.add(encryptedCurrent+"");
+ }
+
+ out += encryptedCurrent;
+ }
+ return out;
+ }
+
+ /**
+ * Decrypt text
+ * @param message Message to decrypt
+ * @param rotN Rot number
+ * @param decryptDigit True or False
+ * @return decrypted message
+ * */
+ public String decrypt(String message, int rotN, boolean decryptDigit){
+ String out = "";
+ char encryptedCurrent;
+ char current;
+ int typeAlpha;
+
+ //clear arrays
+ letters.clear();
+ encryptedLetters.clear();
+
+ for(int i=0; i<message.length();i++){
+ current = message.charAt(i);
+ if((typeAlpha = typeAlpha(current)) != 0){
+ encryptedCurrent = (char) (current - rotN);
+ if(typeAlpha == 1 && encryptedCurrent < 'a' || typeAlpha == 2 && encryptedCurrent < 'A')
+ encryptedCurrent += 'z' - 'a' + 1;
+ }else if(decryptDigit && isNumeric(current)){
+ encryptedCurrent = (char) (current - rotN%10);
+ if(encryptedCurrent < '0')
+ encryptedCurrent += '9' - '0' + 1;
+ } else {
+ encryptedCurrent = current;
+ }
+
+ if((typeAlpha != 0 || (isNumeric(current) && decryptDigit)) && letters.indexOf(current+"") == -1){
+ letters.add(current+"");
+ encryptedLetters.add(encryptedCurrent+"");
+ }
+
+ out += encryptedCurrent;
+ }
+ return out;
+ }
+
+ /**
+ * Check if the character is alphabetic
+ * @param c Character
+ * @return 1 => Lowercase, 2 => Uppercase, 3 => Not alpha
+ * */
+ public int typeAlpha(char c) {
+ if(c >= 'a' && c <= 'z')
+ return 1;
+ if(c >= 'A' && c <= 'Z')
+ return 2;
+ return 0;
+ }
+
+ /**
+ * Check if character is a number
+ * @param c Character
+ * @return true or false
+ * */
+ public boolean isNumeric(char c) {
+ return c >= '0' && c <= '9';
+ }
+
+ /**
+ * Get original letters
+ * @return original letters
+ * */
+ public ArrayList<String> getLetters(){
+ return letters;
+ }
+
+ /**
+ * Get encrypted letters
+ * @return encrypted/decrypted letters
+ * */
+ public ArrayList<String> getEncryptedLetters(){
+ return encryptedLetters;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/romjaki/selfbot/Util.java b/src/main/java/de/romjaki/selfbot/Util.java
new file mode 100644
index 0000000..892ca15
--- /dev/null
+++ b/src/main/java/de/romjaki/selfbot/Util.java
@@ -0,0 +1,34 @@
+package de.romjaki.selfbot;
+
+import net.dv8tion.jda.core.entities.TextChannel;
+import org.jetbrains.annotations.Contract;
+
+/**
+ * Created by RGR on 19.05.2017.
+ */
+public class Util {
+ @Contract(value = " -> fail", pure = true)
+ private Util() {
+ Util.singleton(Util.class);
+ }
+
+ @Contract(pure = true, value = "_ -> fail")
+ public static void singleton(Class<?> clazz) {
+ throw new Error("No " + clazz.toGenericString() + " instances for you!");
+ }
+
+ @Contract(pure = true, value = "null -> fail")
+ public static boolean isBotChannel(TextChannel channel) {
+ return channel.getName().toLowerCase().contains("bot");
+ }
+
+
+ @Contract(pure = true, value = "null -> fail ; !null -> !null")
+ public static String escape(String join) {
+ return join.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n").replace("\t", "\\t");
+ }
+
+ public static int clamp(int min, int max, int val) {
+ return val < min ? min : (val > max ? max : val);
+ }
+}