Skip to content

Commit 7f33782

Browse files
firasrgZabuzard
andauthored
BugFix: Bot mentions itself in Help-Thread at Timeout (#975)
Co-authored-by: Zabuzard <zabuza.dev@gmail.com>
1 parent 265d6a2 commit 7f33782

File tree

3 files changed

+44
-12
lines changed

3 files changed

+44
-12
lines changed

application/src/main/java/org/togetherjava/tjbot/features/help/HelpSystemHelper.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,4 +355,14 @@ public String getTagName() {
355355
return tagName;
356356
}
357357
}
358+
359+
Optional<Long> getAuthorByHelpThreadId(final long channelId) {
360+
361+
logger.debug("Looking for thread-record using channel ID: {}", channelId);
362+
363+
return database.read(context -> context.select(HelpThreads.HELP_THREADS.AUTHOR_ID)
364+
.from(HelpThreads.HELP_THREADS)
365+
.where(HelpThreads.HELP_THREADS.CHANNEL_ID.eq(channelId))
366+
.fetchOptional(HelpThreads.HELP_THREADS.AUTHOR_ID));
367+
}
358368
}

application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadAutoArchiver.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
1111
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
1212
import net.dv8tion.jda.api.requests.RestAction;
13-
import net.dv8tion.jda.api.utils.Result;
1413
import net.dv8tion.jda.api.utils.TimeUtil;
1514
import org.slf4j.Logger;
1615
import org.slf4j.LoggerFactory;
@@ -127,24 +126,27 @@ private static boolean shouldBeArchived(MessageChannel channel, Instant archiveA
127126

128127
private void handleArchiveFlow(ThreadChannel threadChannel, MessageEmbed embed) {
129128

130-
Function<Result<Member>, RestAction<Message>> sendEmbedWithMention =
131-
member -> threadChannel.sendMessage(member.get().getAsMention()).addEmbeds(embed);
129+
Function<Member, RestAction<Message>> sendEmbedWithMention =
130+
member -> threadChannel.sendMessage(member.getAsMention()).addEmbeds(embed);
132131

133132
Supplier<RestAction<Message>> sendEmbedWithoutMention =
134133
() -> threadChannel.sendMessageEmbeds(embed);
135134

135+
long authorId = helper.getAuthorByHelpThreadId(threadChannel.getIdLong()).orElseThrow();
136+
136137
threadChannel.getGuild()
137-
.retrieveMemberById(threadChannel.getOwnerIdLong())
138+
.retrieveMemberById(authorId)
138139
.mapToResult()
139-
.flatMap(foundMember -> {
140-
if (foundMember.isSuccess()) {
141-
return sendEmbedWithMention.apply(foundMember);
140+
.flatMap(authorResults -> {
141+
if (authorResults.isFailure()) {
142+
logger.info(
143+
"Trying to archive a thread ({}), but OP ({}) left the server, sending embed without mention",
144+
threadChannel.getId(), authorId, authorResults.getFailure());
145+
146+
return sendEmbedWithoutMention.get();
142147
}
143-
logger.info(
144-
"Owner of thread with id: {} left the server, sending embed without mention",
145-
threadChannel.getId(), foundMember.getFailure());
146148

147-
return sendEmbedWithoutMention.get();
149+
return sendEmbedWithMention.apply(authorResults.get());
148150
})
149151
.flatMap(any -> threadChannel.getManager().setArchived(true))
150152
.queue();

application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.dv8tion.jda.api.entities.Message;
77
import net.dv8tion.jda.api.entities.MessageEmbed;
88
import net.dv8tion.jda.api.entities.Role;
9+
import net.dv8tion.jda.api.entities.User;
910
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
1011
import net.dv8tion.jda.api.entities.channel.forums.ForumTag;
1112
import net.dv8tion.jda.api.events.channel.ChannelCreateEvent;
@@ -38,6 +39,7 @@ public final class HelpThreadCreatedListener extends ListenerAdapter
3839
implements EventReceiver, UserInteractor {
3940

4041
private final HelpSystemHelper helper;
42+
4143
private final Cache<Long, Instant> threadIdToCreatedAtCache = Caffeine.newBuilder()
4244
.maximumSize(1_000)
4345
.expireAfterAccess(2, TimeUnit.of(ChronoUnit.MINUTES))
@@ -81,7 +83,17 @@ private boolean wasThreadAlreadyHandled(long threadChannelId) {
8183
}
8284

8385
private void handleHelpThreadCreated(ThreadChannel threadChannel) {
84-
helper.writeHelpThreadToDatabase(threadChannel.getOwnerIdLong(), threadChannel);
86+
threadChannel.retrieveMessageById(threadChannel.getIdLong()).queue(message -> {
87+
88+
long authorId = threadChannel.getOwnerIdLong();
89+
90+
if (isPostedBySelfUser(message)) {
91+
// When transfer-command is used
92+
authorId = getMentionedAuthorByMessage(message).getIdLong();
93+
}
94+
95+
helper.writeHelpThreadToDatabase(authorId, threadChannel);
96+
});
8597

8698
// The creation is delayed, because otherwise it could be too fast and be executed
8799
// after Discord created the thread, but before Discord send OPs initial message.
@@ -90,6 +102,14 @@ private void handleHelpThreadCreated(ThreadChannel threadChannel) {
90102
.queueAfter(5, TimeUnit.SECONDS);
91103
}
92104

105+
private static User getMentionedAuthorByMessage(Message message) {
106+
return message.getMentions().getUsers().getFirst();
107+
}
108+
109+
private static boolean isPostedBySelfUser(Message message) {
110+
return message.getJDA().getSelfUser().equals(message.getAuthor());
111+
}
112+
93113
private RestAction<Message> createAIResponse(ThreadChannel threadChannel) {
94114
RestAction<Message> originalQuestion =
95115
threadChannel.retrieveMessageById(threadChannel.getIdLong());

0 commit comments

Comments
 (0)