Add bust to RatsChannel threads

This commit is contained in:
2025-01-20 16:07:52 +01:00
parent ee705792bf
commit 6519269d74
3 changed files with 112 additions and 1 deletions
@@ -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());
@@ -56,6 +56,8 @@ public class DiscordConfig {
private String ticketcategory;
private Map<String, String> ratsRoleToThread;
@NoArgsConstructor
public static class DiscordRole {
@@ -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<Role, ThreadChannel> 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<Role> roles) {
for (Role role : roles) {
if (!ratsChannel.containsKey(role)) continue;
ThreadChannel channel = ratsChannel.get(role);
List<Map.Entry<SteamwarUser, InputStream>> ratMembers = loadImages(role)
.entrySet()
.stream()
.sorted(Comparator.comparing(value -> value.getKey().getUserName()))
.collect(Collectors.toList());
List<Message> 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<Message> iterator = messages.iterator();
if (!iterator.hasNext()) {
channel.sendMessage("# Ratsmitglieder")
.queue();
} else {
iterator.next();
}
for (Map.Entry<SteamwarUser, InputStream> 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<SteamwarUser, InputStream> loadImages(Role role) {
Map<SteamwarUser, InputStream> 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;
}
}