diff --git a/pom.xml b/pom.xml index 7afe0e1..c3021ff 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,11 @@ slf4j-simple 1.7.29 + + club.minnced + discord-webhooks + 0.1.8 + diff --git a/src/main/java/com/bbn/hadder/Hadder.java b/src/main/java/com/bbn/hadder/Hadder.java index 292dee8..335efc4 100644 --- a/src/main/java/com/bbn/hadder/Hadder.java +++ b/src/main/java/com/bbn/hadder/Hadder.java @@ -66,7 +66,8 @@ public class Hadder { new BoobsCommand(), new FeetCommand(), new EroticCommand(), - new RoleCommand()), config); + new RoleCommand(), + new LinkCommand()), config); builder.addEventListeners( new MentionListener(rethink), diff --git a/src/main/java/com/bbn/hadder/Rethink.java b/src/main/java/com/bbn/hadder/Rethink.java index ba6a03e..da6602d 100644 --- a/src/main/java/com/bbn/hadder/Rethink.java +++ b/src/main/java/com/bbn/hadder/Rethink.java @@ -54,14 +54,14 @@ public class Rethink { return new JSONArray(); } - private String get(String table, String where, String value, String column) { - return this.getAsArray(table, where, value).getJSONObject(0).getString(column); + private Object get(String table, String where, String value, String column) { + return this.getAsArray(table, where, value).getJSONObject(0).get(column); } - private String update(String table, String whatvalue, String where, String wherevalue) { + private String update(String table, String wherevalue, String what, String whatvalue) { String out=""; try { - Cursor cursor = r.table(table).get(whatvalue).update(r.hashMap(where, wherevalue)).run(conn); + Cursor cursor = r.table(table).get(wherevalue).update(r.hashMap(what, whatvalue)).run(conn); out=cursor.toString(); } catch (ClassCastException ignored) {} return out; @@ -100,7 +100,7 @@ public class Rethink { } public String getUserPrefix(String id) { - return this.get("user", "id", id, "prefix"); + return (String) this.get("user", "id", id, "prefix"); } public String setGuildPrefix(String prefix, String guildid) { @@ -108,11 +108,38 @@ public class Rethink { } public String getGuildPrefix(String id) { - return this.get("server", "id", id, "prefix"); + return (String) this.get("server", "id", id, "prefix"); + } + + public JSONArray getLinks(String id) { + return new JSONArray((String) this.get("server", "id", id, "links")); + } + + public String addLinkedGuild(String guildid, String linkid) { + return this.update("server", guildid, "links", this.getLinks(guildid).put(linkid).toString()); + } + + public String removeLinkedGuild(String guildid, String linkid) { + JSONArray linkedguildslist = this.getLinks(guildid); + for (int i = 0; linkedguildslist.length()>i; i++) { + if (linkedguildslist.getString(i).equals(linkid)) { + linkedguildslist.remove(i); + break; + } + } + return this.update("server", guildid, "links", linkedguildslist.toString()); + } + + public String setLinkChannel(String guildid, String channelid) { + return 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.")); + return this.insert("server", r.hashMap("id", id).with("prefix", "h.").with("links", "[]").with("linkchannel", "")); } public String insertUser(String id) { diff --git a/src/main/java/com/bbn/hadder/commands/moderation/LinkCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/LinkCommand.java new file mode 100644 index 0000000..925cf46 --- /dev/null +++ b/src/main/java/com/bbn/hadder/commands/moderation/LinkCommand.java @@ -0,0 +1,97 @@ +package com.bbn.hadder.commands.moderation; + +import com.bbn.hadder.commands.Command; +import com.bbn.hadder.commands.CommandEvent; +import com.bbn.hadder.core.LinkUtils; +import com.bbn.hadder.utils.MessageEditor; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.MessageBuilder; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.MessageReaction; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LinkCommand implements Command { + @Override + public void executed(String[] args, CommandEvent event) { + if (args.length == 0) return; + switch (args[0]) { + + case "add": + if (args.length != 2) return; + String linkid = args[1]; + + // Check if guild is existing + boolean found = false; + Guild linkguild = null; + for (Guild g : event.getJDA().getGuilds()) { + if (g.getId().equals(linkid)) { + found = true; + linkguild = g; + } + } + // TODO + if (!found) return; + + // Check if the guild is the same + if (event.getGuild().getId().equals(args[1])) { + event.getChannel().sendMessage( + new MessageEditor().setDefaultSettings(MessageEditor.MessageType.ERROR, + new EmbedBuilder().setTitle("Wait thats illegal.").setDescription("You specified the same guild as the guild on which you're reading this")).build()).queue(); + return; + } + + // Send poll to all connected guilds + if (event.getRethink().getLinks(event.getGuild().getId()).length() > 0) { + List reactions = new ArrayList<>(); + reactions.addAll(Arrays.asList("✅", "❌")); + new LinkUtils().sendAll( + event.getRethink().getLinks(event.getGuild().getId()), event.getJDA(), + new MessageBuilder() + .setEmbed( + new MessageEditor().setDefaultSettings(MessageEditor.MessageType.INFO, + new EmbedBuilder() + .setTitle(event.getGuild().getName() + " (" + event.getGuild().getId() + ") wants to add " + linkguild.getName() + " (" + linkguild.getId() + ")") + .setDescription("Please vote if the Guild should be added.")).build()).build(), + event.getJDA().getSelfUser(), reactions); + } else { + Guild finalLinkguild = linkguild; + new Thread(() -> { + if (event.getRethink().getLinkChannel(linkid).isEmpty()) { + event.getRethink().setLinkChannel(linkid, finalLinkguild.createTextChannel("linkchannel").complete().getId()); + } + // Send Request to link Guild + event.getJDA().getTextChannelById(event.getRethink().getLinkChannel(linkid)).sendMessage( + new MessageEditor().setDefaultSettings(MessageEditor.MessageType.INFO, + new EmbedBuilder().setTitle(event.getGuild().getName() + " (" + event.getGuild().getId() + ") wants to link guilds!") + .setDescription("React with the reactions to accept or decline it")).build() + ).queue( + msg -> { + msg.addReaction("✅").queue(); + msg.addReaction("❌").queue(); + } + ); + }).start(); + } + + break; + } + } + + @Override + public String[] labels() { + return new String[]{"link"}; + } + + @Override + public String description() { + return "Links two or more servers."; + } + + @Override + public String usage() { + return ""; + } +} diff --git a/src/main/java/com/bbn/hadder/core/LinkUtils.java b/src/main/java/com/bbn/hadder/core/LinkUtils.java new file mode 100644 index 0000000..216c148 --- /dev/null +++ b/src/main/java/com/bbn/hadder/core/LinkUtils.java @@ -0,0 +1,88 @@ +package com.bbn.hadder.core; + +import club.minnced.discord.webhook.WebhookClient; +import club.minnced.discord.webhook.WebhookClientBuilder; +import club.minnced.discord.webhook.send.WebhookEmbed; +import club.minnced.discord.webhook.send.WebhookEmbedBuilder; +import club.minnced.discord.webhook.send.WebhookMessageBuilder; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.*; +import org.json.JSONArray; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LinkUtils { + + public void sendAll(JSONArray jsonArray, JDA jda, Message message, User user, List reactions) { + for (int i = 0; jsonArray.length() > i; i++) { + this.send(message, jda.getTextChannelById(jsonArray.getString(i)), user, reactions); + } + } + + private void send(Message message, TextChannel channel, User user, List reactions) { + + channel.retrieveWebhooks().queue( + webhooks -> { + Webhook webhook=null; + for (Webhook webhooktemp : webhooks) { + if (webhooktemp.getOwner().equals(channel.getJDA().getSelfUser())) { + webhook=webhooktemp; + } + } + + if (webhook==null) { + channel.createWebhook("Hadder GuildLink").queue( + webhook1 -> sendMessage(webhook1, channel, user, message, reactions) + ); + } else sendMessage(webhook, channel, user, message, reactions); + } + ); + + + } + + private void sendMessage(Webhook webhook, TextChannel channel, User user, Message message, List reactions) { + WebhookClientBuilder builder = new WebhookClientBuilder(webhook.getId()); + WebhookClient client = builder.build(); + WebhookMessageBuilder mb = new WebhookMessageBuilder(); + mb.setUsername(user.getName()) + .setAvatarUrl((user.getAvatarUrl()!=null) ? user.getAvatarUrl() : user.getDefaultAvatarUrl()) + .setContent(message.getContentRaw()); + for (Message.Attachment attachment:message.getAttachments()) { + try { + mb.addFile(attachment.getFileName(), attachment.retrieveInputStream().get()); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + for (MessageEmbed embed : message.getEmbeds()) { + List fields = new ArrayList<>(); + for (MessageEmbed.Field field : embed.getFields()) { + fields.add(new WebhookEmbed.EmbedField(field.isInline(), field.getName(), field.getValue())); + } + mb.addEmbeds(new WebhookEmbed( + embed.getTimestamp(), embed.getColorRaw(), embed.getDescription(), + embed.getThumbnail().getUrl(), embed.getImage().getUrl(), new WebhookEmbed.EmbedFooter(embed.getFooter().getText(), embed.getFooter().getIconUrl()), + new WebhookEmbed.EmbedTitle(embed.getTitle(), embed.getUrl()), + new WebhookEmbed.EmbedAuthor(embed.getAuthor().getName(), embed.getAuthor().getIconUrl(), embed.getAuthor().getUrl()), fields)); + } + try { + long msgid = client.send(mb.build()).get().getId(); + channel.retrieveMessageById(msgid).queue( + msg -> { + for (String reaction: reactions) { + msg.addReaction(reaction).queue(); + } + } + ); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException 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 new file mode 100644 index 0000000..224e529 --- /dev/null +++ b/src/main/java/com/bbn/hadder/listener/LinkListener.java @@ -0,0 +1,27 @@ +package com.bbn.hadder.listener; + +import com.bbn.hadder.Rethink; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; + +import javax.annotation.Nonnull; + +public class LinkListener extends ListenerAdapter { + + Rethink rethink; + + public LinkListener(Rethink rethink) { + this.rethink = rethink; + } + + @Override + public void onMessageReactionAdd(@Nonnull MessageReactionAddEvent event) { + + } + + @Override + public void onMessageReceived(@Nonnull MessageReceivedEvent event) { + // TODO + } +}