Skip to content

Commit 218e30e

Browse files
Implemented automatic post closing
1 parent 0d0119b commit 218e30e

File tree

8 files changed

+74
-24
lines changed

8 files changed

+74
-24
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import net.javadiscord.javabot.annotations.PreRegisteredListener;
1414
import net.javadiscord.javabot.data.config.BotConfig;
1515
import net.javadiscord.javabot.data.h2db.DbActions;
16-
import net.javadiscord.javabot.systems.help.ChannelSemanticCheck;
16+
import net.javadiscord.javabot.systems.help.checks.ChannelSemanticCheck;
1717
import net.javadiscord.javabot.systems.help.HelpExperienceService;
1818
import net.javadiscord.javabot.systems.notification.NotificationService;
1919
import net.javadiscord.javabot.systems.staff_commands.tags.CustomTagManager;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package net.javadiscord.javabot.systems.help;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import net.dv8tion.jda.api.JDA;
6+
import net.dv8tion.jda.api.entities.Guild;
7+
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
8+
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
9+
import net.javadiscord.javabot.data.config.BotConfig;
10+
import net.javadiscord.javabot.data.config.GuildConfig;
11+
import net.javadiscord.javabot.data.config.guild.HelpConfig;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.springframework.scheduling.annotation.Scheduled;
14+
import org.springframework.stereotype.Service;
15+
16+
import java.time.OffsetDateTime;
17+
18+
/**
19+
* Loops through all guilds and updates the corresponding help forum channel, closing inactive ones.
20+
*/
21+
@Slf4j
22+
@Service
23+
@RequiredArgsConstructor
24+
public class HelpChannelUpdater {
25+
private final JDA jda;
26+
private final BotConfig botConfig;
27+
28+
/**
29+
* Updates all help channels.
30+
*/
31+
@Scheduled(cron = "0 * * * * *") // Hourly
32+
public void execute() {
33+
for (Guild guild : jda.getGuilds()) {
34+
log.info("Updating help channels in {}", guild.getName());
35+
GuildConfig config = botConfig.get(guild);
36+
ForumChannel forum = config.getHelpForumConfig().getHelpForumChannel();
37+
if (forum != null) {
38+
for (ThreadChannel post : forum.getThreadChannels()) {
39+
if (post.isArchived() || post.isLocked()) continue;
40+
checkForumPost(post, config.getHelpConfig());
41+
}
42+
}
43+
}
44+
}
45+
46+
private void checkForumPost(@NotNull ThreadChannel post, HelpConfig config) {
47+
post.retrieveMessageById(post.getLatestMessageId()).queue(latest -> {
48+
if (latest.getTimeCreated().plusMinutes(300).isBefore(OffsetDateTime.now())) {
49+
post.sendMessage(config.getDormantChannelMessage()).queue(s ->
50+
post.getManager().setLocked(true).setArchived(true).queue());
51+
}
52+
});
53+
}
54+
}

src/main/java/net/javadiscord/javabot/systems/help/ForumHelpListener.java renamed to src/main/java/net/javadiscord/javabot/systems/help/HelpListener.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import xyz.dynxsty.dih4jda.interactions.components.ButtonHandler;
3434
import xyz.dynxsty.dih4jda.util.ComponentIdBuilder;
3535

36-
import javax.sql.DataSource;
3736
import java.util.ArrayList;
3837
import java.util.HashMap;
3938
import java.util.List;
@@ -43,16 +42,15 @@
4342
* Listens for all events releated to the forum help channel system.
4443
*/
4544
@RequiredArgsConstructor
46-
@AutoDetectableComponentHandler({ForumHelpManager.HELP_THANKS_IDENTIFIER, ForumHelpManager.HELP_CLOSE_IDENTIFIER, ForumHelpManager.HELP_GUIDELINES_IDENTIFIER})
47-
public class ForumHelpListener extends ListenerAdapter implements ButtonHandler {
45+
@AutoDetectableComponentHandler({HelpManager.HELP_THANKS_IDENTIFIER, HelpManager.HELP_CLOSE_IDENTIFIER, HelpManager.HELP_GUIDELINES_IDENTIFIER})
46+
public class HelpListener extends ListenerAdapter implements ButtonHandler {
4847

4948
/**
5049
* A static Map that holds all messages that was sent in a specific reserved forum channel.
5150
*/
5251
public static final Map<Long, List<Message>> HELP_POST_MESSAGES = new HashMap<>();
5352

5453
private final BotConfig botConfig;
55-
private final DataSource dataSource;
5654
private final HelpAccountRepository helpAccountRepository;
5755
private final HelpTransactionRepository helpTransactionRepository;
5856
private final UserPreferenceService userPreferenceService;
@@ -92,8 +90,8 @@ public void onChannelCreate(@NotNull ChannelCreateEvent event) {
9290
}
9391
// send post buttons
9492
post.sendMessageComponents(ActionRow.of(
95-
Button.primary(ComponentIdBuilder.build(ForumHelpManager.HELP_CLOSE_IDENTIFIER, post.getIdLong()), "Close Post"),
96-
Button.secondary(ComponentIdBuilder.build(ForumHelpManager.HELP_GUIDELINES_IDENTIFIER), "View Help Guidelines")
93+
Button.primary(ComponentIdBuilder.build(HelpManager.HELP_CLOSE_IDENTIFIER, post.getIdLong()), "Close Post"),
94+
Button.secondary(ComponentIdBuilder.build(HelpManager.HELP_GUIDELINES_IDENTIFIER), "View Help Guidelines")
9795
)).queue(success -> {
9896
// send /close reminder (if enabled)
9997
UserPreference preference = userPreferenceService.getOrCreate(post.getOwnerIdLong(), Preference.FORUM_CLOSE_REMINDER);
@@ -113,11 +111,11 @@ public void handleButton(@NotNull ButtonInteractionEvent event, @NotNull Button
113111
return;
114112
}
115113
ThreadChannel post = event.getChannel().asThreadChannel();
116-
ForumHelpManager manager = new ForumHelpManager(post, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
114+
HelpManager manager = new HelpManager(post, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
117115
switch (id[0]) {
118-
case ForumHelpManager.HELP_THANKS_IDENTIFIER -> handleHelpThanksInteraction(event, manager, id);
119-
case ForumHelpManager.HELP_GUIDELINES_IDENTIFIER -> handleReplyGuidelines(event, post.getParentChannel().asForumChannel());
120-
case ForumHelpManager.HELP_CLOSE_IDENTIFIER -> handlePostClose(event, manager);
116+
case HelpManager.HELP_THANKS_IDENTIFIER -> handleHelpThanksInteraction(event, manager, id);
117+
case HelpManager.HELP_GUIDELINES_IDENTIFIER -> handleReplyGuidelines(event, post.getParentChannel().asForumChannel());
118+
case HelpManager.HELP_CLOSE_IDENTIFIER -> handlePostClose(event, manager);
121119
}
122120
}
123121

@@ -131,7 +129,7 @@ private boolean isInvalidHelpForumChannel(@NotNull ForumChannel forum) {
131129
return config.getHelpForumChannelId() != forum.getIdLong();
132130
}
133131

134-
private void handleHelpThanksInteraction(@NotNull ButtonInteractionEvent event, @NotNull ForumHelpManager manager, String @NotNull [] id) {
132+
private void handleHelpThanksInteraction(@NotNull ButtonInteractionEvent event, @NotNull HelpManager manager, String @NotNull [] id) {
135133
ThreadChannel post = manager.getPostThread();
136134
HelpConfig config = botConfig.get(event.getGuild()).getHelpConfig();
137135
if (event.getUser().getIdLong() != post.getOwnerIdLong()) {
@@ -148,7 +146,7 @@ private void handleHelpThanksInteraction(@NotNull ButtonInteractionEvent event,
148146
// add experience
149147
try {
150148
HelpExperienceService service = new HelpExperienceService(botConfig, helpAccountRepository, helpTransactionRepository);
151-
Map<Long, Double> experience = ForumHelpManager.calculateExperience(HELP_POST_MESSAGES.get(post.getIdLong()), post.getOwnerIdLong(), config);
149+
Map<Long, Double> experience = HelpManager.calculateExperience(HELP_POST_MESSAGES.get(post.getIdLong()), post.getOwnerIdLong(), config);
152150
for (Map.Entry<Long, Double> entry : experience.entrySet()) {
153151
service.performTransaction(entry.getKey(), entry.getValue(), config.getGuild());
154152
}
@@ -176,7 +174,7 @@ private void handleReplyGuidelines(@NotNull IReplyCallback callback, @NotNull Fo
176174
.queue();
177175
}
178176

179-
private void handlePostClose(ButtonInteractionEvent event, @NotNull ForumHelpManager manager) {
177+
private void handlePostClose(ButtonInteractionEvent event, @NotNull HelpManager manager) {
180178
if (manager.isForumEligibleToBeUnreserved(event)) {
181179
manager.close(event, event.getUser().getIdLong() == manager.getPostThread().getOwnerIdLong(), null);
182180
} else {

src/main/java/net/javadiscord/javabot/systems/help/ForumHelpManager.java renamed to src/main/java/net/javadiscord/javabot/systems/help/HelpManager.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* Manages all interactions regarding the help forum system.
4040
*/
4141
@RequiredArgsConstructor
42-
public class ForumHelpManager {
42+
public class HelpManager {
4343
/**
4444
* The identifier used for all help thanks-related buttons.
4545
*/
@@ -65,7 +65,7 @@ public class ForumHelpManager {
6565

6666
/**
6767
* Builds and replies {@link ActionRow}s with all members which helped the
68-
* owner of the {@link ForumHelpManager#postThread} forum post.
68+
* owner of the {@link HelpManager#postThread} forum post.
6969
*
7070
* @param callback The callback to reply to.
7171
* @param helpers The list of helpers to thank.
@@ -91,7 +91,7 @@ public ReplyCallbackAction replyHelpThanks(IReplyCallback callback, @NotNull Lis
9191
}
9292

9393
/**
94-
* Closes the {@link ForumHelpManager#postThread}.
94+
* Closes the {@link HelpManager#postThread}.
9595
*
9696
* @param callback The callback to reply to.
9797
* @param withHelpers Whether the help-thanks message should be displayed.
@@ -164,7 +164,7 @@ private boolean hasMemberHelperRole(@NotNull Guild guild, @Nullable Member membe
164164
}
165165

166166
private @NotNull List<Member> getPostHelpers() {
167-
List<Message> messages = ForumHelpListener.HELP_POST_MESSAGES.get(postThread.getIdLong());
167+
List<Message> messages = HelpListener.HELP_POST_MESSAGES.get(postThread.getIdLong());
168168
if (messages == null) return List.of();
169169
return messages.stream()
170170
.filter(m -> m.getMember() != null && m.getAuthor().getIdLong() != postThread.getOwnerIdLong())

src/main/java/net/javadiscord/javabot/systems/help/ChannelSemanticCheck.java renamed to src/main/java/net/javadiscord/javabot/systems/help/checks/ChannelSemanticCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.javadiscord.javabot.systems.help;
1+
package net.javadiscord.javabot.systems.help.checks;
22

33
import net.dv8tion.jda.api.entities.Message;
44
import net.dv8tion.jda.api.entities.User;

src/main/java/net/javadiscord/javabot/systems/help/ChannelSemanticData.java renamed to src/main/java/net/javadiscord/javabot/systems/help/checks/ChannelSemanticData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.javadiscord.javabot.systems.help;
1+
package net.javadiscord.javabot.systems.help.checks;
22

33
import net.dv8tion.jda.api.entities.Message;
44
import net.dv8tion.jda.api.entities.User;

src/main/java/net/javadiscord/javabot/systems/help/checks/SimpleGreetingCheck.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
66
import net.dv8tion.jda.api.requests.RestAction;
77
import net.dv8tion.jda.internal.requests.CompletedRestAction;
8-
import net.javadiscord.javabot.systems.help.ChannelSemanticCheck;
9-
import net.javadiscord.javabot.systems.help.ChannelSemanticData;
108
import org.jetbrains.annotations.NotNull;
119
import org.springframework.stereotype.Component;
1210

src/main/java/net/javadiscord/javabot/systems/help/commands/UnreserveCommand.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import net.javadiscord.javabot.data.h2db.DbActions;
1212
import net.javadiscord.javabot.systems.help.dao.HelpAccountRepository;
1313
import net.javadiscord.javabot.systems.help.dao.HelpTransactionRepository;
14-
import net.javadiscord.javabot.systems.help.ForumHelpManager;
14+
import net.javadiscord.javabot.systems.help.HelpManager;
1515
import net.javadiscord.javabot.util.Responses;
1616
import org.jetbrains.annotations.NotNull;
1717
import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand;
@@ -55,7 +55,7 @@ public void execute(@NotNull SlashCommandInteractionEvent event) {
5555
if (postThread.getParentChannel().getType() != ChannelType.FORUM) {
5656
replyInvalidChannel(event);
5757
}
58-
ForumHelpManager manager = new ForumHelpManager(postThread, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
58+
HelpManager manager = new HelpManager(postThread, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
5959
if (manager.isForumEligibleToBeUnreserved(event.getInteraction())) {
6060
manager.close(event, event.getUser().getIdLong() == postThread.getOwnerIdLong(),
6161
event.getOption("reason", null, OptionMapping::getAsString)

0 commit comments

Comments
 (0)