From e5460a1ee814ef30945bdbb460a366ff4f5f2507 Mon Sep 17 00:00:00 2001 From: Daniel Tischner Date: Thu, 15 Dec 2022 10:00:07 +0100 Subject: [PATCH 1/6] Fixed issue with help thread creation actions being send too fast (#724) * delayed by 5 seconds --- .../help/HelpThreadCreatedListener.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java index e018d80edc..e8ad4687ef 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java @@ -9,6 +9,8 @@ import net.dv8tion.jda.api.events.channel.ChannelCreateEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.requests.RestAction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.togetherjava.tjbot.commands.EventReceiver; @@ -16,6 +18,8 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** @@ -25,6 +29,9 @@ * user. */ public final class HelpThreadCreatedListener extends ListenerAdapter implements EventReceiver { + private static final Logger logger = LoggerFactory.getLogger(HelpThreadCreatedListener.class); + private static final ScheduledExecutorService SERVICE = Executors.newScheduledThreadPool(2); + private final HelpSystemHelper helper; private final Cache threadIdToCreatedAtCache = Caffeine.newBuilder() .maximumSize(1_000) @@ -69,7 +76,20 @@ private boolean wasThreadAlreadyHandled(long threadChannelId) { private void handleHelpThreadCreated(ThreadChannel threadChannel) { helper.writeHelpThreadToDatabase(threadChannel.getOwnerIdLong(), threadChannel); - createMessages(threadChannel).queue(); + Runnable createMessages = () -> { + try { + createMessages(threadChannel).queue(); + } catch (Exception e) { + logger.error( + "Unknown error while creating messages after help-thread ({}) creation", + threadChannel.getId(), e); + } + }; + + // The creation is delayed, because otherwise it could be too fast and be executed + // after Discord created the thread, but before Discord send OPs initial message. + // Sending messages at that moment is not allowed. + SERVICE.schedule(createMessages, 5, TimeUnit.SECONDS); } private RestAction createMessages(ThreadChannel threadChannel) { From 1dfb4f8402362bb64a66093e426eee5e75cfc1e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Dec 2022 10:04:36 +0100 Subject: [PATCH 2/6] Bump mockito-core from 4.9.0 to 4.10.0 (#730) Bumps [mockito-core](https://github.com/mockito/mockito) from 4.9.0 to 4.10.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.9.0...v4.10.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- application/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/build.gradle b/application/build.gradle index be4f6d34a2..663428f86d 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -74,7 +74,7 @@ dependencies { implementation 'com.github.ben-manes.caffeine:caffeine:3.1.1' - testImplementation 'org.mockito:mockito-core:4.9.0' + testImplementation 'org.mockito:mockito-core:4.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.9.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0' From 816cfb4db9006b06df1ee1432b621bd0f28ce968 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Dec 2022 10:04:49 +0100 Subject: [PATCH 3/6] Bump name.remal.sonarlint from 2.0.0 to 2.1.0 (#729) Bumps [name.remal.sonarlint](https://github.com/remal-gradle-plugins/sonarlint) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/remal-gradle-plugins/sonarlint/releases) - [Commits](https://github.com/remal-gradle-plugins/sonarlint/compare/v2.0.0...v2.1.0) --- updated-dependencies: - dependency-name: name.remal.sonarlint dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6132f0e837..9c45235c19 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java' id "com.diffplug.spotless" version "6.12.0" id "org.sonarqube" version "3.5.0.2730" - id "name.remal.sonarlint" version "2.0.0" + id "name.remal.sonarlint" version "2.1.0" } group 'org.togetherjava' From 64e5d7e3bac8f49b6275ddba75985b329edf32dc Mon Sep 17 00:00:00 2001 From: Tanish <73871477+Taz03@users.noreply.github.com> Date: Fri, 16 Dec 2022 07:35:17 +0000 Subject: [PATCH 4/6] removed share hint (#728) --- .../togetherjava/tjbot/commands/help/HelpSystemHelper.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java index df1c5c89c5..a081eb570e 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java @@ -97,10 +97,6 @@ private RestAction sendExplanationMessage(GuildMessageChannel threadCha List embeds = List.of(HelpSystemHelper.embedWith( "Code is much easier to read if posted with **syntax highlighting** and proper formatting.", useCodeSyntaxExampleImage ? "attachment://" + CODE_SYNTAX_EXAMPLE_PATH : null), - HelpSystemHelper.embedWith( - """ - If your code is **long**, or you have **multiple files** to share, consider posting it on sites \ - like https://pastebin.com/ and share the link instead, that is easier to browse for helpers."""), HelpSystemHelper.embedWith( """ If nobody is calling back, that usually means that your question was **not well asked** and \ From 252427138cbdeb4b1a013bafade8862f1947059a Mon Sep 17 00:00:00 2001 From: Tanish <73871477+Taz03@users.noreply.github.com> Date: Fri, 16 Dec 2022 07:36:11 +0000 Subject: [PATCH 5/6] Fixed package info for help package and removed NotNull annotations (#727) * fixed package info for help package * removed notnull annotations --- .../tjbot/commands/bookmarks/LeftoverBookmarksListener.java | 5 ++--- .../tjbot/commands/help/HelpThreadCreatedListener.java | 4 +--- .../org/togetherjava/tjbot/commands/help/package-info.java | 5 +++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/bookmarks/LeftoverBookmarksListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/bookmarks/LeftoverBookmarksListener.java index b18f7ecb70..5252f6ea07 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/bookmarks/LeftoverBookmarksListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/bookmarks/LeftoverBookmarksListener.java @@ -3,7 +3,6 @@ import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent; import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.EventReceiver; @@ -25,14 +24,14 @@ public LeftoverBookmarksListener(BookmarksSystem bookmarksSystem) { } @Override - public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) { + public void onGuildMemberRemove(GuildMemberRemoveEvent event) { long userID = event.getUser().getIdLong(); bookmarksSystem.startDeletionPeriodForUser(userID); } @Override - public void onGuildMemberJoin(@NotNull GuildMemberJoinEvent event) { + public void onGuildMemberJoin(GuildMemberJoinEvent event) { long userID = event.getUser().getIdLong(); bookmarksSystem.cancelDeletionPeriodForUser(userID); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java index e8ad4687ef..002e7df3bf 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadCreatedListener.java @@ -14,8 +14,6 @@ import org.togetherjava.tjbot.commands.EventReceiver; -import javax.annotation.Nonnull; - import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.concurrent.Executors; @@ -48,7 +46,7 @@ public HelpThreadCreatedListener(HelpSystemHelper helper) { } @Override - public void onChannelCreate(@Nonnull ChannelCreateEvent createEvent) { + public void onChannelCreate(ChannelCreateEvent createEvent) { if (!createEvent.getChannelType().isThread()) { return; } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/package-info.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/package-info.java index c957b34899..4278f5e1ac 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/package-info.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/package-info.java @@ -1,6 +1,7 @@ /** - * This package offers all functionality for the help system. For example commands that let users - * ask questions, such as {@link org.togetherjava.tjbot.commands.help.AskCommand}. + * This package offers all functionality for the help system. For example commands that handles the + * actions taken after creating a help thread + * {@link org.togetherjava.tjbot.commands.help.HelpThreadCreatedListener}. */ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault From a730c53d42488bb335d21aeaf35fe76bade7ce60 Mon Sep 17 00:00:00 2001 From: Daniel Tischner Date: Fri, 16 Dec 2022 08:38:44 +0100 Subject: [PATCH 6/6] Prefer uncommon categories first (#731) --- .../tjbot/commands/help/HelpSystemHelper.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java index a081eb570e..e66fea0997 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java @@ -32,9 +32,11 @@ import java.io.InputStream; import java.util.*; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * Helper class offering certain methods used by the help system. @@ -48,6 +50,11 @@ public final class HelpSystemHelper { private final Predicate isHelpForumName; private final String helpForumPattern; + /** + * Compares categories by how common they are, ascending. I.e., the most uncommon or specific + * category comes first. + */ + private final Comparator byCategoryCommonnessAsc; private final Set categories; private final Set threadActivityTagNames; private final String categoryRoleSuffix; @@ -66,9 +73,18 @@ public HelpSystemHelper(Config config, Database database) { helpForumPattern = helpConfig.getHelpForumPattern(); isHelpForumName = Pattern.compile(helpForumPattern).asMatchPredicate(); - categories = new HashSet<>(helpConfig.getCategories()); + List categoriesList = helpConfig.getCategories(); + categories = new HashSet<>(categoriesList); categoryRoleSuffix = helpConfig.getCategoryRoleSuffix(); + Map categoryToCommonDesc = IntStream.range(0, categoriesList.size()) + .boxed() + .collect(Collectors.toMap(categoriesList::get, Function.identity())); + byCategoryCommonnessAsc = Comparator + .comparingInt( + tag -> categoryToCommonDesc.getOrDefault(tag.getName(), categories.size())) + .reversed(); + threadActivityTagNames = Arrays.stream(ThreadActivity.values()) .map(ThreadActivity::getTagName) .collect(Collectors.toSet()); @@ -167,12 +183,12 @@ Optional getActivityTagOfChannel(ThreadChannel channel) { return getFirstMatchingTagOfChannel(threadActivityTagNames, channel); } - private static Optional getFirstMatchingTagOfChannel(Set tagNamesToMatch, + private Optional getFirstMatchingTagOfChannel(Set tagNamesToMatch, ThreadChannel channel) { return channel.getAppliedTags() .stream() .filter(tag -> tagNamesToMatch.contains(tag.getName())) - .findFirst(); + .min(byCategoryCommonnessAsc); } RestAction changeChannelCategory(ThreadChannel channel, String category) { @@ -183,8 +199,8 @@ RestAction changeChannelActivity(ThreadChannel channel, ThreadActivity act return changeMatchingTagOfChannel(activity.getTagName(), threadActivityTagNames, channel); } - private static RestAction changeMatchingTagOfChannel(String tagName, - Set tagNamesToMatch, ThreadChannel channel) { + private RestAction changeMatchingTagOfChannel(String tagName, Set tagNamesToMatch, + ThreadChannel channel) { List tags = new ArrayList<>(channel.getAppliedTags()); Optional currentTag = getFirstMatchingTagOfChannel(tagNamesToMatch, channel);