diff options
author | mdway <romangraef@gmail.com> | 2017-06-05 19:17:57 +0200 |
---|---|---|
committer | mdway <romangraef@gmail.com> | 2017-06-05 19:17:57 +0200 |
commit | 816d802b133cbc3f9eeb7d9cd2f12dcadf95ed06 (patch) | |
tree | 91acc08e65bcd9b9e1c4e08adaaae59405c11441 /src | |
download | Selfbot-816d802b133cbc3f9eeb7d9cd2f12dcadf95ed06.tar.gz Selfbot-816d802b133cbc3f9eeb7d9cd2f12dcadf95ed06.tar.bz2 Selfbot-816d802b133cbc3f9eeb7d9cd2f12dcadf95ed06.zip |
Initial commit
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/META-INF/MANIFEST.MF | 3 | ||||
-rw-r--r-- | src/main/java/de/romjaki/selfbot/Config.java | 85 | ||||
-rw-r--r-- | src/main/java/de/romjaki/selfbot/Configurable.java | 14 | ||||
-rw-r--r-- | src/main/java/de/romjaki/selfbot/Main.java | 34 | ||||
-rw-r--r-- | src/main/java/de/romjaki/selfbot/MessageListener.java | 206 | ||||
-rw-r--r-- | src/main/java/de/romjaki/selfbot/Rot.java | 140 | ||||
-rw-r--r-- | src/main/java/de/romjaki/selfbot/Util.java | 34 |
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); + } +} |