From 6519269d74249a00dc6b70fba6c5b054f9293a12 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 20 Jan 2025 16:07:52 +0100 Subject: [PATCH] Add bust to RatsChannel threads --- .../velocitycore/discord/DiscordBot.java | 3 +- .../velocitycore/discord/DiscordConfig.java | 2 + .../discord/channels/RatsChannel.java | 108 ++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java b/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java index 10cb773f..20b8d219 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java @@ -189,7 +189,8 @@ public class DiscordBot { new DiscordTicketHandler(), new DiscordTeamEvent(), new ChannelListener(), - new DiscordSchemUpload() + new DiscordSchemUpload(), + new RatsChannel() ); commandSetup(jda.retrieveCommands().complete(), jda.updateCommands()); diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordConfig.java b/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordConfig.java index af930d77..60a13f88 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordConfig.java +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordConfig.java @@ -56,6 +56,8 @@ public class DiscordConfig { private String ticketcategory; + private Map ratsRoleToThread; + @NoArgsConstructor public static class DiscordRole { diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java new file mode 100644 index 00000000..315d1839 --- /dev/null +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java @@ -0,0 +1,108 @@ +package de.steamwar.velocitycore.discord.channels; + +import de.steamwar.sql.SteamwarUser; +import de.steamwar.velocitycore.discord.DiscordBot; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; +import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleAddEvent; +import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleRemoveEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.utils.AttachedFile; +import net.dv8tion.jda.api.utils.FileUpload; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.*; +import java.util.stream.Collectors; + +public class RatsChannel extends ListenerAdapter { + + private Map ratsChannel = new HashMap<>(); + + public RatsChannel() { + DiscordBot.getInstance().getConfig().getRatsRoleToThread().forEach((roleId, threadId) -> { + Role role = DiscordBot.getGuild().getRoleById(roleId); + if (role != null) return; + ThreadChannel threadChannel = DiscordBot.getGuild().getThreadChannelById(threadId); + if (threadChannel != null) ratsChannel.put(role, threadChannel); + ratsChannel.put(role, threadChannel); + }); + } + + @Override + public void onGuildMemberRoleAdd(@NotNull GuildMemberRoleAddEvent event) { + updateRatsChannel(event.getRoles()); + } + + @Override + public void onGuildMemberRoleRemove(@NotNull GuildMemberRoleRemoveEvent event) { + updateRatsChannel(event.getRoles()); + } + + private void updateRatsChannel(List roles) { + for (Role role : roles) { + if (!ratsChannel.containsKey(role)) continue; + ThreadChannel channel = ratsChannel.get(role); + + List> ratMembers = loadImages(role) + .entrySet() + .stream() + .sorted(Comparator.comparing(value -> value.getKey().getUserName())) + .collect(Collectors.toList()); + + List messages = new ArrayList<>(channel.getHistory() + .retrievePast(100) + .complete()); + // Need to reverse since they are provided from newest (0) to latest (size() - 1) + Collections.reverse(messages); + + Iterator iterator = messages.iterator(); + if (!iterator.hasNext()) { + channel.sendMessage("# Ratsmitglieder") + .queue(); + } else { + iterator.next(); + } + + for (Map.Entry entry : ratMembers) { + if (iterator.hasNext()) { + Message message = iterator.next(); + if (message.getContentRaw().startsWith("# " + entry.getKey().getUserName())) { + continue; + } + + message.editMessage("## " + entry.getKey().getUserName()) + .setAttachments(AttachedFile.fromData(entry.getValue(), entry.getKey().getUUID().toString() + ".png")) + .queue(); + } else { + channel.sendMessage("## " + entry.getKey().getUserName()) + .addFiles(FileUpload.fromData(entry.getValue(), entry.getKey().getUUID().toString() + ".png")) + .queue(); + } + } + + while (iterator.hasNext()) { + iterator.next().delete().queue(); + } + } + } + + private Map loadImages(Role role) { + Map images = new HashMap<>(); + for (Member member : DiscordBot.getGuild().getMembersWithRoles(role)) { + SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong()); + if (steamwarUser == null) continue; + + try { + images.put(steamwarUser, new URL("api.steamwar.de/data/skin/" + steamwarUser.getUUID().toString()).openStream()); + } catch (IOException e) { + images.put(steamwarUser, null); + } + } + return images; + } +}