diff --git a/src/main/java/com/bbn/hadder/Hadder.java b/src/main/java/com/bbn/hadder/Hadder.java index d228513..8125491 100644 --- a/src/main/java/com/bbn/hadder/Hadder.java +++ b/src/main/java/com/bbn/hadder/Hadder.java @@ -78,6 +78,7 @@ public class Hadder { new LeaveCommand(), new GuildLeaveCommand(), new MemeCommand(), + new InviteDetectCommand(), new LinkCommand()), config, helpCommand); builder.addEventListeners( @@ -87,6 +88,7 @@ public class Hadder { new GuildListener(rethink, config), new ReadyListener(rethink, config), new LinkListener(rethink), + new InviteLinkListener(rethink), new RulesListener(rethink)); try { diff --git a/src/main/java/com/bbn/hadder/Rethink.java b/src/main/java/com/bbn/hadder/Rethink.java index e6ce4d6..5b41cd8 100644 --- a/src/main/java/com/bbn/hadder/Rethink.java +++ b/src/main/java/com/bbn/hadder/Rethink.java @@ -32,7 +32,7 @@ public class Rethink { .connect(); System.out.println("DB CONNECTED"); } catch (Exception e) { - System.out.println(e.toString()); + e.printStackTrace(); System.out.println("DB CONNECTION FAILED"); } } @@ -59,7 +59,7 @@ public class Rethink { } private String update(String table, String wherevalue, String what, String whatvalue) { - String out=""; + String out = ""; try { Cursor cursor = r.table(table).get(wherevalue).update(r.hashMap(what, whatvalue)).run(conn); out=cursor.toString(); @@ -95,16 +95,16 @@ public class Rethink { } - public String setUserPrefix(String prefix, String userid) { - return this.update("user", userid, "prefix", prefix); + public void setUserPrefix(String prefix, String userid) { + this.update("user", userid, "prefix", prefix); } public String getUserPrefix(String id) { return (String) this.get("user", "id", id, "prefix"); } - public String setGuildPrefix(String prefix, String guildid) { - return this.update("server", guildid, "prefix", prefix); + public void setGuildPrefix(String prefix, String guildid) { + this.update("server", guildid, "prefix", prefix); } public String getGuildPrefix(String id) { @@ -115,12 +115,12 @@ public class Rethink { return new JSONArray((String) this.get("server", "id", id, "links")); } - public String addLinkedGuild(String guildid, String linkid) { + public void addLinkedGuild(String guildid, String linkid) { JSONArray links = getLinks(guildid); for (int i = 0; links.length()>i; i++) { - if (links.getString(i).equals(linkid)) return null; + if (links.getString(i).equals(linkid)) return; } - return this.update("server", guildid, "links", this.getLinks(guildid).put(linkid).toString()); + this.update("server", guildid, "links", this.getLinks(guildid).put(linkid).toString()); } public String removeLinkedGuild(String guildid, String linkid) { @@ -134,26 +134,25 @@ public class Rethink { return this.update("server", guildid, "links", linkedguildslist.toString()); } - public String setLinkChannel(String guildid, String channelid) { - return this.update("server", guildid, "linkchannel", channelid); + public void setLinkChannel(String guildid, String channelid) { + this.update("server", guildid, "linkchannel", channelid); } public String getLinkChannel(String guildid) { return (String) this.get("server", "id", guildid, "linkchannel"); } - public String insertGuild(String id) { - return this.insert("server", r.hashMap("id", id).with("prefix", "h.").with("links", "[]").with("linkchannel", "").with("message_id", "").with("role_id", "")); + public void insertGuild(String id) { + this.insert("server", r.hashMap("id", id).with("prefix", "h.").with("links", "[]").with("linkchannel", "").with("message_id", "").with("role_id", "").with("invite_detect", false)); } - public String insertUser(String id) { - return this.insert("user", r.hashMap("id", id).with("prefix", "h.")); + public void insertUser(String id) { + this.insert("user", r.hashMap("id", id).with("prefix", "h.")); } - public String updateRules(String guild_id, String message_id, String role_id) { + public void updateRules(String guild_id, String message_id, String role_id) { this.update("server", guild_id, "message_id", message_id); this.update("server", guild_id, "role_id", role_id); - return null; } public String getRulesMID(String guild_id) { @@ -164,4 +163,16 @@ public class Rethink { return (String) this.get("server", "id", guild_id, "role_id"); } + public void setInviteDetection(String guild_id, boolean b) { + try { + r.table("server").get(guild_id).update(r.hashMap("invite_detect", b)).run(conn); + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + public Boolean getInviteDetection(String guild_id) { + return (Boolean) this.get("server", "id", guild_id, "invite_detect"); + } + } diff --git a/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java new file mode 100644 index 0000000..4a5a6d2 --- /dev/null +++ b/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java @@ -0,0 +1,71 @@ +package com.bbn.hadder.commands.moderation; + +/* + * @author Skidder / GregTCLTK + */ + +import com.bbn.hadder.commands.Command; +import com.bbn.hadder.commands.CommandEvent; +import com.bbn.hadder.utils.MessageEditor; +import net.dv8tion.jda.api.Permission; + +public class InviteDetectCommand implements Command { + + @Override + public void executed(String[] args, CommandEvent event) { + if (args.length == 1) { + if (event.getMember().hasPermission(Permission.MANAGE_SERVER)) { + switch (args[0].toLowerCase()) { + case "on": + if (!event.getRethink().getInviteDetection(event.getGuild().getId())) { + event.getRethink().setInviteDetection(event.getGuild().getId(), true); + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.INFO) + .setTitle("Successfully activated") + .setDescription("I successfully activated the invite link detection for this guild.") + .build()).queue(); + } else { + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.WARNING) + .setTitle("Already activated") + .setDescription("The invite link detection is already activated on this guild.") + .build()).queue(); + } + break; + + case "off": + if (event.getRethink().getInviteDetection(event.getGuild().getId())) { + event.getRethink().setInviteDetection(event.getGuild().getId(), false); + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.INFO) + .setTitle("Successfully deactivated") + .setDescription("I successfully deactivated the invite link detection for this guild.") + .build()).queue(); + } else { + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.WARNING) + .setTitle("Already deactivated") + .setDescription("The invite link detection is already deactivated on this guild.") + .build()).queue(); + } + break; + } + } else { + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.NO_PERMISSION).build()).queue(); + } + } else { + event.getHelpCommand().sendHelp(this, event.getRethink(), event.getAuthor(), event.getTextChannel()); + } + } + + @Override + public String[] labels() { + return new String[]{"invitedetect", "detectinvite"}; + } + + @Override + public String description() { + return "Activate or deactivate the Discord invite link detection."; + } + + @Override + public String usage() { + return ""; + } +} diff --git a/src/main/java/com/bbn/hadder/listener/InviteLinkListener.java b/src/main/java/com/bbn/hadder/listener/InviteLinkListener.java new file mode 100644 index 0000000..96d18f0 --- /dev/null +++ b/src/main/java/com/bbn/hadder/listener/InviteLinkListener.java @@ -0,0 +1,118 @@ +package com.bbn.hadder.listener; + +/* + * @author Skidder / GregTCLTK + */ + +import com.bbn.hadder.Rethink; +import com.bbn.hadder.utils.MessageEditor; +import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.ChannelType; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageUpdateEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONObject; + +import javax.annotation.Nonnull; + +public class InviteLinkListener extends ListenerAdapter { + + private Rethink rethink; + + public InviteLinkListener(Rethink rethink) { + this.rethink = rethink; + } + + @Override + public void onMessageReceived(@Nonnull MessageReceivedEvent event) { + if (event.isFromType(ChannelType.TEXT)) { + if (event.getMessage().getContentRaw().contains("discord.gg/")) { + if (!event.getMember().hasPermission(Permission.ADMINISTRATOR)) { + if (rethink.getInviteDetection(event.getGuild().getId())) { + String split = event.getMessage().getContentRaw().split("discord.gg/", 10)[1]; + String invite = split.split(" ")[0]; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url("https://canary.discordapp.com/api/v6/invites/" + invite).build(); + try { + Response response = client.newCall(request).execute(); + JSONObject json = new JSONObject(response.body().string()); + if (!json.toString().contains("\"message\":")) { + event.getMessage().delete().reason("Invite Link detected").queue(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } else { + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.NO_PERMISSION).build()).queue(); + } + } else if (event.getMessage().getContentRaw().contains("discordapp.com/invite")) { + if (!event.getMember().hasPermission(Permission.ADMINISTRATOR)) { + if (rethink.getInviteDetection(event.getGuild().getId())) { + String split = event.getMessage().getContentRaw().split("discordapp.com/invite/", 10)[1]; + String invite = split.split(" ")[0]; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url("https://canary.discordapp.com/api/v6/invites/" + invite).build(); + try { + Response response = client.newCall(request).execute(); + JSONObject json = new JSONObject(response.body().string()); + if (!json.toString().contains("\"message\":")) { + event.getMessage().delete().reason("Invite Link detected").queue(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + } + + @Override + public void onMessageUpdate(@Nonnull MessageUpdateEvent event) { + if (event.isFromType(ChannelType.TEXT)) { + if (event.getMessage().getContentRaw().contains("discord.gg/")) { + if (event.getMember().hasPermission(Permission.MANAGE_SERVER)) { + if (rethink.getInviteDetection(event.getGuild().getId())) { + String split = event.getMessage().getContentRaw().split("discord.gg/", 10)[1]; + String invite = split.split(" ")[0]; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url("https://canary.discordapp.com/api/v6/invites/" + invite).build(); + try { + Response response = client.newCall(request).execute(); + JSONObject json = new JSONObject(response.body().string()); + if (!json.toString().contains("\"message\":")) { + event.getMessage().delete().reason("Invite Link detected").queue(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } else { + event.getTextChannel().sendMessage(new MessageEditor().setDefaultSettings(MessageEditor.MessageType.NO_PERMISSION).build()).queue(); + } + } else if (event.getMessage().getContentRaw().contains("discordapp.com/invite")) { + if (event.getMember().hasPermission(Permission.MANAGE_SERVER)) { + if (rethink.getInviteDetection(event.getGuild().getId())) { + String split = event.getMessage().getContentRaw().split("discordapp.com/invite/", 10)[1]; + String invite = split.split(" ")[0]; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url("https://canary.discordapp.com/api/v6/invites/" + invite).build(); + try { + Response response = client.newCall(request).execute(); + JSONObject json = new JSONObject(response.body().string()); + if (!json.toString().contains("\"message\":")) { + event.getMessage().delete().reason("Invite Link detected").queue(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + } +} diff --git a/src/main/java/com/bbn/hadder/listener/LinkListener.java b/src/main/java/com/bbn/hadder/listener/LinkListener.java index 5c34a70..5981d05 100644 --- a/src/main/java/com/bbn/hadder/listener/LinkListener.java +++ b/src/main/java/com/bbn/hadder/listener/LinkListener.java @@ -4,6 +4,7 @@ import com.bbn.hadder.Rethink; import com.bbn.hadder.core.LinkUtils; import com.bbn.hadder.utils.MessageEditor; import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; @@ -70,11 +71,9 @@ public class LinkListener extends ListenerAdapter { @Override public void onMessageReceived(@Nonnull MessageReceivedEvent event) { - if (!event.isWebhookMessage()) { - if (event.getChannel().getId().equals(rethink.getLinkChannel(event.getGuild().getId()))) { + if (!event.isWebhookMessage() && event.getChannel().getId().equals(rethink.getLinkChannel(event.getGuild().getId())) && event.isFromType(ChannelType.TEXT)) { new LinkUtils().sendAll(rethink.getLinks(event.getGuild().getId()), event.getJDA(), event.getMessage(), event.getAuthor(), new ArrayList<>() { }, rethink, false); - } } } }