From 9e7f2e28f80288f5c2f20ae89dbdb90aae78fb14 Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Thu, 15 Dec 2022 10:44:09 +0100 Subject: [PATCH] Prefer uncommon categories first --- .../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 df1c5c89c5..9d1fd30859 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()); @@ -171,12 +187,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) { @@ -187,8 +203,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);