Initial commit

This commit is contained in:
Anthony committed 2018-02-09 22:19:39 -05:00
commit c242f587a8
49 files changed
+3686

No files matched your search

+72
View File
@@ -0,0 +1,72 @@
package netneutrality;
import java.io.IOException;
import javax.security.auth.login.LoginException;
import net.dv8tion.jda.core.AccountType;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.entities.Game;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBSettings;
import netneutrality.handler.ConsoleHandler;
import netneutrality.handler.EditHandler;
import netneutrality.handler.LogHandler;
import netneutrality.handler.NewCommandListener;
import netneutrality.http.server.WebApi;
import netneutrality.utils.Settings;
public class MusicBot {
private static JDA jda;
public static void main(String[] args) {
DBController.init();
String token = ((DBSettings) DBController.get("settings")).getToken();
try {
jda = new JDABuilder(AccountType.BOT).setToken(token).buildBlocking();
} catch (LoginException | IllegalArgumentException | InterruptedException e) {
LogHandler.log(e);
}
jda.getPresence().setGame(Game.watching("me load..."));
jda.addEventListener(new NewCommandListener(), new EditHandler());
Settings.setCreator(jda.getUserById("194270171727265792"));
Settings.setOwnerGuild(jda.getGuildById("195386426400047105"));
WebApi webserver = new WebApi();
jda.getPresence().setGame(Game.watching("rape"));
Thread status = new Thread(new StatusThread(jda.getPresence()));
// status.start();
ConsoleHandler consoleInput = new ConsoleHandler();
try {
switch (consoleInput.init()) {
case "quit":
System.out.println("Shutting down...");
jda.shutdown();
System.out.println("Shutdown complete");
System.exit(0);
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static JDA getJDA() {
return jda;
}
public static void disconnect() {
jda.shutdown();
}
}
@@ -0,0 +1,33 @@
package netneutrality;
import net.dv8tion.jda.core.OnlineStatus;
import net.dv8tion.jda.core.managers.Presence;
public class StatusThread implements Runnable {
private Presence status;
public StatusThread(Presence pr) {
this.status = pr;
}
@Override
public void run() {
try {
while (true) {
status.setStatus(OnlineStatus.ONLINE);
Thread.sleep(10000);
status.setStatus(OnlineStatus.IDLE);
Thread.sleep(10000);
status.setStatus(OnlineStatus.DO_NOT_DISTURB);
Thread.sleep(10000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@@ -0,0 +1,62 @@
package netneutrality.command;
import java.util.Arrays;
import java.util.List;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
public abstract class AbstractCommand {
public AbstractCommand() {
}
/**
* @return if the command needs administrator privilege
*/
public abstract boolean needAdmin();
/**
* @return if the command is enabled
*/
public abstract boolean isEnabled();
/**
* The command name that a user will write in a channel
*
* @return the name of the command.
*/
public abstract String getCommand();
/**
* @return all the aliases the command has
*/
public abstract String[] getAlias();
public abstract String getUsage();
public abstract Visibility getVisibility();
/**
* @param event
* @param args the arguments to the command
* @return
*/
public abstract String execute(MessageReceivedEvent event, String args);
public int countArgs(String command) {
if (command.isEmpty())
return 0;
List<String> args = Arrays.asList(command.split(" "));
return args.size();
}
public String parseArgs(String command, int arg) {
if (command.isEmpty())
return "";
List<String> args = Arrays.asList(command.split(" "));
return args.get(arg);
}
}
@@ -0,0 +1,29 @@
package netneutrality.command;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.entities.PrivateChannel;
import net.dv8tion.jda.core.entities.TextChannel;
public enum Visibility {
PRIVATE, CHANNEL, BOTH;
public static boolean check(MessageChannel channel, Visibility v) {
if (v == BOTH && channel instanceof TextChannel || channel instanceof PrivateChannel)
return true;
if (v == PRIVATE && channel instanceof PrivateChannel)
return true;
if (v == CHANNEL && channel instanceof TextChannel)
return true;
return false;
}
}
@@ -0,0 +1,89 @@
package netneutrality.command.basic;
import java.awt.Color;
import java.util.HashMap;
import java.util.function.Consumer;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.MessageBuilder;
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.entities.PrivateChannel;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
import netneutrality.utils.Settings;
public class HelpCommand extends AbstractCommand {
private String help = "";
public HelpCommand() {
}
@Override
public String execute(MessageReceivedEvent event, String args) {
EmbedBuilder embed = new EmbedBuilder();
embed.setColor(Color.green);
embed.addField("Commands for Net Neutrality", help, false);
event.getTextChannel().sendMessage(new MessageBuilder().append(event.getAuthor()).append(" help has been sent your way!").build()).queue();
event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage(embed.build()).queue());
return null;
}
public void sendHelp(HashMap<String, AbstractCommand> commands, HashMap<String, AbstractCommand> alias, User user, MessageChannel channel) {
for (AbstractCommand command : commands.values()) {
if (command.getUsage() != null)
help += Settings.PREFIX + command.getCommand() + " (: " + command.getUsage() + "\n";
}
EmbedBuilder embed = new EmbedBuilder();
embed.setColor(Color.green);
embed.addField("Commands for Net Neutrality", help, false);
if (channel instanceof TextChannel)
channel.sendMessage(new MessageBuilder().append(user).append(" help has been sent your way!").build()).queue();
user.openPrivateChannel().queue(t -> t.sendMessage(embed.build()).queue());
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "help";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[0];
}
@Override
public String getUsage() {
return "Get every command with its usage";
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
}
@@ -0,0 +1,55 @@
package netneutrality.command.basic;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
public class PingCommand extends AbstractCommand {
public PingCommand() {
}
@Override
public String execute(MessageReceivedEvent event, String args) {
if (countArgs(args) == 0)
event.getChannel().sendMessage("Pong!").queue();
return null;
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "ping";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[0];
}
@Override
public String getUsage() {
return "Pong!";
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
}
@@ -0,0 +1,103 @@
package netneutrality.command.crypto;
import java.io.IOException;
import java.util.function.Consumer;
import netneutrality.command.Visibility;
import org.json.JSONException;
import org.json.JSONObject;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.http.WebModule;
public class BitcoinPriceCommand extends AbstractCommand {
private String currency = "USD";
private String currencyUrl = "https://api.coindesk.com/v1/bpi/currentprice/";
private String price;
public BitcoinPriceCommand() {
this.currency = "USD";
}
private String messageBuilder(String price) {
String newPrice = price.substring(0, price.indexOf("."));
return "The current bitcoin price in " + this.currency + " is " + newPrice + "$";
}
@Override
public String execute(MessageReceivedEvent event, String args) throws JSONException, ArrayIndexOutOfBoundsException {
if (countArgs(args) == 1) {
if (Currency.isCurrency(args.toUpperCase()))
this.currency = args.toUpperCase();
else {
event.getTextChannel().sendMessage("Please enter a valid currency").queue();
return null;
}
}
event.getTextChannel().sendMessage("Retreiving price, please wait...").queue(new Consumer<Message>() {
@Override
public void accept(Message t) {
try {
WebModule bitcoinHttp = new WebModule(currencyUrl + currency + ".json").request();
JSONObject bpi = bitcoinHttp.getAsObject().getJSONObject("bpi");
price = bpi.getJSONObject(currency.toUpperCase()).getString("rate");
} catch (IOException | RuntimeException e) {
e.printStackTrace();
t.editMessage("Error getting bitcoin price!").queue();
}
t.editMessage(messageBuilder(price)).queue();
}
});
return null;
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "bitcoin";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[] {"btc"};
}
@Override
public String getUsage() {
return "Get the bitcoin price";
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
}
@@ -0,0 +1,40 @@
package netneutrality.command.crypto;
public enum Currency {
AED("AED"), AFN("AFN"), ALL("ALL"), AMD("AMD"), ANG("ANG"), AOA("AOA"), ARS("ARS"), AUD("AUD"), AWG("AWG"), AZN("AZN"), BAM("BAM"), BBD("BBD"),
BDT("BDT"), BGN("BGN"), BHD("BHD"), BIF("BIF"), BMD("BMD"), BND("BND"), BOB("BOB"), BOV("BOV"), BRL("BRL"), BSD("BSD"), BTN("BTN"), BWP("BWP"),
BYN("BYN"), BYR("BYR"), BZD("BZD"), CAD("CAD"), CDF("CDF"), CHE("CHE"), CHF("CHF"), CHW("CHW"), CLF("CLF"), CLP("CLP"), CNY("CNY"), COP("COP"),
COU("COU"), CRC("CRC"), CUC("CUC"), CUP("CUP"), CVE("CVE"), CZK("CZK"), DJF("DJF"), DKK("DKK"), DOP("DOP"), DZD("DZD"), EGP("EGP"), ERN("ERN"),
ETB("ETB"), EUR("EUR"), FJD("FJD"), FKP("FKP"), GBP("GBP"), GEL("GEL"), GHS("GHS"), GIP("GIP"), GMD("GMD"), GNF("GNF"), GTQ("GTQ"), GYD("GYD"),
HKD("HKD"), HNL("HNL"), HRK("HRK"), HTG("HTG"), HUF("HUF"), IDR("IDR"), ILS("ILS"), INR("INR"), IQD("IQD"), IRR("IRR"), ISK("ISK"), JMD("JMD"),
JOD("JOD"), JPY("JPY"), KES("KES"), KGS("KGS"), KHR("KHR"), KMF("KMF"), KPW("KPW"), KRW("KRW"), KWD("KWD"), KYD("KYD"), KZT("KZT"), LAK("LAK"),
LBP("LBP"), LKR("LKR"), LRD("LRD"), LSL("LSL"), LYD("LYD"), MAD("MAD"), MDL("MDL"), MGA("MGA"), MKD("MKD"), MMK("MMK"), MNT("MNT"), MOP("MOP"),
MRO("MRO"), MUR("MUR"), MVR("MVR"), MWK("MWK"), MXN("MXN"), MXV("MXV"), MYR("MYR"), MZN("MZN"), NAD("NAD"), NGN("NGN"), NIO("NIO"), NOK("NOK"),
NPR("NPR"), NZD("NZD"), OMR("OMR"), PAB("PAB"), PEN("PEN"), PGK("PGK"), PHP("PHP"), PKR("PKR"), PLN("PLN"), PYG("PYG"), QAR("QAR"), RON("RON"),
RSD("RSD"), RUB("RUB"), RWF("RWF"), SAR("SAR"), SBD("SBD"), SCR("SCR"), SDG("SDG"), SEK("SEK"), SGD("SGD"), SHP("SHP"), SLL("SLL"), SOS("SOS"),
SRD("SRD"), SSP("SSP"), STD("STD"), SYP("SYP"), SZL("SZL"), THB("THB"), TJS("TJS"), TMT("TMT"), TND("TND"), TOP("TOP"), TRY("TRY"), TTD("TTD"),
TWD("TWD"), TZS("TZS"), UAH("UAH"), UGX("UGX"), USD("USD"), USN("USN"), UYI("UYI"), UYU("UYU"), UZS("UZS"), VEF("VEF"), VND("VND"), VUV("VUV"),
WST("WST"), XAF("XAF"), XAG("XAG"), XAU("XAU"), XBA("XBA"), XBB("XBB"), XBC("XBC"), XBD("XBD"), XCD("XCD"), XDR("XDR"), XFU("XFU"), XOF("XOF"),
XPD("XPD"), XPF("XPF"), XPT("XPT"), XSU("XSU"), XTS("XTS"), XUA("XUA"), XXX("XXX"), YER("YER"), ZAR("ZAR"), ZMW("ZMW");
private String iso4217Code;
Currency(String code) {
this.iso4217Code = code;
}
@Override
public String toString() {
return iso4217Code;
}
public static boolean isCurrency(String str) {
for (Currency c : Currency.values()) {
if (c.name().equals(str.toUpperCase()))
return true;
}
return false;
}
}
@@ -0,0 +1,95 @@
package netneutrality.command.crypto;
import java.io.IOException;
import java.util.function.Consumer;
import netneutrality.command.Visibility;
import org.json.JSONException;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.http.WebModule;
public class EthereumPriceCommand extends AbstractCommand {
private String currency = "USD";
private String currencyUrl = "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=";
private String price = "";
public EthereumPriceCommand() {
this.currency = "USD";
}
private String messageBuilder(String price) {
return "The current ethereum price in " + this.currency + " is " + price + "$";
}
@Override
public String execute(MessageReceivedEvent event, String args) throws JSONException, ArrayIndexOutOfBoundsException {
if (countArgs(args) == 1) {
if (Currency.isCurrency(args.toUpperCase()))
this.currency = args.toUpperCase();
else {
event.getTextChannel().sendMessage("Please enter a valid currency").queue();
return null;
}
}
event.getTextChannel().sendMessage("Retreiving price, please wait...").queue(new Consumer<Message>() {
@Override
public void accept(Message t) {
try {
WebModule ethereumHttp = new WebModule(currencyUrl + currency.toUpperCase()).request();
price = Double.toString(ethereumHttp.getAsObject().getDouble(currency));
} catch (IOException | RuntimeException e) {
e.printStackTrace();
t.editMessage("Error getting ethereum price!").queue();
}
t.editMessage(messageBuilder(price)).queue();
}
});
return null;
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "ethereum";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[] {"eth"};
}
@Override
public String getUsage() {
return "Get the ethereum price";
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
}
@@ -0,0 +1,94 @@
package netneutrality.command.crypto;
import java.io.IOException;
import java.util.function.Consumer;
import netneutrality.command.Visibility;
import org.json.JSONException;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.http.WebModule;
public class LitecoinPriceCommand extends AbstractCommand {
private String currency = "USD";
private String currencyUrl = "https://api.coinmarketcap.com/v1/ticker/litecoin/?convert=";
private String price;
public LitecoinPriceCommand() {
this.currency = "USD";
}
private String messageBuilder(String price) {
return "The current litecoin price in " + this.currency + " is " + price + "$";
}
@Override
public String execute(MessageReceivedEvent event, String args) throws ArrayIndexOutOfBoundsException, JSONException {
if (countArgs(args) == 1) {
if (Currency.isCurrency(args.toUpperCase()))
this.currency = args;
else {
event.getTextChannel().sendMessage("Please enter a valid currency").queue();
return null;
}
}
event.getTextChannel().sendMessage("Retreiving price, please wait...").queue(new Consumer<Message>() {
@Override
public void accept(Message t) {
try {
WebModule litecoinHttp = new WebModule(currencyUrl + currency).request();
price = litecoinHttp.getAsArray().getJSONObject(0).getString("price_" + currency.toLowerCase());
} catch (IOException | RuntimeException e) {
e.printStackTrace();
t.editMessage("Error getting litecoin price!").queue();
}
t.editMessage(messageBuilder(price)).queue();
}
});
return null;
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "litecoin";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[] {"ltc"};
}
@Override
public String getUsage() {
return "Get the litecoin price";
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
}
@@ -0,0 +1,135 @@
package netneutrality.command.message;
import java.util.ArrayList;
import java.util.function.Consumer;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBBlacklist;
import netneutrality.db.models.MBlacklist;
import netneutrality.handler.LogHandler;
public class BlacklistCommand extends AbstractCommand {
public BlacklistCommand() {
// TODO Auto-generated constructor stub
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "blacklist";
}
@Override
public String[] getAlias() {
return new String[] {"bl"};
}
@Override
public String getUsage() {
return "Manages the blacklist of your server.";
}
@Override
public Visibility getVisibility() {
return Visibility.CHANNEL;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
if (countArgs(args) > 0 && countArgs(args) < 3) {
String word = (countArgs(args) == 2 ? parseArgs(args, 1) : "");
switch (parseArgs(args, 0)) {
case "get":
event.getTextChannel().sendMessage("Retreiving list, please wait...").queue(t -> {
String out = "";
ArrayList<MBlacklist> blacklist = null;
try {
blacklist = ((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(event.getGuild().getId());
for (MBlacklist bl : blacklist) {
out += bl.getWord() + " -> " + (bl.isEnabled() ? "enabled" : "disabled") + "\n";
}
} catch (RuntimeException e) {
e.printStackTrace();
}
t.editMessage("List of blacklisted words for this server [" + event.getGuild().getName() + "] :\n" + (blacklist.isEmpty() ? "No word found" : out)).queue();
});
break;
case "add":
try {
((DBBlacklist) DBController.get("blacklist")).add(new MBlacklist(word, true, event.getAuthor().getId(), event.getGuild().getId()));
event.getTextChannel().sendMessage("Added the word \"" + word + "\" to the blacklist.").queue();
} catch (RuntimeException e) {
event.getTextChannel().sendMessage("Error adding \"" + word + "\" to the blacklist. It's already blacklisted!").queue();
LogHandler.log(e);
}
break;
case "remove":
try {
((DBBlacklist) DBController.get("blacklist")).delete(word, event.getGuild().getId());
event.getTextChannel().sendMessage("Removed the word \"" + word + "\" from the blacklist.").queue();
} catch (RuntimeException e) {
LogHandler.log(e);
event.getTextChannel().sendMessage("Error removing \"" + word + "\" from the blacklist").queue();
}
break;
case "disable":
try {
((DBBlacklist) DBController.get("blacklist")).disable(word, event.getGuild().getId());
event.getTextChannel().sendMessage("Succesfully disabled the word \"" + word + "\" from the blacklist!").queue();
} catch (NullPointerException e) {
LogHandler.log(e);
event.getTextChannel().sendMessage("Error disabling \"" + word + "\", it's not blacklisted!").queue();
}
break;
case "enable":
try {
((DBBlacklist) DBController.get("blacklist")).enable(word, event.getGuild().getId());
event.getTextChannel().sendMessage("Succesfully enabled the word \"" + word + "\" from the blacklist!").queue();
} catch (NullPointerException e) {
event.getTextChannel().sendMessage("Error enabling \"" + word + "\", it's not blacklisted!").queue();
LogHandler.log(e);
}
break;
}
}
return null;
}
}
@@ -0,0 +1,58 @@
package netneutrality.command.message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
import netneutrality.utils.ChannelFunction;
public class PruneCommand extends AbstractCommand {
public PruneCommand() {
// TODO Auto-generated constructor stub
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "prune";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[] {"purge"};
}
@Override
public String getUsage() {
return "Prune n messages from the channel you are currently on";
}
@Override
public Visibility getVisibility() {
return Visibility.CHANNEL;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
if (countArgs(args) == 1)
ChannelFunction.bulkDeleteMessage(event.getTextChannel(), Integer.parseInt(args));
else
event.getTextChannel().sendMessage("Failed to delete messages!").queue();
return null;
}
}
@@ -0,0 +1,120 @@
package netneutrality.command.specific;
import java.awt.Color;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.function.Consumer;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.entities.PrivateChannel;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBMessage;
import netneutrality.db.models.MMessage;
import netneutrality.utils.Settings;
public class DatabaseCommand extends AbstractCommand {
public DatabaseCommand() {
// TODO Auto-generated constructor stub
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "database";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[] { "db" };
}
@Override
public String getUsage() {
return null;
}
@Override
public Visibility getVisibility() {
return Visibility.CHANNEL;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
if (!event.getAuthor().getDiscriminator().equals(Settings.getCreator().getDiscriminator()))
return null;
if (countArgs(args) > 0) {
switch (parseArgs(args, 0)) {
case "message":
if (countArgs(args) > 1) {
event.getMessage().delete().queue();
MMessage message = ((DBMessage) DBController.get("message")).getMessage(parseArgs(args, 1));
if (message != null) {
EmbedBuilder embed = new EmbedBuilder();
embed.setColor(Color.BLUE);
embed.setTimestamp(
DateTimeFormatter.ofPattern(Settings.DATETIMEFORMAT).parse(message.getDateSent()));
embed.setFooter("Guild : " + message.getServerName() + " | ID : " + message.getMessageId(), null);
embed.setDescription(
"Message from " + message.getSender() + " on the channel " + message.getChannelName());
embed.addField("Message: ", "" + message.getMessage(), false);
event.getTextChannel().sendMessage(embed.build()).queue();
} else {
User user = event.getJDA().getUserById(parseArgs(args, 1));
if (user != null) {
ArrayList<MMessage> messages = ((DBMessage) DBController.get("message"))
.getMessagesFromUser(user.getName(), event.getGuild().getName(), 10);
EmbedBuilder embed = new EmbedBuilder();
embed.setColor(Color.BLUE);
embed.setTimestamp(OffsetDateTime.now());
for (int i = 0; i < messages.size(); i++) {
embed.addField(
"Message in channel \"" + messages.get(i).getChannelName() + "\" sent on "
+ messages.get(i).getDateSent(),
"" + messages.get(i).getMessage(), false);
}
embed.setFooter("Guild : " + event.getGuild().getName(), null);
event.getAuthor().openPrivateChannel().queue(new Consumer<PrivateChannel>() {
@Override
public void accept(PrivateChannel t) {
t.sendMessage(embed.build()).queue();
}
});
}
}
}
break;
}
}
return null;
}
}
@@ -0,0 +1,49 @@
package netneutrality.command.specific;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
public class LoggingCommand extends AbstractCommand {
public LoggingCommand() {
}
@Override
public boolean needAdmin() {
return true;
}
@Override
public boolean isEnabled() {
return false;
}
@Override
public String getCommand() {
return "logging";
}
@Override
public String[] getAlias() {
return new String[0];
}
@Override
public String getUsage() {
return null;
}
@Override
public Visibility getVisibility() {
return Visibility.CHANNEL;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
return null;
}
}
@@ -0,0 +1,55 @@
package netneutrality.command.specific;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
public class NiggerCommand extends AbstractCommand {
public NiggerCommand() {
}
@Override
public String execute(MessageReceivedEvent event, String args) {
event.getMessage().delete().queue();
event.getTextChannel().sendMessage("Not in my christian server").queue();
return null;
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return "nigger";
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return new String[0];
}
@Override
public String getUsage() {
return null;
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
}
@@ -0,0 +1,103 @@
package netneutrality.command.specific;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBSettings;
import netneutrality.db.models.SellyOrder;
import netneutrality.http.Selly;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class SellyCommand extends AbstractCommand {
public SellyCommand() {
}
@Override
public boolean needAdmin() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String getCommand() {
return "selly";
}
@Override
public String[] getAlias() {
return new String[0];
}
@Override
public String getUsage() {
return null;
}
@Override
public Visibility getVisibility() {
return Visibility.PRIVATE;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
Map<String, SellyOrder> orders = new HashMap<>();
String sellyEmail = ((DBSettings) DBController.get("settings")).getSellyEmail();
String sellyKey = ((DBSettings) DBController.get("settings")).getSellyKey();
Selly selly = new Selly(sellyEmail, sellyKey);
JSONArray ordersArray = selly.getOrders();
for (int i = 0; i < ordersArray.length(); i++) {
JSONObject order = ordersArray.getJSONObject(i);
orders.put(order.getString("id"), new SellyOrder(order.getString("id"), order.getString("product_id"), order.getString("email"), order.getString("ip_address"),
Float.parseFloat(order.getString("value")), order.getString("currency"), order.getString("gateway"), order.getInt("risk_level"), order.getInt("status"),
order.getInt("crypto_value"), order.getString("crypto_address"), Float.parseFloat(order.getString("usd_value")), order.getString("created_at")));
}
System.out.println(selly.getProducts().toString());
if (countArgs(args) > 1) {
String email = parseArgs(args, 0);
String id = parseArgs(args, 1);
if (orders.containsKey(id)) {
SellyOrder order = orders.get(id);
if (email.equals(order.getEmail())) {
if (order.getStatus() == 100) {
event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage("success").queue());
} else
event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage("not completed").queue());
} else
event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage("wrong email").queue());
} else
event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage("order doesn't exist").queue());
} else
event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage("usage : $selly <email> <order_id>").queue());
return null;
}
}
@@ -0,0 +1,54 @@
package netneutrality.command.specific;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
public class ShutdownCommand extends AbstractCommand {
public ShutdownCommand() {
// TODO Auto-generated constructor stub
}
@Override
public boolean needAdmin() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return false;
}
@Override
public String getCommand() {
// TODO Auto-generated method stub
return null;
}
@Override
public String[] getAlias() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getUsage() {
return null;
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
event.getJDA().shutdown();
System.exit(0);
return null;
}
}
@@ -0,0 +1,59 @@
package netneutrality.command.specific;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import netneutrality.command.AbstractCommand;
import netneutrality.command.Visibility;
import netneutrality.utils.MessageFunction;
import netneutrality.utils.Settings;
public class TestCommand extends AbstractCommand {
public TestCommand() {
}
@Override
public boolean needAdmin() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String getCommand() {
return "test";
}
@Override
public String[] getAlias() {
return new String[0];
}
@Override
public String getUsage() {
return null;
}
@Override
public Visibility getVisibility() {
return Visibility.BOTH;
}
@Override
public String execute(MessageReceivedEvent event, String args) {
if (event.getAuthor().getDiscriminator().equals(Settings.getCreator().getDiscriminator())) {
MessageFunction.isStartingWithMention(event.getMessage());
}
return null;
}
}
@@ -0,0 +1,27 @@
package netneutrality.db;
import java.sql.SQLException;
public abstract class AbstractController {
protected MysqlDatabase database;
/**
* The controller name to be used in {@link DBController} get(String controller) method
*
* @return String
*/
public abstract String getControllerName();
public void reconnect() throws SQLException {
database.reconnect();
}
public boolean isClosed() throws SQLException {
return database.isClosed();
}
protected void setDatabase(MysqlDatabase database) {
this.database = database;
}
}
@@ -0,0 +1,105 @@
package netneutrality.db;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Set;
import org.reflections.Reflections;
public class DBController {
/**
* A map that contains all the controllers currently loaded
*/
private static HashMap<String, AbstractController> controllers = new HashMap<>();
private static MysqlDatabase database = new MysqlDatabase("discord");
/**
* @param controller The name of the controller as defined in the {@link AbstractController#getControllerName()}'s method
* @return {@link AbstractController} The class with an AbstractController type
*/
public static AbstractController get(String controller) {
if (controllers.isEmpty())
init();
if (controllers.containsKey(controller)) {
try {
if (controllers.get(controller).isClosed()) {
System.out.println("Reconnecting to database..");
controllers.get(controller).reconnect();
}
} catch (SQLException e) {
e.printStackTrace();
}
return controllers.get(controller);
}
return null;
}
public static MysqlDatabase get() {
try {
if (database.isClosed()) {
System.out.println("Reconnecting to database..");
database.reconnect();
}
} catch (SQLException e) {
e.printStackTrace();
}
return database;
}
public static void shutdown() throws SQLException {
database.close();
controllers.forEach((k,v) -> {
try {
v.database.close();
} catch (SQLException e) {
e.printStackTrace();
}
});
}
/**
* Optional, will be called if the method {@link #get(String) get()} is used
*/
public static void init() {
loadControllers();
}
/**
* Loads all the controllers which extends {@link AbstractController}
*/
public static void loadControllers() {
System.out.println("Loading databases controllers..");
Reflections reflections = new Reflections("netneutrality.db.controllers");
Set<Class<? extends AbstractController>> classes = reflections.getSubTypesOf(AbstractController.class);
for (Class<? extends AbstractController> s : classes) {
try {
if (Modifier.isAbstract(s.getModifiers())) {
continue;
}
AbstractController c = s.getConstructor().newInstance();
c.setDatabase(database);
if (!controllers.containsKey(c.getControllerName())) {
controllers.put(c.getControllerName(), c);
System.out.println("Loaded controller: " + c.getControllerName());
}
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e) {
e.printStackTrace();
}
}
}
}
@@ -0,0 +1,51 @@
package netneutrality.db;
import java.sql.Connection;
import java.sql.SQLException;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
public class MysqlConnector {
protected String dbName;
protected String dbUser;
protected String dbHost;
protected String dbPass;
private Connection c;
public MysqlConnector(String dbName, String dbUser, String dbHost, String dbPass) {
this.dbName = dbName;
this.dbUser = dbUser;
this.dbHost = dbHost;
this.dbPass = dbPass;
}
/**
* Connect to a MySQL instance using the provided informations
*
* @return {@link MysqlConnector}
* @throws SQLException
*/
public MysqlConnector connect() throws SQLException {
MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
dataSource.setUser(dbUser);
dataSource.setPassword(dbPass);
dataSource.setServerName(dbHost);
dataSource.setPort(3306);
dataSource.setDatabaseName(dbName);
dataSource.setAutoReconnect(true);
dataSource.setAutoReconnectForConnectionPools(true);
c = dataSource.getConnection();
return this;
}
/**
* Get the MySQL connection. Must call {@link #connect()} beforehand.
*
* @return {@link Connection}
*/
public Connection getConnection() {
return c;
}
}
@@ -0,0 +1,269 @@
package netneutrality.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Calendar;
import netneutrality.MusicBot;
import netneutrality.db.models.RowModel;
import netneutrality.db.models.TableModel;
import netneutrality.exceptions.UnimplementedParameterException;
public class MysqlDatabase {
private Connection connection;
private PreparedStatement query = null;
private String prepareString;
private int nbRow;
private String dbName;
public MysqlDatabase(String dbName) {
this.dbName = dbName;
try {
System.out.println("Connecting to database...");
connection = new MysqlConnector(dbName, "root", "localhost", "").connect().getConnection();
} catch (SQLException e) {
System.err.println("Error connecting to database. Shutting down..");
MusicBot.disconnect();
System.exit(0);
}
}
/**
* Execute a simple query without any parameters.
* Example : SELECT * FROM table
*
* @param query The SQL query to execute
* @return {@link ResultSet}
* @throws SQLException
*/
public ResultSet query(String query) throws SQLException {
Statement stmt = connection.createStatement();
return stmt.executeQuery(query);
}
/**
* Execute an UPDATE statement with the specified parameters.
* In the SQL query, where there is a parameter to be included, you need to replace it with ?
*
* @param sql The SQL query to execute
* @param params The parameters to include in the query
* @return an integer of how many row were affected
* @throws SQLException
*/
public int update(String sql, Object... params) throws SQLException {
prepareString = sql;
query = connection.prepareStatement(sql);
resolveParameters(query, params);
return query.executeUpdate();
}
/**
* Execute an INSERT statement with the specified parameters.
* In the SQL query, where there is a parameter to be included, you need to replace it with ?
*
* @param sql The SQL query to execute
* @param params The parameters to include in the query
* @return an integer of how many row were affected
* @throws SQLException
*/
public int insert(String sql, Object... params) throws SQLException {
prepareString = sql;
query = connection.prepareStatement(sql);
resolveParameters(query, params);
return query.executeUpdate();
}
/**
* Execute a DELETE statement with the specified parameters.
* In the SQL query, where there is a parameter to be included, you need to replace it with ?
*
* @param sql The SQL query to execute
* @param params The parameters to include in the query
* @return an integer of how many row were affected
* @throws SQLException
*/
public int delete(String sql, Object... params) throws SQLException {
prepareString = sql;
query = connection.prepareStatement(sql);
resolveParameters(query, params);
return query.executeUpdate();
}
/**
* Execute a SELECT statement with the specified parameters.
* In the SQL query, where there is a parameter to be included, you need to replace it with ?
*
* @param sql The SQL query to execute
* @param params The parameters to include in the query
* @return a ResultSet object, which can be converted to an array using {@link #convertToArray(ResultSet)}
* @throws SQLException
*/
public ResultSet prepareAndExecute(String sql, Object... params) throws SQLException {
prepareString = sql;
query = connection.prepareStatement(sql);
resolveParameters(query, params);
return query.executeQuery();
}
// https://github.com/Kaaz/DiscordBot/blob/master/src/main/java/emily/db/MySQLAdapter.java#resolveParameters
private void resolveParameters(PreparedStatement query, Object... params) throws SQLException {
int index = 1;
for (Object p : params) {
if (p instanceof String) {
query.setString(index, (String) p);
} else if (p instanceof Integer) {
query.setInt(index, (int) p);
} else if (p instanceof Boolean) {
query.setBoolean(index, (Boolean) p);
} else if (p instanceof Long) {
query.setLong(index, (Long) p);
} else if (p instanceof Double) {
query.setDouble(index, (double) p);
} else if (p instanceof java.sql.Date) {
java.sql.Date d = (java.sql.Date) p;
query.setDate(index, d);
} else if (p instanceof java.util.Date) {
java.util.Date d = (java.util.Date) p;
Timestamp ts = new Timestamp(d.getTime());
query.setTimestamp(index, ts);
} else if (p instanceof Calendar) {
Calendar cal = (Calendar) p;
Timestamp ts = new Timestamp(cal.getTimeInMillis());
query.setTimestamp(index, ts);
} else if (p == null) {
query.setNull(index, Types.NULL);
} else {
throw new UnimplementedParameterException(p, index);
}
index++;
}
}
/**
* Close the MySQL connection
*
* @throws SQLException
*/
public void close() throws SQLException {
connection.close();
}
/**
* Recreate the MySQL connection.
*
* @throws SQLException
*/
public void reconnect() throws SQLException {
connection = new MysqlConnector(dbName, "root", "localhost", "").connect().getConnection();
}
/**
* Check if the database is closed.
*
* @return the connection status
* @throws SQLException
*/
public boolean isClosed() throws SQLException {
return connection.isClosed();
}
/**
* Convert a ResultSet object into an array.
* <br>
* <br>The first row of the array is the names of the columns.
* <br>The other rows are their corresponding value
*
*
* @param rs The ResultSet returned by the SELECT query
* @return an array of Object with the table structure
* @throws SQLException
*/
public Object[][] convertToArray(ResultSet rs) throws SQLException {
nbRow = getNbRowFromTable(prepareString);
ResultSetMetaData metadata = rs.getMetaData();
Object array[][] = new Object[nbRow + 1][metadata.getColumnCount()];
for (int i = 1; i < metadata.getColumnCount() + 1; i++) {
array[0][i - 1] = metadata.getColumnName(i);
}
int pos = 1;
while (rs.next()) {
for (int i = 1; i < rs.getMetaData().getColumnCount() + 1; i++) {
array[pos][i - 1] = rs.getObject(i);
}
pos++;
}
try {
if (array[1][0] == null)
nbRow = 0;
} catch (ArrayIndexOutOfBoundsException e) {
}
rs.getStatement().close();
return array;
}
public TableModel convertToTableModel(ResultSet rs) throws SQLException {
TableModel table = new TableModel();
nbRow = getNbRowFromTable(prepareString);
ResultSetMetaData metadata = rs.getMetaData();
for (int i = 1; i < metadata.getColumnCount() + 1; i++) {
table.addColumn(metadata.getColumnName(i));
}
while (rs.next()) {
RowModel row = new RowModel();
for (int i = 0; i < metadata.getColumnCount(); i++) {
row.addColumnToRow(rs.getObject(i + 1));
}
table.addRow(row);
}
return table;
}
/**
* Only usable when @link {@link #prepareAndExecute(String, Object...) prepareAndExecute()} is called
*
* @return the number of row
*/
public int getNbRow() {
return nbRow;
}
private String findTable(String sql) {
int indexFrom = sql.indexOf("FROM") + 5;
int indexWhere = sql.indexOf("WHERE") - 1;
if (indexWhere < 0) {
return sql.substring(indexFrom, indexFrom + 4);
}
return sql.substring(indexFrom, indexWhere);
}
private int getNbRowFromTable(String sql) throws SQLException {
ResultSet nbRowRs = query("SELECT COUNT(*) FROM " + findTable(sql));
if (nbRowRs.next())
return nbRowRs.getInt(1);
return 0;
}
}
@@ -0,0 +1,148 @@
package netneutrality.db.controllers;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import netneutrality.db.AbstractController;
import netneutrality.db.DBController;
import netneutrality.db.MysqlDatabase;
import netneutrality.db.models.MBlacklist;
import netneutrality.db.models.TableModel;
public class DBBlacklist extends AbstractController {
public DBBlacklist() {
}
/**
* Returns an instance of {@link MysqlDatabase} with the database name as set in the {@link DBController} class
*
* @return {@link MysqlDatabase}
*/
public MysqlDatabase getDatabase() {
return database;
}
public int add(MBlacklist obj) {
try {
if (!isAlreadyBlacklisted(obj.getWord(), obj.getServerId())) {
int result = database.insert("INSERT INTO blacklist VALUES(?,?,?,?)", obj.getWord(), obj.getServerId(),
obj.isEnabled(), obj.getCreatorId());
return result;
} else
throw new RuntimeException("Word is already blacklisted");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
public int delete(String word, String serverId) {
try {
if (isAlreadyBlacklisted(word, serverId)) {
int result = database.delete("DELETE FROM blacklist WHERE word = ? AND serverId = ?", word, serverId);
return result;
} else
throw new RuntimeException("Is not blacklisted");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
public int enable(String word, String serverId) {
try {
if (isAlreadyBlacklisted(word, serverId)) {
int result = database.update("UPDATE blacklist SET isEnabled = 1 WHERE word = ? AND serverId = ?", word, serverId);
return result;
} else
throw new RuntimeException("Is not blacklisted");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
public int disable(String word, String serverId) {
try {
if (isAlreadyBlacklisted(word, serverId)) {
int result = database.update("UPDATE blacklist SET isEnabled = 0 WHERE word = ? AND serverId = ?", word, serverId);
return result;
} else
throw new RuntimeException("Is not blacklisted");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
public MBlacklist getBlacklistForWord(String word, String serverId) {
try {
if (isAlreadyBlacklisted(word, serverId)) {
ResultSet rs = database.prepareAndExecute("SELECT * FROM blacklist WHERE word = ? AND serverId = ?", word, serverId);
Object array[][] = database.convertToArray(rs);
if (database.getNbRow() != 0) {
return new MBlacklist((String) array[1][0], (Boolean) array[1][2], (String) array[1][3],
(String) array[1][1]);
}
} else
throw new RuntimeException("Is not blacklisted");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public ArrayList<MBlacklist> getBlacklistFromServer(String serverId) {
ArrayList<MBlacklist> output = new ArrayList<>();
try {
ResultSet rs = database.prepareAndExecute("SELECT * FROM blacklist WHERE serverId = ? AND isEnabled = 1", serverId);
TableModel model = database.convertToTableModel(rs);
if (model.getNbRows() != 0) {
for (int row = 0; row < database.getNbRow(); row++) {
output.add(new MBlacklist((String) model.getRow(row).get(0), (Boolean) model.getRow(row).get(2), (String) model.getRow(row).get(3),
(String) model.getRow(row).get(1)));
}
} else
throw new RuntimeException("Blacklist is empty");
} catch (SQLException e) {
e.printStackTrace();
} catch (NullPointerException e) {
} catch (IndexOutOfBoundsException i) {
throw new RuntimeException("Blacklist is empty");
}
return output;
}
public boolean isAlreadyBlacklisted(String word, String serverId) throws SQLException {
ResultSet rs = database.prepareAndExecute("SELECT COUNT(*) FROM blacklist WHERE word = ? AND serverId = ?", word, serverId);
if (rs.next()) {
if (rs.getInt(1) == 0)
return false;
}
return true;
}
@Override
public String getControllerName() {
// TODO Auto-generated method stub
return "blacklist";
}
}
@@ -0,0 +1,139 @@
package netneutrality.db.controllers;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.ResultSet;
import netneutrality.db.AbstractController;
import netneutrality.db.DBController;
import netneutrality.db.MysqlDatabase;
import netneutrality.db.models.MMessage;
import netneutrality.handler.LogHandler;
public class DBMessage extends AbstractController {
public DBMessage() { }
/**
* Returns an instance of {@link MysqlDatabase} with the database name as set in the {@link DBController} class
*
* @return {@link MysqlDatabase}
*/
public MysqlDatabase getDatabase() {
return database;
}
public int log(String servername, String channelname, String username, String datesent, String messageId, String message) {
try {
return database.insert("INSERT INTO log_message VALUES(?,?,?,?,?,?,?)", servername, channelname, username, datesent, messageId, message, null);
} catch (SQLException e) {
LogHandler.log(e);
}
return -1;
}
public int logEdit(String messageId, String newMessage) {
try {
return database.update("UPDATE log_message SET editedMessage = ? WHERE messageId = ?", newMessage, messageId);
} catch (SQLException e) {
LogHandler.log(e);
}
return -1;
}
public MMessage getMessage(String messageId) {
try {
ResultSet rs = database.prepareAndExecute("SELECT * FROM log_message WHERE messageId = ?", messageId);
Object[][] array = database.convertToArray(rs);
if (database.getNbRow() != 0)
return new MMessage(array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
} catch (SQLException e) {
LogHandler.log(e);
}
return null;
}
public ArrayList<MMessage> getMessagesFromUser(String username, String serverName, int max) {
ArrayList<MMessage> messages = new ArrayList<MMessage>();
try {
ResultSet rs = database.prepareAndExecute("SELECT * FROM log_message WHERE userName = ? AND serverName = ? ORDER BY dateSent DESC", username, serverName);
Object[][] array = database.convertToArray(rs);
if (database.getNbRow() != 0) {
for (int row = 1; row <= max; row++) {
messages.add(new MMessage(array[row][0], array[row][1], array[row][2], array[row][3], array[row][4], array[row][5]));
}
}
} catch (SQLException e) {
LogHandler.log(e);
}
return messages;
}
public String getMessageString(String messageId) {
try {
ResultSet rs = database.prepareAndExecute("SELECT message FROM log_message WHERE messageId = ?", messageId);
if (rs.next())
return rs.getString(1);
} catch (SQLException e) {
LogHandler.log(e);
}
return "No message found";
}
public boolean setupLog(String serverId, String channelId) {
try {
int result = database.insert("INSERT INTO logging VALUES(?,?,?)", serverId, channelId, true);
if (result == 1)
return true;
} catch (SQLException e) {
LogHandler.log(e);
}
return false;
}
public boolean toggleLog(String serverId, String channelId) {
try {
int result = database.update("UPDATE logging SET enabled = NOT enabled");
if (result == 1)
return true;
} catch (SQLException e) {
LogHandler.log(e);
}
return false;
}
public boolean isLoggingEnabled(String serverId, String channelId) {
try {
ResultSet rs = database.prepareAndExecute("SELECT enabled FROM logging WHERE serverId = ? AND channelId = ?", serverId, channelId);
if (rs.next())
return rs.getBoolean(1);
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
@Override
public String getControllerName() {
return "message";
}
}
@@ -0,0 +1,81 @@
package netneutrality.db.controllers;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import netneutrality.db.AbstractController;
public class DBSettings extends AbstractController {
public DBSettings() {
// TODO Auto-generated constructor stub
}
public String getLoggingChannel(String serverId) {
if (serverId.isEmpty() || serverId == null)
return null;
try {
ResultSet rs = database.prepareAndExecute("SELECT channelId FROM logging WHERE serverId = ? AND enabled = 1", serverId);
if (rs.next()) {
return rs.getString(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String getToken() {
try {
ResultSet rs = database.prepareAndExecute("SELECT token FROM settings");
if (rs.next()) {
return rs.getString(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String getSellyEmail() {
try {
ResultSet rs = database.prepareAndExecute("SELECT selly_email FROM settings");
if (rs.next()) {
return rs.getString(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String getSellyKey() {
try {
ResultSet rs = database.prepareAndExecute("SELECT selly_key FROM settings");
if (rs.next()) {
return rs.getString(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public String getControllerName() {
// TODO Auto-generated method stub
return "settings";
}
}
@@ -0,0 +1,34 @@
package netneutrality.db.models;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class ColumnModel {
private List<String> columns;
public ColumnModel() {
columns = new LinkedList<>();
}
public void addColumn(String name) {
columns.add(name);
}
public void addAll(Collection<String> columns) {
columns.addAll(columns);
}
@Override
public String toString() {
return Arrays.toString(columns.toArray());
}
}
@@ -0,0 +1,59 @@
package netneutrality.db.models;
public class MBlacklist {
protected String word;
protected boolean enabled;
protected String creatorId;
protected String serverId;
public MBlacklist(String word, boolean enabled, String creatorId, String serverId) {
this.word = word;
this.enabled = enabled;
this.creatorId = creatorId;
this.serverId = serverId;
}
/**
* @return String The blacklisted word
*/
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getCreatorId() {
return creatorId;
}
public void setCreatorId(String creatorId) {
this.creatorId = creatorId;
}
public String getServerId() {
return serverId;
}
public void setServerId(String serverId) {
this.serverId = serverId;
}
@Override
public String toString() {
return "[word=" + word + ", enabled=" + enabled + "]";
}
}
@@ -0,0 +1,102 @@
package netneutrality.db.models;
public class MMessage {
private String serverName;
private String channelName;
private String sender;
private String dateSent;
private String messageId;
private String message;
private String editedMessage;
public MMessage(String serverName, String channelName, String sender, String dateSent, String messageId,
String message) {
this.serverName = serverName;
this.channelName = channelName;
this.sender = sender;
this.dateSent = dateSent;
this.messageId = messageId;
this.message = message;
this.editedMessage = "";
}
public MMessage() {
}
public MMessage(Object serverName, Object channelName, Object sender, Object dateSent, Object messageId, Object message) {
this.serverName = (String) serverName;
this.channelName = (String) channelName;
this.sender = (String) sender;
this.dateSent = (String) dateSent;
this.messageId = (String) messageId;
this.message = (String) message;
this.editedMessage = "";
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public String getChannelName() {
return channelName;
}
public void setChannelName(String channelName) {
this.channelName = channelName;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getDateSent() {
return dateSent;
}
public void setDateSent(String dateSent) {
this.dateSent = dateSent;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getEditedMessage() {
return editedMessage;
}
public void setEditedMessage(String editedMessage) {
this.editedMessage = editedMessage;
}
@Override
public String toString() {
return "MMessage [serverName=" + serverName + ", channelName=" + channelName + ", sender=" + sender
+ ", dateSent=" + dateSent + ", messageId=" + messageId + ", message=" + message + ", editedMessage="
+ editedMessage + "]";
}
}
@@ -0,0 +1,37 @@
package netneutrality.db.models;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RowModel {
private ArrayList<Object> row;
public RowModel() {
row = new ArrayList<>();
}
public RowModel(Object... objs) {
row = new ArrayList<>();
row.addAll(Arrays.asList(objs));
}
public void addColumnToRow(Object obj) {
row.add(obj);
}
public List<Object> getRow() {
return row;
}
@Override
public String toString() {
return row.toString();
}
}
@@ -0,0 +1,41 @@
package netneutrality.db.models;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import java.util.ArrayList;
public class RowsModel {
private ArrayList<RowModel> rows;
public RowsModel() {
rows = new ArrayList<>();
}
public void addRow(RowModel row) {
rows.add(row);
}
public RowModel getRowModel(int index) {
if (!rows.isEmpty())
return rows.get(index);
return null;
}
public void addColumnInRow(int index, Object obj) {
rows.get(index).addColumnToRow(obj);
}
public ArrayList<RowModel> getRows() {
return rows;
}
@Override
public String toString() {
return rows.toString();
}
}
@@ -0,0 +1,112 @@
package netneutrality.db.models;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
public class SellyOrder {
private String id;
private String product_id;
private String email;
private String ip;
private float value;
private String currency;
private String gateway;
private int risk;
private int status;
private int cryptoValue;
private String cryptoAddress;
private float usdValue;
private String createdAt;
public SellyOrder(String id, String product_id, String email, String ip, float value, String currency, String gateway, int risk, int status, int cryptoValue, String cryptoAddress, float usdValue, String createdAt) {
this.id = id;
this.product_id = product_id;
this.email = email;
this.ip = ip;
this.value = value;
this.currency = currency;
this.gateway = gateway;
this.risk = risk;
this.status = status;
this.cryptoValue = cryptoValue;
this.cryptoAddress = cryptoAddress;
this.usdValue = usdValue;
this.createdAt = createdAt;
}
public String getId() {
return id;
}
public String getProduct_id() {
return product_id;
}
public String getEmail() {
return email;
}
public String getIp() {
return ip;
}
public float getValue() {
return value;
}
public String getCurrency() {
return currency;
}
public String getGateway() {
return gateway;
}
public int getRisk() {
return risk;
}
public int getStatus() {
return status;
}
public int getCryptoValue() {
return cryptoValue;
}
public String getCryptoAddress() {
return cryptoAddress;
}
public float getUsdValue() {
return usdValue;
}
public String getCreatedAt() {
return createdAt;
}
@Override
public String toString() {
return "SellyOrder{" +
"id='" + id + '\'' +
", product_id='" + product_id + '\'' +
", email='" + email + '\'' +
", ip='" + ip + '\'' +
", value='" + value + '\'' +
", currency='" + currency + '\'' +
", gateway='" + gateway + '\'' +
", risk='" + risk + '\'' +
", status='" + status + '\'' +
", cryptoValue='" + cryptoValue + '\'' +
", cryptoAddress='" + cryptoAddress + '\'' +
", usdValue='" + usdValue + '\'' +
", createdAt='" + createdAt + '\'' +
'}';
}
}
@@ -0,0 +1,18 @@
package netneutrality.db.models;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
public class SellyProduct {
private String id;
private String title;
private String description;
private String stock;
private float price;
private String currency;
private boolean isPrivate;
}
@@ -0,0 +1,64 @@
package netneutrality.db.models;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import java.util.Arrays;
import java.util.List;
public class TableModel {
private ColumnModel columns;
private RowsModel rows;
public TableModel() {
this.columns = new ColumnModel();
this.rows = new RowsModel();
}
public TableModel(String... columns) {
this.columns = new ColumnModel();
this.rows = new RowsModel();
this.columns.addAll(Arrays.asList(columns));
}
public void addColumn(String name) {
columns.addColumn(name);
}
public RowsModel addRow(RowModel row) {
rows.addRow(row);
return rows;
}
public RowsModel getRows() {
return rows;
}
public List<Object> getRow(int index) {
return rows.getRowModel(index).getRow();
}
public ColumnModel getColumns() {
return columns;
}
public boolean isEmpty() {
return rows.getRows().isEmpty();
}
public int getNbRows() {
return rows.getRows().size();
}
@Override
public String toString() {
return "Columns: [" + columns + "], Rows: [" + rows + "]";
}
}
@@ -0,0 +1,39 @@
/*
* Copyright 2017 github.com/kaaz
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package netneutrality.exceptions;
import java.sql.SQLException;
public class UnimplementedParameterException extends SQLException {
private static final long serialVersionUID = 4721555678157694115L;
private String s;
public UnimplementedParameterException(Object parameter) {
s = "Parameter not implemented at for: " + parameter;
}
public UnimplementedParameterException(Object parameter, int pos) {
s = "Parameter not implemented! parameter:" + parameter + " - position:" + pos;
}
@Override
public String toString() {
return s;
}
}
@@ -0,0 +1,284 @@
package netneutrality.handler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import net.dv8tion.jda.core.entities.ChannelType;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;
import netneutrality.command.basic.HelpCommand;
import netneutrality.command.basic.PingCommand;
import netneutrality.command.crypto.BitcoinPriceCommand;
import netneutrality.command.crypto.EthereumPriceCommand;
import netneutrality.command.crypto.LitecoinPriceCommand;
import netneutrality.command.specific.NiggerCommand;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBBlacklist;
import netneutrality.db.controllers.DBMessage;
import netneutrality.db.models.MBlacklist;
import netneutrality.utils.*;
public class CommandHandler extends ListenerAdapter {
private String prefix = "$";
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
if (event.isWebhookMessage()) return;
if (MessageRateLimit.check(event)) return;
// event.getChannel().sendMessage("Message id : " + event.getMessage().getId()).queue();
((DBMessage) DBController.get("message")).log(event.getGuild().getName(), event.getTextChannel().getName(),
event.getMember().getUser().getName(),
event.getMessage().getCreationTime().toInstant().toString(), event.getMessage().getId(),
event.getMessage().getContentDisplay().trim());
if (event.isFromType(ChannelType.PRIVATE)) {
System.out.printf("[PM] %s: %s\n>", event.getAuthor().getName(), event.getMessage().getContentDisplay());
} else {
System.out.printf("[%s][%s] %s: %s\n>", event.getGuild().getName(), event.getTextChannel().getName(),
event.getMember().getEffectiveName(), event.getMessage().getContentDisplay());
if (event.getMessage().getContentStripped().startsWith(prefix)) {
String command = event.getMessage().getContentStripped().substring(1).split(" ")[0];
String args = event.getMessage().getContentStripped();
switch (command) {
case "ping":
new PingCommand().execute(event, null);
break;
case "help":
new HelpCommand().execute(event, null);
break;
case "nigger":
new NiggerCommand().execute(event, null);
break;
case "setuplog":
((DBMessage) DBController.get("message")).setupLog(event.getGuild().getId(), event.getTextChannel().getId());
event.getTextChannel().sendMessage("Logging has been enabled on the #" + event.getTextChannel().getName() + " text channnel for the server " + event.getGuild().getName()).queue();
break;
case "togglelog":
break;
case "shutdown":
if (event.getAuthor().getDiscriminator().equals("5337")) {
event.getTextChannel().sendMessage("Shutting down...").queue();
event.getJDA().shutdown();
System.exit(0);
}
break;
case "bitcoin":
case "btc":
if (countArgs(event.getMessage().getContentStripped()) == 2) {
event.getTextChannel().sendMessage("In maintenance.").queue();
} else {
new BitcoinPriceCommand().execute(event, null);
}
break;
case "ethereum":
case "eth":
if (countArgs(event.getMessage().getContentStripped()) == 2) {
event.getTextChannel().sendMessage("In maintenance.").queue();
} else {
new EthereumPriceCommand().execute(event, null);
}
break;
case "litecoin":
case "ltc":
if (countArgs(event.getMessage().getContentStripped()) == 2) {
event.getTextChannel().sendMessage("In maintenance.").queue();
} else {
new LitecoinPriceCommand().execute(event, null);
}
break;
// prune command
case "prune":
case "purge":
if (UserFunction.isAdmin(event.getMember())) {
try {
int toDelete = Integer.parseInt(parseArgs(event.getMessage().getContentStripped(), 1));
ChannelFunction.bulkDeleteMessage(event.getTextChannel(), toDelete);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
event.getTextChannel().sendMessage("Failed to delete message!").queue();
}
}
break;
case "blacklist":
if (UserFunction.isAdmin(event.getMember())) {
if (countArgs(args) >= 2) {
switch (parseArgs(args, 1)) {
case "get":
event.getTextChannel().sendMessage("Retreiving list, please wait...").queue(new Consumer<Message>() {
@Override
public void accept(Message t) {
String out = "";
ArrayList<MBlacklist> blacklist = null;
try {
blacklist = ((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(event.getGuild().getId());
for (MBlacklist bl : blacklist) {
out += bl.getWord() + " -> " + (bl.isEnabled() ? "enabled" : "disabled") + "\n";
}
} catch (RuntimeException e) {
LogHandler.log(e);
}
t.editMessage("List of blacklisted words for this server [" + event.getGuild().getName() + "] :\n" + (blacklist.isEmpty() ? "No word found" : out)).queue();
}
});
break;
case "add":
if (UserFunction.isAdmin(event.getMember())) {
String word = parseArgs(event.getMessage().getContentStripped(), 2);
try {
((DBBlacklist) DBController.get("blacklist")).add(new MBlacklist(word, true, event.getAuthor().getId(), event.getGuild().getId()));
event.getTextChannel().sendMessage("Added the word \"" + word + "\" to the blacklist.").queue();
} catch (RuntimeException e) {
event.getTextChannel().sendMessage("Error adding \"" + word + "\" to the blacklist. It's already blacklisted!").queue();
LogHandler.log(e);
}
}
break;
case "remove":
if (UserFunction.isAdmin(event.getMember())) {
String word = parseArgs(event.getMessage().getContentStripped(), 2);
try {
((DBBlacklist) DBController.get("blacklist")).delete(word, event.getGuild().getId());
event.getTextChannel().sendMessage("Removed the word \"" + word + "\" from the blacklist.").queue();
} catch (RuntimeException e) {
LogHandler.log(e);
event.getTextChannel().sendMessage("Error removing \"" + word + "\" from the blacklist").queue();
}
}
break;
case "disable":
if (event.getAuthor().getDiscriminator().equals("5337")) {
String word = parseArgs(event.getMessage().getContentStripped(), 2);
try {
((DBBlacklist) DBController.get("blacklist")).disable(word, event.getGuild().getId());
event.getTextChannel().sendMessage("Succesfully disabled the word \"" + word + "\" from the blacklist!").queue();
} catch (NullPointerException e) {
LogHandler.log(e);
event.getTextChannel().sendMessage("Error disabling \"" + word + "\", it's not blacklisted!").queue();
}
}
break;
case "enable":
if (event.getAuthor().getDiscriminator().equals("5337")) {
String word = parseArgs(event.getMessage().getContentStripped(), 2);
try {
((DBBlacklist) DBController.get("blacklist")).enable(word, event.getGuild().getId());
event.getTextChannel().sendMessage("Succesfully enabled the word \"" + word + "\" from the blacklist!").queue();
} catch (NullPointerException e) {
event.getTextChannel().sendMessage("Error enabling \"" + word + "\", it's not blacklisted!").queue();
LogHandler.log(e);
}
}
break;
}
}
}
break;
case "test":
if (event.getAuthor().getDiscriminator().equals("5337")) {
event.getMessage().delete().queue();
event.getTextChannel().sendMessage("```JF est gay```").queue();
}
break;
}
}
else {
ArrayList<MBlacklist> blacklist = ((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(event.getGuild().getId());
if (!blacklist.isEmpty()) {
boolean found = false;
for (int i = 0; i < blacklist.size(); i++) {
if (blacklist.get(i).isEnabled()) {
if (event.getMessage().getContentStripped().toLowerCase().contains(blacklist.get(i).getWord()))
found = true;
}
}
if (found) {
event.getMessage().delete().queue();
event.getTextChannel().sendMessage("Not in my christian server").queue();
}
}
}
}
}
private int countArgs(String command) {
List<String> args = Arrays.asList(command.split(" "));
return args.size();
}
private String parseArgs(String command, int arg) {
List<String> args = Arrays.asList(command.split(" "));
return args.get(arg);
}
}
@@ -0,0 +1,27 @@
package netneutrality.handler;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ConsoleHandler {
private BufferedReader br;
private String input = "";
public ConsoleHandler() {
System.out.println("Console input ready!");
}
public String init() throws IOException {
this.br = new BufferedReader(new InputStreamReader(System.in));
do {
System.out.print(">");
this.input = this.br.readLine();
} while (!this.input.equalsIgnoreCase("quit"));
return this.input;
}
}
@@ -0,0 +1,47 @@
package netneutrality.handler;
import java.awt.Color;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.events.message.MessageUpdateEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBMessage;
import netneutrality.db.controllers.DBSettings;
public class EditHandler extends ListenerAdapter {
@Override
public void onMessageUpdate(MessageUpdateEvent event) {
if (event.getAuthor().isBot()) return;
String logChannel = ((DBSettings) DBController.get("settings")).getLoggingChannel(event.getGuild().getId());
if (logChannel != null) {
String originalMessage = ((DBMessage) DBController.get("message")).getMessageString(event.getMessage().getId());
((DBMessage) DBController.get("message")).logEdit(event.getMessage().getId(), event.getMessage().getContentDisplay());
EmbedBuilder editEmbed = new EmbedBuilder();
editEmbed.setColor(Color.RED);
editEmbed.setDescription(":pencil2: **Message edited by " + event.getAuthor().getName() + "**");
try {
editEmbed.addField("Original message", (originalMessage == null ? "Not available" : originalMessage), false);
} catch (IllegalArgumentException ex) {
editEmbed.addField("Original message :", "Message too long. Check db for full message", false);
}
try {
editEmbed.addField("Edited to :", event.getMessage().getContentDisplay(), false);
} catch (IllegalArgumentException ex) {
editEmbed.addField("Edited to :", "Message too long. Check db for full message", false);
}
editEmbed.setFooter("ID : " + event.getMessageId(), null);
editEmbed.setTimestamp(event.getMessage().getCreationTime());
event.getJDA().getTextChannelById(logChannel).sendMessage(editEmbed.build()).queue();
}
}
}
@@ -0,0 +1,17 @@
package netneutrality.handler;
import netneutrality.utils.Settings;
public class LogHandler {
/**
* Log the exception to the owner's log TextChannel as defined in {@link Settings#getLogChannel()}
*
* @param t The exceptions to log
*/
public static void log(Throwable t) {
Settings.getLogChannel().sendMessage("Error : " + t.getMessage()).queue();
}
}
@@ -0,0 +1,43 @@
package netneutrality.handler;
import java.time.OffsetDateTime;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.PrivateChannel;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
public class MessageRateLimit {
private static Member lastSender;
private static OffsetDateTime timestamp;
private static int cooldown = 500000000; // 1 seconds = 1000000000 nanoseconds
public static boolean check(MessageReceivedEvent event) {
if (event.getChannel() instanceof PrivateChannel)
return false;
if (lastSender == null || timestamp == null) {
lastSender = event.getMember();
timestamp = event.getMessage().getCreationTime();
return false;
}
if (event.getMember().getUser().getId().equals(lastSender.getUser().getId())) {
if (event.getMessage().getCreationTime().minusNanos(cooldown).isBefore(timestamp)) {
lastSender = event.getMember();
timestamp = event.getMessage().getCreationTime();
event.getMessage().delete().queue();
System.err.print("Rate limited\n>");
return true;
}
}
lastSender = event.getMember();
timestamp = event.getMessage().getCreationTime();
return false;
}
}
@@ -0,0 +1,147 @@
package netneutrality.handler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import net.dv8tion.jda.core.entities.ChannelType;
import netneutrality.command.Visibility;
import netneutrality.command.basic.HelpCommand;
import netneutrality.utils.MessageFunction;
import org.reflections.Reflections;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;
import netneutrality.command.AbstractCommand;
import netneutrality.db.DBController;
import netneutrality.db.controllers.DBBlacklist;
import netneutrality.db.controllers.DBMessage;
import netneutrality.db.models.MBlacklist;
import netneutrality.utils.Settings;
import netneutrality.utils.UserFunction;
public class NewCommandListener extends ListenerAdapter {
private HashMap<String, AbstractCommand> commands = new HashMap<>();
private HashMap<String, AbstractCommand> commandsAlias = new HashMap<>();
private Map<String, String[]> alias = new HashMap<>();
public NewCommandListener() {
initCommands();
initAlias();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
if (event.isWebhookMessage()) return;
if (MessageRateLimit.check(event)) return;
if (event.isFromType(ChannelType.TEXT))
((DBMessage) DBController.get("message")).log(event.getGuild().getName(), event.getTextChannel().getName(),
event.getMember().getUser().getName(),
event.getMessage().getCreationTime().format(DateTimeFormatter.ofPattern(Settings.DATETIMEFORMAT)), event.getMessage().getId(),
event.getMessage().getContentDisplay().trim());
Message message = event.getMessage();
String msg = message.getContentDisplay().trim();
if (msg.startsWith(Settings.PREFIX)) {
msg = msg.substring(1);
String cmd = msg.split(" ", 2)[0];
if (commands.containsKey(cmd) || commandsAlias.containsKey(cmd)) {
AbstractCommand c = commands.containsKey(cmd) ? commands.get(cmd) : commandsAlias.get(cmd);
if (Visibility.check(event.getChannel(), c.getVisibility())) {
if (c.needAdmin() && c.getVisibility() != Visibility.PRIVATE) {
if (!UserFunction.isAdmin(event.getMember())) {
return;
}
}
if (cmd.equals("help")) {
((HelpCommand) commands.get("help")).sendHelp(commands, commandsAlias, event.getAuthor(), event.getChannel());
} else {
c.execute(event, msg.replaceFirst("(" + cmd + ")(\\ )?", ""));
}
}
}
} else {
ArrayList<MBlacklist> blacklist = new ArrayList<>();
try {
blacklist = ((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(event.getGuild().getId());
} catch (RuntimeException e) { }
if (!blacklist.isEmpty()) {
boolean found = false;
for (int i = 0; i < blacklist.size(); i++) {
if (msg.toLowerCase().contains(blacklist.get(i).getWord()))
found = true;
}
if (found) {
event.getMessage().delete().queue();
event.getTextChannel().sendMessage("Not in my christian server").queue();
}
}
}
}
public void initCommands() {
System.out.println("Loading commands..");
Reflections reflections = new Reflections("netneutrality.command");
Set<Class<? extends AbstractCommand>> classes = reflections.getSubTypesOf(AbstractCommand.class);
for (Class<? extends AbstractCommand> s : classes) {
try {
if (Modifier.isAbstract(s.getModifiers())) {
continue;
}
AbstractCommand command = s.getConstructor().newInstance();
if (!command.isEnabled())
continue;
if (!commands.containsKey(command.getCommand())) {
commands.put(command.getCommand(), command);
}
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
System.out.println("Loaded " + commands.size() + " commands!");
}
public void initAlias() {
for (AbstractCommand command : commands.values()) {
for (String alias : command.getAlias()) {
if (!commandsAlias.containsKey(alias))
commandsAlias.put(alias, command);
}
}
}
}
@@ -0,0 +1,72 @@
package netneutrality.http;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class Selly {
private String authorization;
private byte[] encodedAuth;
public Selly(String email, String apiKey) {
String concat = email + ":" + apiKey;
encodedAuth = Base64.getEncoder().encode(concat.getBytes());
}
public JSONArray getOrders() {
WebModule orders = new WebModule("https://selly.gg/api/v2/orders");
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Basic " + new String(encodedAuth));
JSONArray response = null;
try {
orders.request(headers);
response = orders.getAsArray();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
public JSONObject getOrderById(String id) {
WebModule order = new WebModule("https://selly.gg/api/v2/orders/" + id);
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Basic " + new String(encodedAuth));
JSONObject response = null;
try {
order.request(headers);
response = order.getAsObject();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
public JSONArray getProducts() {
WebModule orders = new WebModule("https://selly.gg/api/v2/products");
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Basic " + new String(encodedAuth));
JSONArray response = null;
try {
orders.request(headers);
response = orders.getAsArray();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
}
@@ -0,0 +1,151 @@
package netneutrality.http;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.google.common.base.Joiner;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class WebModule {
private String url;
private OkHttpClient client = new OkHttpClient();
private Response response;
public WebModule(String url) {
this.url = url;
}
/**
* Send a request to the specified URL in the constructor.
* <br>Needs to be executed before any other method call
*
* @return an instance of the WebModule class with the Response of the Web Request
* @throws IOException
*/
public WebModule request() throws IOException {
Request request = new Request.Builder().url(this.url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")
.build();
response = client.newCall(request).execute();
return this;
}
public WebModule request(Map<String, String> headers) throws IOException {
Request.Builder builder = new Request.Builder().url(this.url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
for (Map.Entry<String, String> header : headers.entrySet()) {
builder.addHeader(header.getKey(), header.getValue());
}
Request request = builder.build();
response = client.newCall(request).execute();
return this;
}
public WebModule post(TreeMap<String, String> params, Map<String, String> headers) throws IOException {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), createJson(params));
Request.Builder builder = new Request.Builder().url(this.url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
for (Map.Entry<String, String> header : headers.entrySet()) {
builder.addHeader(header.getKey(), header.getValue());
}
Request request = builder.build();
response = client.newCall(request).execute();
return this;
}
public static String createJson(TreeMap<String, String> params) {
StringBuilder json = new StringBuilder();
for (Map.Entry<String, String> param : params.entrySet()) {
String str = "\"" + param.getKey() + "\":\"" + param.getValue() + "\"";
json.append(str);
json.append(",");
}
json.insert(0, "{");
return (json.length() > 1 ? json.substring(0, json.length() - 1) + "}" : "");
}
public static String createJsonArray(List<String> list) {
StringBuilder json = new StringBuilder();
for (String str : list) {
json.append("\"" + str + "\"");
json.append(",");
}
json.insert(0, "[");
return (json.length() > 1 ? json.substring(0, json.length() - 1) + "]" : "");
}
public static String createJsonArray(TreeMap<String, String> users) {
StringBuilder json = new StringBuilder();
for (Map.Entry<String, String> param : users.entrySet()) {
String str = "{\"" + param.getKey() + "\":\"" + param.getValue() + "\"}";
json.append(str);
json.append(",");
}
json.insert(0, "[");
return (json.length() > 1 ? json.substring(0, json.length() - 1) + "]" : "[]");
}
/**
* @return the response as a JSONObject
* @throws JSONException
* @throws IOException
*/
public JSONObject getAsObject() throws JSONException, IOException {
if (response == null)
throw new RuntimeException("Request has not been sent");
return new JSONObject(response.body().string());
}
/**
* Use if your response start with an array : [ ]
*
* @return the response as a JSONArray
* @throws JSONException
* @throws IOException
*/
public JSONArray getAsArray() throws JSONException, IOException {
if (response == null)
throw new RuntimeException("Request has not been sent");
return new JSONArray(response.body().string());
}
/**
* @return the response as a String
* @throws JSONException
* @throws IOException
*/
public String getRawData() throws IOException {
if (response == null)
throw new RuntimeException("Request has not been sent");
return response.body().string();
}
}
@@ -0,0 +1,58 @@
package netneutrality.http.server;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import netneutrality.MusicBot;
import netneutrality.http.WebModule;
import java.io.IOException;
import java.io.OutputStream;
import java.util.TreeMap;
public class GuildBrowser implements HttpHandler {
@Override
public void handle(HttpExchange he) throws IOException {
String url[] = he.getRequestURI().toString().split("/");
StringBuilder response = new StringBuilder();
String json;
if (url.length > 2) {
TreeMap<String, String> users = new TreeMap<>();
for (Guild guild : MusicBot.getJDA().getGuilds()) {
if (guild.getName().equalsIgnoreCase(url[2])) {
for (Member member : guild.getMembers()) {
users.put(member.getUser().getName(), member.getEffectiveName());
}
}
}
json = WebModule.createJsonArray(users);
} else {
for (Guild guild : MusicBot.getJDA().getGuilds()) {
response.append("\"" + guild.getName() + "\"");
response.append(",");
}
response.insert(0, "[");
json = response.substring(0, response.length() - 1) + "]";
}
he.getResponseHeaders().add("Content-Type", "application/json");
he.sendResponseHeaders(200, json.getBytes().length);
OutputStream os = he.getResponseBody();
os.write(json.getBytes());
os.close();
}
}
@@ -0,0 +1,25 @@
package netneutrality.http.server;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.io.OutputStream;
public class RootHandler implements HttpHandler {
@Override
public void handle(HttpExchange he) throws IOException {
String response = "<h1>Server start success if you see this message</h1>";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
@@ -0,0 +1,44 @@
package netneutrality.http.server;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import netneutrality.MusicBot;
import netneutrality.http.WebModule;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.TreeMap;
public class WebApi {
private int port = 9000;
private HttpServer server;
public WebApi() {
System.out.println("Starting web server...");
try {
server = HttpServer.create(new InetSocketAddress(port), 0);
} catch (IOException e) {
e.printStackTrace();
}
server.createContext("/", new RootHandler());
server.createContext("/guild", new GuildBrowser());
server.setExecutor(null);
server.start();
System.out.println("Web server started at [" + server.getAddress().getAddress().toString() + "]");
}
}
@@ -0,0 +1,42 @@
package netneutrality.utils;
import java.util.List;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.TextChannel;
public class ChannelFunction {
public static void bulkDeleteMessage(TextChannel channel, int toDelete) {
if (toDelete >= 2500) return;
Thread deleteMessage = new Thread(new Runnable() {
@Override
public void run() {
int toDeleteFinal = toDelete + 1;
int iteration = toDeleteFinal / 100;
for (int i = 0; i < iteration; i++) {
List<Message> messages = channel.getHistory().retrievePast(100).complete();
channel.deleteMessages(messages).complete();
toDeleteFinal -= 100;
System.out.println("Deleted 100 message");
}
if (toDeleteFinal > 0) {
List<Message> messages = channel.getHistory().retrievePast(toDeleteFinal).complete();
channel.deleteMessages(messages).complete();
System.out.println("Deleted " + toDeleteFinal + " messages");
} else {
System.out.println("No more message");
}
}
});
deleteMessage.start();
}
}
@@ -0,0 +1,41 @@
package netneutrality.utils;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import java.util.List;
import net.dv8tion.jda.core.entities.ChannelType;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message;
public class MessageFunction {
public static Member getStartingMention(Message message) {
if (isStartingWithMention(message)) {
return message.getMentionedMembers().get(0);
}
return null;
}
public static boolean isStartingWithMention(Message message) {
if (!message.isFromType(ChannelType.TEXT))
return false;
List<Member> mentions= message.getMentionedMembers();
for (Member member : mentions) {
if (message.getContentDisplay().startsWith("@" + member.getUser().getName()))
return true;
}
return false;
}
}
@@ -0,0 +1,37 @@
package netneutrality.utils;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.entities.User;
public class Settings {
public static final String DATETIMEFORMAT = "yyyy-MM-dd HH:mm:ss";
public static String PREFIX = "$";
private static User owner;
private static Guild ownerGuild;
private static TextChannel logChannel;
public static User getCreator() {
return owner;
}
public static void setCreator(User creator) {
Settings.owner = creator;
}
public static Guild getOwnerGuild() {
return ownerGuild;
}
public static void setOwnerGuild(Guild ownerGuild) {
Settings.ownerGuild = ownerGuild;
logChannel = ownerGuild.getTextChannelById("400383009330823179");
}
public static TextChannel getLogChannel() {
return logChannel;
}
}
@@ -0,0 +1,20 @@
package netneutrality.utils;
import net.dv8tion.jda.core.Permission;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Role;
public class UserFunction {
public static boolean isAdmin(Member user) {
boolean isAdmin = false;
for(Role role : user.getRoles()) {
if (role.getPermissions().contains(Permission.MANAGE_SERVER) || role.getPermissions().contains(Permission.ADMINISTRATOR))
isAdmin = true;
}
return isAdmin;
}
}