From 5ef126d5068497f5054d5e210577bc47c4977913 Mon Sep 17 00:00:00 2001 From: deso85 Date: Fri, 1 Jul 2022 02:16:38 +0200 Subject: [PATCH] v7.0.8 --- pom.xml | 2 +- src/main/java/bot/antony/CommandManager.java | 4 +- .../java/bot/antony/commands/AntonyCmd.java | 1 - .../bot/antony/commands/ChangelogCmd.java | 1 + .../java/bot/antony/commands/Channel.java | 240 --------------- .../java/bot/antony/commands/ChannelCmd.java | 275 ++++++++++++++++++ .../commands/aam/AddHBStateMachine.java | 5 +- 7 files changed, 282 insertions(+), 246 deletions(-) delete mode 100644 src/main/java/bot/antony/commands/Channel.java create mode 100644 src/main/java/bot/antony/commands/ChannelCmd.java diff --git a/pom.xml b/pom.xml index 57d82f8..acb9eb6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 Antony Antony - 7.0.7 + 7.0.8 3.5.1.Final diff --git a/src/main/java/bot/antony/CommandManager.java b/src/main/java/bot/antony/CommandManager.java index cf82b3e..957f579 100644 --- a/src/main/java/bot/antony/CommandManager.java +++ b/src/main/java/bot/antony/CommandManager.java @@ -8,7 +8,7 @@ import bot.antony.commands.ArchiveCmd; import bot.antony.commands.CategoryCmd; import bot.antony.commands.ChangelogCmd; -import bot.antony.commands.Channel; +import bot.antony.commands.ChannelCmd; import bot.antony.commands.CommandCmd; import bot.antony.commands.Giveaway; import bot.antony.commands.GuildCmd; @@ -51,6 +51,7 @@ public CommandManager() { commands.put("addhb", new AddHBCmd()); commands.put("archive", new ArchiveCmd()); commands.put("category", new CategoryCmd()); + commands.put("channel", new ChannelCmd()); commands.put("command", new CommandCmd()); commands.put("emergency", new EmergencyCmd()); commands.put("guild", new GuildCmd()); @@ -85,7 +86,6 @@ public CommandManager() { // Admin adminCommands.put("blacklist", new Blacklist()); - adminCommands.put("channel", new Channel()); } public boolean perform(String command, Member member, TextChannel channel, Message message) { diff --git a/src/main/java/bot/antony/commands/AntonyCmd.java b/src/main/java/bot/antony/commands/AntonyCmd.java index a45f250..9ab7242 100644 --- a/src/main/java/bot/antony/commands/AntonyCmd.java +++ b/src/main/java/bot/antony/commands/AntonyCmd.java @@ -89,7 +89,6 @@ private EmbedBuilder getCommandList(Member member) { //Commands for admins BotCommand blacklist = new BotCommand("blacklist", "Funktion zur Verwaltung von Begriffen, die zur sofortigen Löschung des Beitrags führen und das Mod-Team darüber benachrichtigen.", "add d1scord.hack"); - BotCommand channel = new BotCommand("channel", "Funktion, die z.B. dafür genutzt werden kann, alle Kanäle auszugeben, in denen schon länger keine Inhalte mehr gepostet wurden.", "list abandoned"); }*/ diff --git a/src/main/java/bot/antony/commands/ChangelogCmd.java b/src/main/java/bot/antony/commands/ChangelogCmd.java index fcde231..34d35c2 100644 --- a/src/main/java/bot/antony/commands/ChangelogCmd.java +++ b/src/main/java/bot/antony/commands/ChangelogCmd.java @@ -41,6 +41,7 @@ public void performCommand(Member member, TextChannel channel, Message message) private List getChangeLog(int limit) { String cmdPrefix = Antony.getCmdPrefix(); List changeLog = new ArrayList(); + changeLog.add(new ChangeLogEntry("01.07.2022 - Version 7.0.8", "Die ***" + cmdPrefix + "channel*** Funktion wurde auf das neue Berechtigungssystem portiert.")); changeLog.add(new ChangeLogEntry("28.06.2022 - Version 7.0.7", "Die ***" + cmdPrefix + "addhb*** Funktion wurde auf das neue Berechtigungssystem portiert und kann jetzt Haltungsberichte zu Gattungen (z.B.: Lasius sp.) und vermuteten Arten (z.B.: Lasius cf. niger) anlegen.")); changeLog.add(new ChangeLogEntry("25.06.2022 - Version 7.0.6", "Die ***" + cmdPrefix + "guild*** Funktion wurde auf das neue Berechtigungssystem portiert.")); changeLog.add(new ChangeLogEntry("17.06.2022 - Version 7.0.5", "Ein Fehler hat dafür gesorgt, dass der ***" + cmdPrefix + "emergency*** Befehl nicht zuverlässig funktioniert hat. Dieser wurde behoben.")); diff --git a/src/main/java/bot/antony/commands/Channel.java b/src/main/java/bot/antony/commands/Channel.java deleted file mode 100644 index 5e49ab8..0000000 --- a/src/main/java/bot/antony/commands/Channel.java +++ /dev/null @@ -1,240 +0,0 @@ -package bot.antony.commands; - -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import bot.antony.Antony; -import bot.antony.commands.types.IServerCommand; -import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.entities.Category; -import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.MessageHistory; -import net.dv8tion.jda.api.entities.TextChannel; - -public class Channel implements IServerCommand { - - private TextChannel channel; - - @Override - public void performCommand(Member member, TextChannel channel, Message message) { - setChannel(channel); - String[] userMessage = message.getContentDisplay().split(" "); - Guild guild = message.getGuild(); - - if (userMessage.length > 1) { - - switch (userMessage[1].toLowerCase()) { - case "add": - - if(userMessage.length > 2) { - String channelName = userMessage[userMessage.length-1]; - TextChannel refChannel = getChannel(); - if(message.getMentions().getChannels(TextChannel.class).size() > 0) { - refChannel = message.getMentions().getChannels(TextChannel.class).get(0); - } - - Boolean sort = false; - if(userMessage[2].equalsIgnoreCase("sort")) { - sort = true; - } - - TextChannel newChan = addChannel(channelName, refChannel.getParentCategory(), message.getMentions().getMembers(), message.getMember(), sort); - - //feedback - getChannel().sendMessage(newChan.getAsMention() + " wurde angelegt.").complete(); - - } else { - printHelp(); - } - - break; - case "list": - - if(userMessage.length > 2) { - switch (userMessage[2].toLowerCase()) { - case "abandoned": - case "verlassen": - List channelsToReport = new ArrayList(); - int months = 6; - if((userMessage.length > 3)) { - try { - months = Integer.parseInt(userMessage[3]); - } - catch (NumberFormatException e) { - //months = 6; - } - } - - List categories = guild.getCategories(); - List whitelist = new ArrayList(); - whitelist.add("archiv"); - whitelist.add("geschlossen"); - - //for category... - for(Category category: categories) { - boolean whitelisted = false; - for(String wlcat: whitelist) { - if(category.getName().toLowerCase().contains(wlcat.toLowerCase())) { - whitelisted = true; - } - } - - //if category is not whitelisted... - if(!whitelisted) { - List textChannels = category.getTextChannels(); - Antony.getLogger().info("Searching in Category: " + category); - //for text channel... - for(TextChannel textChannel: textChannels) { - if(guild.getMemberById(message.getJDA().getSelfUser().getId()).hasPermission(textChannel, Permission.VIEW_CHANNEL)) { - Antony.getLogger().debug("Get message history of channel: " + textChannel.getName()); - MessageHistory history = new MessageHistory(textChannel); - List messageList = history.retrievePast(1).complete(); - //Check if channel is empty and older than 2 Weeks - if((messageList.size() < 1) && (textChannel.getTimeCreated().plusWeeks(2).isBefore(OffsetDateTime.now()))) { - channelsToReport.add(textChannel); - Antony.getLogger().debug("Added Channel to Report: " + textChannel.getName()); - } - for (Message msg : messageList) { - //System.out.println(msg.getTimeCreated().toString() + msg.getContentDisplay()); - if(msg.getTimeCreated().plusMonths(6).isBefore(OffsetDateTime.now())) { - channelsToReport.add(textChannel); - } - } - } - } - } - } - - if(channelsToReport.size() > 0) { - StringBuilder output = new StringBuilder(); - output.append("Folgende Kanäle haben keine Posts, die jünger als " + months + " Monate sind oder sie sind leer und älter als 2 Wochen: \n"); - - int counter = 1; - for(TextChannel textChannel: channelsToReport) { - if((output.length() + textChannel.getAsMention().length()) >= 1998) { - channel.sendMessage(output.toString()).queue(); - output.delete(0, output.length()); - } - output.append(textChannel.getAsMention()); - if(counter < channelsToReport.size()) { - output.append(", "); - counter++; - } - } - channel.sendMessage(output.toString()).queue(); - } else { - channel.sendMessage("Ich konnte keine Kanäle finden, deren letzter Post älter als " + months + " Monate ist.").queue(); - } - break; - default: - printHelp(); - break; - } - } else { - printHelp(); - } - break; - default: - printHelp(); - break; - } - } else { - printHelp(); - } - } - - - private void printHelp() { - getChannel().sendMessage("Benutzung:\n" - + Antony.getCmdPrefix() + "channel add [sort, #referenceChannel, @Member] channelName\n" - + Antony.getCmdPrefix() + "channel list (abandoned | verlassen) [monate]").queue(); - } - - - public static TextChannel addChannel(String chanName, Category cat, List members, Member mod, Boolean sort) { - StringBuilder chanTopic = new StringBuilder(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); - LocalDateTime date = LocalDateTime.now(); - - //Create channel with category permissions - TextChannel newChan = cat.createTextChannel(chanName).syncPermissionOverrides().complete(); - - //If there is a channel owner it will be mentioned in the topic - if(members.size() > 0) { - chanTopic.append("Kanal von: "); - } - int counter = 1; - for(Member member : members) { - //Add read/write permission - ArrayList allow = new ArrayList(); - //allow.add(Permission.MESSAGE_READ); - allow.add(Permission.VIEW_CHANNEL); - allow.add(Permission.MESSAGE_SEND); - allow.add(Permission.MESSAGE_ATTACH_FILES); - allow.add(Permission.MESSAGE_EMBED_LINKS); - newChan.getManager().putMemberPermissionOverride(member.getIdLong(), allow, null).complete(); - - //Add name to channel topic - chanTopic.append(member.getEffectiveName()); - if(counter < members.size()) { - chanTopic.append(", "); - } - counter++; - } - - //Add creation date to channel topic - chanTopic.append("\nErstellt: " + date.format(formatter) + " Uhr (von " + mod.getEffectiveName() + ")"); - - //Set channel topic - newChan.getManager().setTopic(chanTopic.toString()).complete(); - - //Send notification to channel owner if necessary - if(members.size() > 0) { - StringBuilder notifyMsg = new StringBuilder(); - - counter = 1; - for(Member member : members) { - notifyMsg.append(member.getAsMention()); - if(counter < members.size()) { - notifyMsg.append(" "); - } - counter++; - } - notifyMsg.append(" hier ist"); - if(members.size() == 1) { - notifyMsg.append(" dein"); - } else { - notifyMsg.append(" euer"); - } - notifyMsg.append(" neuer Kanal. Viel Spaß beim Schreiben 🙂"); - - //TODO catch exception SEVERE: RestAction queue returned failure: [ErrorResponseException] 10008: Unknown Message - newChan.sendMessage(notifyMsg.toString()).complete().delete().queueAfter(10, TimeUnit.MINUTES); - } - - //sort if necessary - if(sort) { - bot.antony.commands.CategoryCmd.sort(cat); - } - - return newChan; - } - - // -------------------------------------------------- - // Getter & Setter - // -------------------------------------------------- - - public TextChannel getChannel() { - return channel; - } - - public void setChannel(TextChannel channel) { - this.channel = channel; - } -} \ No newline at end of file diff --git a/src/main/java/bot/antony/commands/ChannelCmd.java b/src/main/java/bot/antony/commands/ChannelCmd.java new file mode 100644 index 0000000..664bca1 --- /dev/null +++ b/src/main/java/bot/antony/commands/ChannelCmd.java @@ -0,0 +1,275 @@ +package bot.antony.commands; + +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import bot.antony.Antony; +import bot.antony.commands.types.ServerCommand; +import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.Category; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.MessageHistory; +import net.dv8tion.jda.api.entities.TextChannel; + +public class ChannelCmd extends ServerCommand { + + private TextChannel channel; + // -------------------------------------------------- + // Constructor + // -------------------------------------------------- + public ChannelCmd() { + super(); + this.privileged = true; + this.name = "channel"; + this.description = "Mit diesem Befehl lassen sich Kanäle administrieren."; + this.shortDescription = "Befehl zur Administration von Kanälen."; + this.example = "list abandoned"; + this.cmdParams.put("add [sort, #referenceChannel, @Member] channelName", "Legt einen neuen Kanal mit den Berechtigungen der übergeordneten Kategorie an."); + this.cmdParams.put("list (abandoned | verlassen) [monate]", "Listet Kanäle auf."); + } + + // -------------------------------------------------- + // Functions + // -------------------------------------------------- + @Override + public void performCommand(Member member, TextChannel channel, Message message) { + this.channel = channel; + String[] userMessage = message.getContentDisplay().split(" "); + Guild guild = message.getGuild(); + + if (userMessage.length > 1) { + + switch (userMessage[1].toLowerCase()) { + case "add": + + if(userMessage.length > 2) { + String channelName = userMessage[userMessage.length-1]; + TextChannel refChannel = channel; + if(message.getMentions().getChannels(TextChannel.class).size() > 0) { + refChannel = message.getMentions().getChannels(TextChannel.class).get(0); + } + + Boolean sort = false; + if(userMessage[2].equalsIgnoreCase("sort")) { + sort = true; + } + + TextChannel newChan = addChannel(channelName, refChannel.getParentCategory(), message.getMentions().getMembers(), message.getMember(), sort); + + //feedback + channel.sendMessage(newChan.getAsMention() + " wurde angelegt.").complete(); + + } else { + printHelp(channel); + } + + break; + case "list": + + if(userMessage.length > 2) { + switch (userMessage[2].toLowerCase()) { + case "abandoned": + case "verlassen": + channel.sendMessage("Ich prüfe alle Kanäle...").complete(); + Message response = getLatestBotMessage(); + + List channelsToReport = new ArrayList(); + int months = 6; + if((userMessage.length > 3)) { + months = getAbandonedMonths(userMessage[3]); + } + List categories = guild.getCategories(); + + //for category... + int channelCount = 0; + int percentage = 0; + int channelSize = channel.getGuild().getChannels(true).size() - channel.getGuild().getCategories().size(); + for(Category category : categories) { + //if category is not whitelisted... + if(!catIsWhitelisted(category)) { + channelsToReport.addAll(getChannelsToReport(category, months)); + } + channelCount += category.getChannels().size(); + percentage = (int) (channelCount/(double)(channelSize)*100); + response.editMessage("Ich prüfe alle Kanäle: **" + percentage + "%**").complete(); + } + response.editMessage("Ich prüfe alle Kanäle: **100%**").complete(); + printChannelsToReport(channelsToReport, months); + + break; + default: + printHelp(channel); + break; + } + } else { + printHelp(channel); + } + break; + default: + printHelp(channel); + break; + } + } else { + printHelp(channel); + } + } + + public static TextChannel addChannel(String chanName, Category cat, List members, Member mod, Boolean sort) { + StringBuilder chanTopic = new StringBuilder(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); + LocalDateTime date = LocalDateTime.now(); + + //Create channel with category permissions + TextChannel newChan = cat.createTextChannel(chanName).syncPermissionOverrides().complete(); + + //If there is a channel owner it will be mentioned in the topic + if(members.size() > 0) { + chanTopic.append("Kanal von: "); + } + int counter = 1; + for(Member member : members) { + //Add read/write permission + ArrayList allow = new ArrayList(); + //allow.add(Permission.MESSAGE_READ); + allow.add(Permission.VIEW_CHANNEL); + allow.add(Permission.MESSAGE_SEND); + allow.add(Permission.MESSAGE_ATTACH_FILES); + allow.add(Permission.MESSAGE_EMBED_LINKS); + newChan.getManager().putMemberPermissionOverride(member.getIdLong(), allow, null).complete(); + + //Add name to channel topic + chanTopic.append(member.getEffectiveName()); + if(counter < members.size()) { + chanTopic.append(", "); + } + counter++; + } + + //Add creation date to channel topic + chanTopic.append("\nErstellt: " + date.format(formatter) + " Uhr (von " + mod.getEffectiveName() + ")"); + + //Set channel topic + newChan.getManager().setTopic(chanTopic.toString()).complete(); + + //Send notification to channel owner if necessary + if(members.size() > 0) { + StringBuilder notifyMsg = new StringBuilder(); + + counter = 1; + for(Member member : members) { + notifyMsg.append(member.getAsMention()); + if(counter < members.size()) { + notifyMsg.append(" "); + } + counter++; + } + notifyMsg.append(" hier ist"); + if(members.size() == 1) { + notifyMsg.append(" dein"); + } else { + notifyMsg.append(" euer"); + } + notifyMsg.append(" neuer Kanal. Viel Spaß beim Schreiben 🙂"); + + //TODO catch exception SEVERE: RestAction queue returned failure: [ErrorResponseException] 10008: Unknown Message + newChan.sendMessage(notifyMsg.toString()).complete().delete().queueAfter(10, TimeUnit.MINUTES); + } + + //sort if necessary + if(sort) { + bot.antony.commands.CategoryCmd.sort(cat); + } + + return newChan; + } + + private int getAbandonedMonths(String txtSnippet) { + int months = 6; + try { + months = Integer.parseInt(txtSnippet); + } + catch (NumberFormatException e) { + //months = 6; + } + return months; + } + + private boolean catIsWhitelisted(Category category) { + List whitelist = new ArrayList(); + whitelist.add("archiv"); + whitelist.add("geschlossen"); + for(String wlcat: whitelist) { + if(category.getName().toLowerCase().contains(wlcat.toLowerCase())) { + return true; + } + } + return false; + } + + private List getChannelsToReport(Category category, int months){ + List channelsToReport = new ArrayList(); + List textChannels = category.getTextChannels(); + Antony.getLogger().info("Searching in Category: " + category); + //for text channel... + for(TextChannel textChannel: textChannels) { + if(channel.getGuild().getMemberById(channel.getJDA().getSelfUser().getId()).hasPermission(textChannel, Permission.VIEW_CHANNEL)) { + Antony.getLogger().debug("Get message history of channel: " + textChannel.getName()); + MessageHistory history = new MessageHistory(textChannel); + List messageList = history.retrievePast(1).complete(); + //Check if channel is empty and older than 2 Weeks + if(messageList.isEmpty() && textChannel.getTimeCreated().plusWeeks(2).isBefore(OffsetDateTime.now())) { + channelsToReport.add(textChannel); + Antony.getLogger().debug("Added Channel to Report: " + textChannel.getName()); + } else if(!messageList.isEmpty() && messageList.get(0).getTimeCreated().plusMonths(months).isBefore(OffsetDateTime.now())) { + channelsToReport.add(textChannel); + } + } + } + return channelsToReport; + } + + private void printChannelsToReport(List channelsToReport, int months) { + if(!channelsToReport.isEmpty()) { + StringBuilder output = new StringBuilder(); + output.append("Folgende Kanäle haben keine Posts, die jünger als " + months + " Monate sind oder sie sind leer und älter als 2 Wochen: \n"); + + int counter = 1; + for(TextChannel textChannel : channelsToReport) { + if((output.length() + textChannel.getAsMention().length()) >= 1998) { + channel.sendMessage(output.toString()).queue(); + output.delete(0, output.length()); + } + output.append(textChannel.getAsMention()); + if(counter < channelsToReport.size()) { + output.append(", "); + counter++; + } + } + channel.sendMessage(output.toString()).queue(); + } else { + channel.sendMessage("Ich konnte keine Kanäle finden, deren letzter Post älter als " + months + " Monate ist.").queue(); + } + } + + private Message getLatestBotMessage() { + MessageHistory history = new MessageHistory(channel); + List messageList = history.retrievePast(50).complete(); + for(Message msg : messageList) { + if(msg.getAuthor() == channel.getJDA().getSelfUser()) { + return msg; + } + } + return null; + } + + // -------------------------------------------------- + // Getter & Setter + // -------------------------------------------------- + +} \ No newline at end of file diff --git a/src/main/java/bot/antony/commands/aam/AddHBStateMachine.java b/src/main/java/bot/antony/commands/aam/AddHBStateMachine.java index a42bea6..0de9a96 100644 --- a/src/main/java/bot/antony/commands/aam/AddHBStateMachine.java +++ b/src/main/java/bot/antony/commands/aam/AddHBStateMachine.java @@ -110,7 +110,8 @@ private void handleRightsResponsibilities(MessageReactionAddEvent event) { if (event.getReactionEmote().getName().equals("✅")) { rightsResponsibilities = true; event.getTextChannel().retrieveMessageById(initMessageId).queue(msg -> { - msg.reply("Zu welcher Ameisen-Art willst du einen Haltungsbericht führen?") + msg.reply("Zu welcher Ameisen-Art willst du einen Haltungsbericht führen?\n" + + "*Wenn nur die Gattung bekannt ist oder die Art nicht genau bestimmt wurde, nutze bitte \"sp.\" (z.B. Lasius sp.) oder \"cf.\" (z.B. Lasius cf. niger).*") .queue(); }); } else if (event.getReactionEmote().getName().equals("❌")) { @@ -255,7 +256,7 @@ private void handleApproval(MessageReactionAddEvent event) { // add channel List members = new ArrayList(); members.add(event.getGuild().getMemberById(authorId)); - TextChannel newChan = bot.antony.commands.Channel.addChannel( + TextChannel newChan = bot.antony.commands.ChannelCmd.addChannel( antSpecies + "—" + event.getGuild().getMemberById(authorId).getEffectiveName(), hbCategory, members, event.getMember(), true);