Skip to content

Commit a6bc40d

Browse files
Implemented automatic post-closing upon user leaving
1 parent d4e7df8 commit a6bc40d

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

src/main/java/net/javadiscord/javabot/listener/UserLeaveListener.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
11
package net.javadiscord.javabot.listener;
22

3+
import lombok.extern.slf4j.Slf4j;
34
import net.dv8tion.jda.api.entities.Guild;
45
import net.dv8tion.jda.api.entities.User;
6+
import net.dv8tion.jda.api.entities.UserSnowflake;
7+
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
8+
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
59
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
610
import net.dv8tion.jda.api.hooks.ListenerAdapter;
711
import net.javadiscord.javabot.data.config.BotConfig;
812

913
import lombok.RequiredArgsConstructor;
14+
import net.javadiscord.javabot.data.config.guild.HelpConfig;
15+
import net.javadiscord.javabot.data.h2db.DbActions;
16+
import net.javadiscord.javabot.systems.help.HelpManager;
17+
import net.javadiscord.javabot.systems.help.dao.HelpAccountRepository;
18+
import net.javadiscord.javabot.systems.help.dao.HelpTransactionRepository;
1019
import org.jetbrains.annotations.NotNull;
1120

1221
/**
1322
* Listens for the {@link GuildMemberRemoveEvent}.
1423
*/
24+
@Slf4j
1525
@RequiredArgsConstructor
1626
public class UserLeaveListener extends ListenerAdapter {
27+
private final DbActions dbActions;
1728
private final BotConfig botConfig;
29+
private final HelpAccountRepository helpAccountRepository;
30+
private final HelpTransactionRepository helpTransactionRepository;
1831

1932
@Override
2033
public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {
@@ -31,6 +44,18 @@ public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {
3144
* @param guild The guild they're leaving.
3245
*/
3346
private void unreserveAllChannels(User user, Guild guild) {
34-
// TODO: Implement Forum
47+
HelpConfig config = botConfig.get(guild).getHelpConfig();
48+
ForumChannel forum = config.getHelpForumChannel();
49+
if (forum != null) {
50+
for (ThreadChannel post : forum.getThreadChannels()) {
51+
if (post.isArchived() || post.isLocked()) continue;
52+
if (post.getOwnerIdLong() == user.getIdLong()) {
53+
HelpManager manager = new HelpManager(post, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
54+
manager.close(UserSnowflake.fromId(guild.getSelfMember().getIdLong()), "User left the server");
55+
}
56+
}
57+
} else {
58+
log.warn("Could not find forum channel for guild {}", guild.getName());
59+
}
3560
}
3661
}

src/main/java/net/javadiscord/javabot/systems/help/HelpManager.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import lombok.Getter;
44
import lombok.RequiredArgsConstructor;
5+
import net.dv8tion.jda.api.EmbedBuilder;
56
import net.dv8tion.jda.api.entities.Guild;
67
import net.dv8tion.jda.api.entities.Member;
78
import net.dv8tion.jda.api.entities.Message;
9+
import net.dv8tion.jda.api.entities.MessageEmbed;
810
import net.dv8tion.jda.api.entities.User;
11+
import net.dv8tion.jda.api.entities.UserSnowflake;
912
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
1013
import net.dv8tion.jda.api.entities.emoji.Emoji;
1114
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
@@ -107,6 +110,17 @@ public void close(IReplyCallback callback, boolean withHelpers, @Nullable String
107110
.queue(s -> postThread.getManager().setLocked(true).setArchived(true).queue());
108111
}
109112

113+
/**
114+
* Closes the {@link HelpManager#postThread}.
115+
*
116+
* @param closedBy The {@link UserSnowflake} that closed this post.
117+
* @param reason The reason for closing this post.
118+
*/
119+
public void close(UserSnowflake closedBy, @Nullable String reason) {
120+
postThread.sendMessageEmbeds(buildPostClosedEmbed(closedBy, reason))
121+
.queue(s -> postThread.getManager().setLocked(true).setArchived(true).queue());
122+
}
123+
110124
/**
111125
* Thanks a single user.
112126
*
@@ -154,6 +168,14 @@ public boolean isForumEligibleToBeUnreserved(@NotNull Interaction interaction) {
154168
hasMemberHelperRole(interaction.getGuild(), interaction.getMember()) || hasMemberStaffRole(interaction.getGuild(), interaction.getMember());
155169
}
156170

171+
private @NotNull MessageEmbed buildPostClosedEmbed(@NotNull UserSnowflake closedBy, @Nullable String reason) {
172+
return new EmbedBuilder()
173+
.setTitle("Post Closed")
174+
.setDescription("This post has been closed by %s%s".formatted(closedBy.getAsMention(), reason != null ? " for the following reason:\n> " + reason : "."))
175+
.setColor(Responses.Type.INFO.getColor())
176+
.build();
177+
}
178+
157179
private boolean hasMemberStaffRole(@NotNull Guild guild, @Nullable Member member) {
158180
return member != null && member.getRoles().contains(botConfig.get(guild).getModerationConfig().getStaffRole());
159181
}

0 commit comments

Comments
 (0)