diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java index 6940463888..27a2330193 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java @@ -106,7 +106,7 @@ public static Collection createFeatures(JDA jda, Database database, Con // Event receivers features.add(new RejoinModerationRoleListener(actionsStore, config)); - features.add(new OnGuildLeaveCloseThreadListener(database)); + features.add(new GuildLeaveCloseThreadListener(config)); features.add(new LeftoverBookmarksListener(bookmarksSystem)); features.add(new HelpThreadCreatedListener(helpSystemHelper)); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/GuildLeaveCloseThreadListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/GuildLeaveCloseThreadListener.java new file mode 100644 index 0000000000..0e3f11fb18 --- /dev/null +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/GuildLeaveCloseThreadListener.java @@ -0,0 +1,42 @@ +package org.togetherjava.tjbot.commands.help; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; + +import org.togetherjava.tjbot.commands.EventReceiver; +import org.togetherjava.tjbot.config.Config; + +/** + * Remove all thread channels associated to a user when they leave the guild. + */ +public final class GuildLeaveCloseThreadListener extends ListenerAdapter implements EventReceiver { + private final String helpForumPattern; + + /** + * Creates a new instance. + * + * @param config the config to get help forum channel pattern from + */ + public GuildLeaveCloseThreadListener(Config config) { + this.helpForumPattern = config.getHelpSystem().getHelpForumPattern(); + } + + @Override + public void onGuildMemberRemove(GuildMemberRemoveEvent event) { + MessageEmbed embed = new EmbedBuilder().setTitle("OP left") + .setDescription("Closing thread...") + .setColor(HelpSystemHelper.AMBIENT_COLOR) + .build(); + + event.getGuild() + .retrieveActiveThreads() + .queue(threads -> threads.stream() + .filter(thread -> thread.getOwnerIdLong() == event.getUser().getIdLong()) + .filter(thread -> thread.getParentChannel().getName().matches(helpForumPattern)) + .forEach(thread -> thread.sendMessageEmbeds(embed) + .flatMap(any -> thread.getManager().setArchived(true)) + .queue())); + } +} diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/OnGuildLeaveCloseThreadListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/OnGuildLeaveCloseThreadListener.java deleted file mode 100644 index 19eb37b3d6..0000000000 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/OnGuildLeaveCloseThreadListener.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.togetherjava.tjbot.commands.help; - -import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.MessageEmbed; -import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; -import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.togetherjava.tjbot.commands.EventReceiver; -import org.togetherjava.tjbot.db.Database; - -import java.util.HashSet; -import java.util.Set; - -import static org.togetherjava.tjbot.db.generated.tables.HelpThreads.HELP_THREADS; - -/** - * Remove all thread channels associated to a user when they leave the guild. - */ -public final class OnGuildLeaveCloseThreadListener extends ListenerAdapter - implements EventReceiver { - private static final Logger logger = - LoggerFactory.getLogger(OnGuildLeaveCloseThreadListener.class); - private final Database database; - - /** - * Creates a new instance. - * - * @param database database to use - */ - public OnGuildLeaveCloseThreadListener(Database database) { - this.database = database; - } - - @Override - public void onGuildMemberRemove(GuildMemberRemoveEvent leaveEvent) { - Set channelIds = fetchThreadsByLeaver(leaveEvent.getUser().getIdLong()); - for (long channelId : channelIds) { - closeThread(channelId, leaveEvent.getGuild()); - } - } - - private Set fetchThreadsByLeaver(long leaverId) { - return new HashSet<>( - database.readTransaction(context -> context.select(HELP_THREADS.CHANNEL_ID)) - .from(HELP_THREADS) - .where(HELP_THREADS.AUTHOR_ID.eq(leaverId)) - .fetch(databaseMapper -> databaseMapper.getValue(HELP_THREADS.CHANNEL_ID))); - } - - private void closeThread(long channelId, Guild guild) { - ThreadChannel threadChannel = guild.getThreadChannelById(channelId); - if (threadChannel == null) { - logger.warn( - "Attempted to archive thread id: '{}' but could not find thread in guild: '{}'.", - channelId, guild.getName()); - return; - } - if (threadChannel.isArchived()) { - logger.debug( - "Attempted to archive thread id: '{}' in guild: '{}' but thread is already closed.", - channelId, guild.getName()); - return; - } - - MessageEmbed embed = new EmbedBuilder().setTitle("OP left") - .setDescription("Closing thread...") - .setColor(HelpSystemHelper.AMBIENT_COLOR) - .build(); - threadChannel.sendMessageEmbeds(embed) - .flatMap(any -> threadChannel.getManager().setArchived(true)) - .queue(); - } -}