From 90ebc93b140e6440e1c6bad167197c38260c34a5 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 20 Jan 2025 16:44:24 +0100 Subject: [PATCH] Add bust to RatsChannel threads --- .../velocitycore/discord/DiscordBot.java | 11 +- .../discord/channels/DiscordChannel.java | 10 +- .../discord/channels/RatsChannel.java | 123 ++++++------------ .../channels/StaticMessageChannel.java | 12 ++ 4 files changed, 68 insertions(+), 88 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java b/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java index 20b8d219..1c7bfa4f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/DiscordBot.java @@ -38,6 +38,7 @@ import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; @@ -190,9 +191,17 @@ public class DiscordBot { new DiscordTeamEvent(), new ChannelListener(), new DiscordSchemUpload(), - new RatsChannel() + new RatsChannel.RastChannelListener() ); + config.getRatsRoleToThread().forEach((roleId, threadId) -> { + Role role = DiscordBot.getGuild().getRoleById(roleId); + if (role == null) return; + ThreadChannel threadChannel = DiscordBot.getGuild().getThreadChannelById(threadId); + if (threadChannel == null) return; + new RatsChannel(role, threadChannel); + }); + commandSetup(jda.retrieveCommands().complete(), jda.updateCommands()); } diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/DiscordChannel.java b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/DiscordChannel.java index 35e78714..3440e1f5 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/DiscordChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/DiscordChannel.java @@ -19,11 +19,11 @@ package de.steamwar.velocitycore.discord.channels; -import de.steamwar.velocitycore.discord.DiscordBot; -import de.steamwar.velocitycore.discord.listeners.ChannelListener; import de.steamwar.messages.Chatter; import de.steamwar.messages.Message; import de.steamwar.sql.SteamwarUser; +import de.steamwar.velocitycore.discord.DiscordBot; +import de.steamwar.velocitycore.discord.listeners.ChannelListener; import lombok.AllArgsConstructor; import lombok.Getter; import net.dv8tion.jda.api.entities.User; @@ -31,7 +31,6 @@ import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; -import net.dv8tion.jda.api.utils.messages.MessageCreateData; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; @@ -57,6 +56,11 @@ public class DiscordChannel extends Chatter.PlayerlessChatter { ChannelListener.getChannels().put(this.channel, this); } + public DiscordChannel(MessageChannel channel) { + this(SteamwarUser.get(-1), channel); + ChannelListener.getChannels().put(this.channel, this); + } + public void send(String message) { send(new MessageCreateBuilder() .setContent(message diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java index 315d1839..7f8e9e44 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/RatsChannel.java @@ -2,107 +2,62 @@ package de.steamwar.velocitycore.discord.channels; import de.steamwar.sql.SteamwarUser; import de.steamwar.velocitycore.discord.DiscordBot; +import net.dv8tion.jda.api.EmbedBuilder; 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 net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; 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; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -public class RatsChannel extends ListenerAdapter { +public class RatsChannel extends StaticMessageChannel { - private Map ratsChannel = new HashMap<>(); + private static Map listener = 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); - }); - } + public RatsChannel(Role role, ThreadChannel threadChannel) { + super(threadChannel, () -> { + MessageCreateBuilder messageCreateBuilder = new MessageCreateBuilder(); + messageCreateBuilder.setContent("# Ratsmitglieder"); - @Override - public void onGuildMemberRoleAdd(@NotNull GuildMemberRoleAddEvent event) { - updateRatsChannel(event.getRoles()); - } + for (Member member : DiscordBot.getGuild().getMembersWithRoles(role)) { + SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong()); + if (steamwarUser == null) continue; - @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(); + messageCreateBuilder.addEmbeds(new EmbedBuilder() + .setTitle(steamwarUser.getUserName()) + .setImage("api.steamwar.de/data/skin/" + steamwarUser.getUUID().toString()) + .build()); } - for (Map.Entry entry : ratMembers) { - if (iterator.hasNext()) { - Message message = iterator.next(); - if (message.getContentRaw().startsWith("# " + entry.getKey().getUserName())) { - continue; - } + return messageCreateBuilder; + }, genericComponentInteractionCreateEvent -> {}); - 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(); + listener.put(role, this); + } + + public static class RastChannelListener extends ListenerAdapter { + @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) { + roles.forEach(role -> { + if (listener.containsKey(role)) { + listener.get(role).update(); } - } - - 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; - } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/StaticMessageChannel.java b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/StaticMessageChannel.java index 3a165915..0db34fc8 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/discord/channels/StaticMessageChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/discord/channels/StaticMessageChannel.java @@ -21,6 +21,7 @@ package de.steamwar.velocitycore.discord.channels; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent; import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; import net.dv8tion.jda.api.utils.messages.MessageEditData; @@ -55,6 +56,17 @@ public class StaticMessageChannel extends DiscordChannel { update(); } + public StaticMessageChannel(MessageChannel channel, Supplier supplier, Consumer interaction) { + super(channel); + this.supplier = supplier; + this.interaction = interaction; + + if(getChannel().getLatestMessageIdLong() != 0) + message = getChannel().getIterableHistory().complete().stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null); + + update(); + } + public void update() { if (message == null) { getChannel().sendMessage(supplier.get().build()).queue(m -> message = m);