From b23b9dc5a745b1590fd57cb4103e15a0eca6635d Mon Sep 17 00:00:00 2001 From: burdoto-home Date: Tue, 13 Nov 2018 19:36:34 +0100 Subject: [PATCH] Implemented FuzzyWuzzy as search engine, allowing typos in !docs command NOTE: This version of FuzzyWuzzy is under GPL License, but this will change in Version 2.0.0, which is currently WIP. If this is requested, I can change this PR to 2.0.0 as soon as it is released. --- build.gradle | 4 +++- .../javacord/bot/commands/DocsCommand.java | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 3eb1822..6643674 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,8 @@ ext { sdcf4j : 'v1.0.10', okhttp : '3.9.1', jackson : '2.9.3', - log4j : '2.11.1' + log4j : '2.11.1', + fuzzywuzzy: '1.2.0' ] } @@ -48,6 +49,7 @@ dependencies { implementation "com.squareup.okhttp3:okhttp:${versions.okhttp}" implementation "com.fasterxml.jackson.core:jackson-databind:${versions.jackson}" implementation "org.apache.logging.log4j:log4j-api:${versions.log4j}" + implementation "me.xdrop:fuzzywuzzy:${versions.fuzzywuzzy}" runtimeOnly "org.apache.logging.log4j:log4j-core:${versions.log4j}" runtimeOnly "org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}" diff --git a/src/main/java/org/javacord/bot/commands/DocsCommand.java b/src/main/java/org/javacord/bot/commands/DocsCommand.java index 7bd84d1..d39c1f1 100644 --- a/src/main/java/org/javacord/bot/commands/DocsCommand.java +++ b/src/main/java/org/javacord/bot/commands/DocsCommand.java @@ -2,6 +2,8 @@ import de.btobastian.sdcf4j.Command; import de.btobastian.sdcf4j.CommandExecutor; +import me.xdrop.fuzzywuzzy.FuzzySearch; +import me.xdrop.fuzzywuzzy.model.BoundExtractedResult; import org.javacord.api.DiscordApi; import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; @@ -72,10 +74,11 @@ public void onCommand(TextChannel channel, String[] args) { * @param searchString A search string. */ private void populateMethods(DiscordApi api, EmbedBuilder embed, String searchString) { - Map> methods = new JavadocParser(api, JavadocParser.getLatestJavaDocs(api).join()) - .getMethods().join().stream() - .filter(method -> method.getFullName().toLowerCase().contains(searchString.toLowerCase())) - .sorted(Comparator.comparingInt(method -> method.getName().length())) + Map> methods = FuzzySearch.extractTop(searchString, + new JavadocParser(api, JavadocParser.getLatestJavaDocs(api).join()) + .getMethods().join(), JavadocMethod::getName, 15, 50) + .stream() + .map(BoundExtractedResult::getReferent) .collect(Collectors.groupingBy(JavadocMethod::getClassName)); @@ -124,10 +127,11 @@ private void populateMethods(DiscordApi api, EmbedBuilder embed, String searchSt * @param searchString A search string. */ private void populateClasses(DiscordApi api, EmbedBuilder embed, String searchString) { - List classes = new JavadocParser(api, JavadocParser.getLatestJavaDocs(api).join()) - .getClasses().join().stream() - .filter(clazz -> clazz.getName().toLowerCase().contains(searchString.toLowerCase())) - .sorted(Comparator.comparingInt(clazz -> clazz.getName().length())) + List classes = FuzzySearch.extractTop(searchString, + new JavadocParser(api, JavadocParser.getLatestJavaDocs(api).join()) + .getClasses().join(), JavadocClass::getName, 5, 50) + .stream() + .map(BoundExtractedResult::getReferent) .collect(Collectors.toList()); embed.setTitle("Classes");