Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ public static Collection<Feature> createFeatures(JDA jda, Database database, Con
HelpSystemHelper helpSystemHelper = new HelpSystemHelper(config, database, chatGptService);
HelpThreadLifecycleListener helpThreadLifecycleListener =
new HelpThreadLifecycleListener(helpSystemHelper, database);
HelpThreadCreatedListener helpThreadCreatedListener =
new HelpThreadCreatedListener(helpSystemHelper);
TopHelpersService topHelpersService = new TopHelpersService(database);
TopHelpersAssignmentRoutine topHelpersAssignmentRoutine =
new TopHelpersAssignmentRoutine(config, topHelpersService);
Expand Down Expand Up @@ -173,7 +175,7 @@ public static Collection<Feature> createFeatures(JDA jda, Database database, Con
features.add(new RejoinModerationRoleListener(actionsStore, config));
features.add(new GuildLeaveCloseThreadListener(config));
features.add(new LeftoverBookmarksListener(bookmarksSystem));
features.add(new HelpThreadCreatedListener(helpSystemHelper));
features.add(helpThreadCreatedListener);
features.add(new HelpThreadLifecycleListener(helpSystemHelper, database));
features.add(new ProjectsThreadCreatedListener(config));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,18 @@
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.utils.TimeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.togetherjava.tjbot.features.Routine;
import org.togetherjava.tjbot.features.UserInteractionType;
import org.togetherjava.tjbot.features.UserInteractor;
import org.togetherjava.tjbot.features.componentids.ComponentIdGenerator;
import org.togetherjava.tjbot.features.componentids.ComponentIdInteractor;

import java.time.Duration;
import java.time.Instant;
Expand All @@ -27,12 +33,16 @@
* Routine, which periodically checks all help threads and archives them if there has not been any
* recent activity.
*/
public final class HelpThreadAutoArchiver implements Routine {
public final class HelpThreadAutoArchiver implements Routine, UserInteractor {
private static final Logger logger = LoggerFactory.getLogger(HelpThreadAutoArchiver.class);
private static final int SCHEDULE_MINUTES = 60;
private static final Duration ARCHIVE_AFTER_INACTIVITY_OF = Duration.ofHours(12);
private static final String MARK_ACTIVE_LABEL = "Mark Active";
private static final String MARK_ACTIVE_ID = "mark-active";

private final HelpSystemHelper helper;
private final ComponentIdInteractor inactivityInteractor =
new ComponentIdInteractor(getInteractionType(), getName());

/**
* Creates a new instance.
Expand All @@ -43,6 +53,41 @@ public HelpThreadAutoArchiver(HelpSystemHelper helper) {
this.helper = helper;
}

@Override
public String getName() {
return "help-thread-auto-archiver";
}

@Override
public UserInteractionType getInteractionType() {
return UserInteractionType.OTHER;
}

@Override
public void acceptComponentIdGenerator(ComponentIdGenerator generator) {
inactivityInteractor.acceptComponentIdGenerator(generator);
}

@Override
public void onButtonClick(ButtonInteractionEvent event, List<String> args) {
onMarkActiveButton(event);
}

private void onMarkActiveButton(ButtonInteractionEvent event) {
event.reply("You have marked the thread as active.").setEphemeral(true).queue();

ThreadChannel thread = event.getChannel().asThreadChannel();
Message botClosedThreadMessage = event.getMessage();

thread.getManager()
.setArchived(false)
.flatMap(_ -> botClosedThreadMessage.delete())
.queue();

logger.debug("Thread {} was manually reactivated via button by user {}", thread.getId(),
event.getUser().getId());
}

@Override
public Schedule createSchedule() {
return new Schedule(ScheduleMode.FIXED_RATE, 0, SCHEDULE_MINUTES, TimeUnit.MINUTES);
Expand Down Expand Up @@ -88,8 +133,8 @@ private void autoArchiveForThread(ThreadChannel threadChannel) {
"""
Your question has been closed due to inactivity.

If it was not resolved yet, feel free to just post a message below
to reopen it, or create a new thread.
If it was not resolved yet, **click the button below** to keep it
open, or feel free to create a new thread.

Note that usually the reason for nobody calling back is that your
question may have been not well asked and hence no one felt confident
Expand Down Expand Up @@ -131,11 +176,16 @@ private void handleArchiveFlow(ThreadChannel threadChannel, MessageEmbed embed)
private void triggerArchiveFlow(ThreadChannel threadChannel, long authorId,
MessageEmbed embed) {

String markActiveId = inactivityInteractor.generateComponentId(MARK_ACTIVE_ID);

Function<Member, RestAction<Message>> sendEmbedWithMention =
member -> threadChannel.sendMessage(member.getAsMention()).addEmbeds(embed);
member -> threadChannel.sendMessage(member.getAsMention())
.addEmbeds(embed)
.addActionRow(Button.primary(markActiveId, MARK_ACTIVE_LABEL));

Supplier<RestAction<Message>> sendEmbedWithoutMention =
() -> threadChannel.sendMessageEmbeds(embed);
() -> threadChannel.sendMessageEmbeds(embed)
.addActionRow(Button.primary(markActiveId, MARK_ACTIVE_LABEL));

threadChannel.getGuild()
.retrieveMemberById(authorId)
Expand All @@ -161,8 +211,12 @@ private void triggerAuthorIdNotFoundArchiveFlow(ThreadChannel threadChannel,
logger.info(
"Was unable to find a matching thread for id: {} in DB, archiving thread without mentioning OP",
threadChannel.getId());

String markActiveId = inactivityInteractor.generateComponentId(MARK_ACTIVE_ID);

threadChannel.sendMessageEmbeds(embed)
.flatMap(sentEmbed -> threadChannel.getManager().setArchived(true))
.addActionRow(Button.primary(markActiveId, MARK_ACTIVE_LABEL))
.flatMap(_ -> threadChannel.getManager().setArchived(true))
.queue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,10 @@ private Consumer<Throwable> handleParentMessageDeleted(Member user, ThreadChanne

@Override
public void onButtonClick(ButtonInteractionEvent event, List<String> args) {
// This method handles chatgpt's automatic response "dismiss" button
onAiHelpDismissButton(event, args);
}

private void onAiHelpDismissButton(ButtonInteractionEvent event, List<String> args) {
event.deferEdit().queue();

ThreadChannel channel = event.getChannel().asThreadChannel();
Expand All @@ -197,7 +200,6 @@ public void onButtonClick(ButtonInteractionEvent event, List<String> args) {
.queue(forumPostMessage -> handleDismiss(interactionUser, channel, forumPostMessage,
event, args),
handleParentMessageDeleted(interactionUser, channel, event, args));

}

private boolean isPostAuthor(Member interactionUser, Message message) {
Expand Down
Loading