Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,10 @@ public static Collection<Feature> createFeatures(JDA jda, Database database, Con
features.add(new HelpThreadActivityUpdater(helpSystemHelper));
features
.add(new AutoPruneHelperRoutine(config, helpSystemHelper, modAuditLogWriter, database));
features.add(new HelpThreadAutoArchiver(helpSystemHelper));
HelpThreadCreatedListener helpThreadCreatedListener =
new HelpThreadCreatedListener(helpSystemHelper);
Comment thread
SleepyStack marked this conversation as resolved.
Outdated
features.add(new HelpThreadAutoArchiver(helpSystemHelper,
helpThreadCreatedListener.getComponentIdInteractor()));
features.add(new LeftoverBookmarksCleanupRoutine(bookmarksSystem));
features.add(new MarkHelpThreadCloseInDBRoutine(database, helpThreadLifecycleListener));
features.add(new MemberCountDisplayRoutine(config));
Expand Down Expand Up @@ -173,7 +176,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 @@ -419,6 +419,17 @@ Optional<Long> getAuthorByHelpThreadId(final long channelId) {
}


/**
* Generates a component ID for the "Mark Active" button, derived from the given interactor's
* namespace.
*
* @param interactor the component ID interactor whose namespace should be used
* @return a valid component ID string for the mark-active button
*/
public String generateMarkActiveId(ComponentIdInteractor interactor) {
return interactor.generateComponentId("mark-active");
}

/**
* will be used to filter a tag based on categories config
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@
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.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.componentids.ComponentIdInteractor;

import java.time.Duration;
import java.time.Instant;
Expand All @@ -31,16 +33,21 @@ public final class HelpThreadAutoArchiver implements Routine {
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 final HelpSystemHelper helper;
private final ComponentIdInteractor componentIdInteractor;

/**
* Creates a new instance.
*
* @param helper the helper to use
* @param componentIdInteractor the interactor used to generate component IDs for buttons
*/
public HelpThreadAutoArchiver(HelpSystemHelper helper) {
public HelpThreadAutoArchiver(HelpSystemHelper helper,
ComponentIdInteractor componentIdInteractor) {
this.helper = helper;
this.componentIdInteractor = componentIdInteractor;
}

@Override
Expand Down Expand Up @@ -88,8 +95,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 +138,16 @@ private void handleArchiveFlow(ThreadChannel threadChannel, MessageEmbed embed)
private void triggerArchiveFlow(ThreadChannel threadChannel, long authorId,
MessageEmbed embed) {

String markActiveId = helper.generateMarkActiveId(componentIdInteractor);

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 +173,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 = helper.generateMarkActiveId(componentIdInteractor);

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 @@ -166,6 +166,16 @@ public void acceptComponentIdGenerator(ComponentIdGenerator generator) {
componentIdInteractor.acceptComponentIdGenerator(generator);
}

/**
* Returns the component ID interactor used by this listener, so that other components (e.g. the
* archiver) can generate IDs within the same namespace.
*
* @return the component ID interactor
*/
public ComponentIdInteractor getComponentIdInteractor() {
return componentIdInteractor;
}

private Consumer<Throwable> handleParentMessageDeleted(Member user, ThreadChannel channel,
ButtonInteractionEvent event, List<String> args) {
int noOfMessages = 1; // we only care about first message from channel history
Expand All @@ -187,7 +197,14 @@ 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
if (args.contains("mark-active")) {
onInactivityButton(event);
} else {
onAiHelpDismissButton(event, args);
}
}
Comment thread
SleepyStack marked this conversation as resolved.
Outdated

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

ThreadChannel channel = event.getChannel().asThreadChannel();
Expand All @@ -197,7 +214,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 Expand Up @@ -248,4 +264,20 @@ private void registerThreadDataInDB(Message message, ThreadChannel threadChannel

helper.writeHelpThreadToDatabase(authorId, threadChannel);
}

private void onInactivityButton(ButtonInteractionEvent event) {
event.deferEdit().queue();

if (event.getChannel() instanceof ThreadChannel thread) {
Message botClosedThreadMessage = event.getMessage();

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

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