Skip to content

Commit

Permalink
*error fix, suggested commands (similar commands and command not foun…
Browse files Browse the repository at this point in the history
…d) added and bump to 4.2.2
  • Loading branch information
koply committed Dec 16, 2020
1 parent 3a0e6bc commit ac38667
Show file tree
Hide file tree
Showing 13 changed files with 183 additions and 11 deletions.
2 changes: 1 addition & 1 deletion all/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>kcommando-root</artifactId>
<groupId>me.koply</groupId>
<version>4.2.1</version>
<version>4.2.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<artifactId>kcommando-root</artifactId>
<groupId>me.koply</groupId>
<version>4.2.1</version>
<version>4.2.2</version>
</parent>

<artifactId>core</artifactId>
Expand Down
15 changes: 14 additions & 1 deletion core/src/main/java/me/koply/kcommando/CommandHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,17 @@ protected boolean cooldownCheck(CommandInfo info, CProcessParameters cpp, long a
return false;
}

protected void foundSimilars(String command, Object event) {
HashSet<CommandInfo> similarCommands = new HashSet<>();
for (Map.Entry<String, CommandToRun> entry : commandsMap.entrySet()) {
double similarity = Util.similarity(entry.getKey(), command);
if (similarity >= 0.5) {
similarCommands.add(entry.getValue().getClazz().getInfo());
}
}
params.getIntegration().getSuggestionsCallback().run(event, similarCommands);
}

public void processCommand(final CProcessParameters cpp) {
final long authorID = cpp.getAuthor().getId();
if (authorID == params.getSelfUserId() ||
Expand All @@ -154,7 +165,9 @@ public void processCommand(final CProcessParameters cpp) {
final String command = params.getCaseSensitivity().isPresent() ? cmdArgs[0] : cmdArgs[0].toLowerCase();

if (!containsCommand(command)) {
KCommando.logger.info("Last command was not a valid command.");
if (params.getIntegration().getSuggestionsCallback() != null) {
foundSimilars(command, cpp.getEvent());
}
return;
}

Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/me/koply/kcommando/KCommando.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class KCommando {

public Parameters params = new Parameters();
public static final Logger logger = Logger.getLogger("KCommando");
public static final String VERSION = "4.2.1";
public static final String VERSION = "4.2.2";

public KCommando(final Integration integration) {
params.setIntegration(integration);
Expand Down
14 changes: 10 additions & 4 deletions core/src/main/java/me/koply/kcommando/KInitializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ public class KInitializer {
private final Parameters params;
public final Parameters getParams() { return params; }

private final CommandHandler commandHandler;
private final Class<? extends CommandHandler> commandHandler;

public KInitializer(Parameters params) {
this.params = params;
this.commandHandler = new CommandHandler(params);
this.commandHandler = CommandHandler.class;
}

/**
Expand All @@ -30,7 +30,7 @@ public KInitializer(Parameters params) {
*/
public KInitializer(Parameters params, CommandHandler commandHandler) {
this.params = params;
this.commandHandler = commandHandler;
this.commandHandler = commandHandler.getClass();
}

/**
Expand Down Expand Up @@ -59,7 +59,13 @@ public void build() {
}
CargoTruck.setCargo(null);
params.setCommandMethods(commandMethods);
params.getIntegration().register(commandHandler);
try {
params.getIntegration().register(commandHandler.getDeclaredConstructor(Parameters.class).newInstance(params));
} catch (Exception ex) {
ex.printStackTrace();
KCommando.logger.info("An unexpected error caught at initialize the command handler.");
}

KCommando.logger.info(classCounter + " commands are initialized.");
KCommando.logger.info("KCommando system is ready o7");
}
Expand Down
84 changes: 84 additions & 0 deletions core/src/main/java/me/koply/kcommando/Util.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package me.koply.kcommando;

import java.util.Arrays;

class Util {
/**
* JaroWinklerDistance
* Copied from https://commons.apache.org/sandbox/commons-text/jacoco/org.apache.commons.text.similarity/JaroWinklerDistance.java.html
* apply method changed to similarity
*/
static double similarity(final CharSequence left, final CharSequence right) {
final double defaultScalingFactor = 0.1;
final double percentageRoundValue = 100.0;

if (left == null || right == null) {
throw new IllegalArgumentException("Strings must not be null");
}

int[] mtp = matches(left, right);
double m = mtp[0];
if (m == 0) {
return 0D;
}
double j = ((m / left.length() + m / right.length() + (m - mtp[1]) / m)) / 3;
double jw = j < 0.7D ? j : j + Math.min(defaultScalingFactor, 1D / mtp[3]) * mtp[2] * (1D - j);
return Math.round(jw * percentageRoundValue) / percentageRoundValue;
}

private static int[] matches(final CharSequence first, final CharSequence second) {
CharSequence max, min;
if (first.length() > second.length()) {
max = first;
min = second;
} else {
max = second;
min = first;
}
int range = Math.max(max.length() / 2 - 1, 0);
int[] matchIndexes = new int[min.length()];
Arrays.fill(matchIndexes, -1);
boolean[] matchFlags = new boolean[max.length()];
int matches = 0;
for (int mi = 0; mi < min.length(); mi++) {
char c1 = min.charAt(mi);
for (int xi = Math.max(mi - range, 0), xn = Math.min(mi + range + 1, max.length()); xi < xn; xi++) {
if (!matchFlags[xi] && c1 == max.charAt(xi)) {
matchIndexes[mi] = xi;
matchFlags[xi] = true;
matches++;
break;
}
}
}
char[] ms1 = new char[matches];
char[] ms2 = new char[matches];
for (int i = 0, si = 0; i < min.length(); i++) {
if (matchIndexes[i] != -1) {
ms1[si] = min.charAt(i);
si++;
}
}
for (int i = 0, si = 0; i < max.length(); i++) {
if (matchFlags[i]) {
ms2[si] = max.charAt(i);
si++;
}
}
int transpositions = 0;
for (int mi = 0; mi < ms1.length; mi++) {
if (ms1[mi] != ms2[mi]) {
transpositions++;
}
}
int prefix = 0;
for (int mi = 0; mi < min.length(); mi++) {
if (first.charAt(mi) == second.charAt(mi)) {
prefix++;
} else {
break;
}
}
return new int[] { matches, transpositions / 2, prefix, max.length() };
}
}
28 changes: 28 additions & 0 deletions core/src/main/java/me/koply/kcommando/integration/Integration.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import me.koply.kcommando.CommandHandler;
import me.koply.kcommando.internal.KRunnable;
import me.koply.kcommando.internal.SuggestionsCallback;

import java.util.Collections;
import java.util.HashSet;
Expand Down Expand Up @@ -93,12 +94,39 @@ public HashSet<Long> getBlacklistedChannels(long guildID) {
}

private KRunnable blacklistCallback;

/**
* When a command declined due to a blacklist, runs this callback.
* @param callback to run
* @return this integration
*/
public Integration setBlacklistCallback(KRunnable callback) {
blacklistCallback = callback;
return this;
}

// internal
public KRunnable getBlacklistCallback() {
return blacklistCallback;
}


private SuggestionsCallback suggestionsCallback;

/**
* When a command declined due to wrong usage and the bot has similar commands calls this callback
* if it doesn't find similar commands, the HashSet will be empty
*
* @param suggestionsCallback to run
* @return this integration
*/
public Integration setSuggestionsCallback(SuggestionsCallback suggestionsCallback) {
this.suggestionsCallback = suggestionsCallback;
return this;
}

// internal
public SuggestionsCallback getSuggestionsCallback() {
return suggestionsCallback;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package me.koply.kcommando.internal;

import me.koply.kcommando.CommandInfo;

import java.util.HashSet;

public interface SuggestionsCallback<E> {
void run(E e, HashSet<CommandInfo> similarCommands);
}
2 changes: 1 addition & 1 deletion javacord-integration/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<artifactId>kcommando-root</artifactId>
<groupId>me.koply</groupId>
<version>4.2.1</version>
<version>4.2.2</version>
</parent>

<artifactId>javacord-integration</artifactId>
Expand Down
16 changes: 16 additions & 0 deletions javacord-integration/src/main/test/me/koply/javacordtest/Test.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package me.koply.javacordtest;

import me.koply.kcommando.CommandInfo;
import me.koply.kcommando.KCommando;
import me.koply.kcommando.integration.impl.javacord.JavacordIntegration;
import me.koply.kcommando.internal.SuggestionsCallback;
import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;
import org.javacord.api.event.message.MessageCreateEvent;

import java.util.Arrays;
import java.util.Scanner;

public class Test extends JavacordIntegration {
Expand All @@ -25,6 +29,18 @@ public static void main(String[] args) {

instance = new Test(api);

instance.setSuggestionsCallback((SuggestionsCallback<MessageCreateEvent>) (e, list) -> {
if (list.isEmpty()) {
e.getChannel().sendMessage("Command not found.");
return;
}
StringBuilder sb = new StringBuilder();
for (CommandInfo info : list) {
sb.append(Arrays.toString(info.getAliases())).append(" - ");
}
e.getChannel().sendMessage("Last command is not found. Suggestions: \n"+sb.toString());
});

KCommando kcm = new KCommando(instance)
.setPackage(Test.class.getPackage().getName())
.setPrefix(".")
Expand Down
2 changes: 1 addition & 1 deletion jda-integration/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<artifactId>kcommando-root</artifactId>
<groupId>me.koply</groupId>
<version>4.2.1</version>
<version>4.2.2</version>
</parent>

<artifactId>jda-integration</artifactId>
Expand Down
16 changes: 16 additions & 0 deletions jda-integration/src/main/test/me/koply/jdatest/Test.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package me.koply.jdatest;

import me.koply.kcommando.CommandInfo;
import me.koply.kcommando.KCommando;
import me.koply.kcommando.integration.impl.jda.JDAIntegration;
import me.koply.kcommando.internal.SuggestionsCallback;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;

import java.util.Arrays;
import java.util.Scanner;

public class Test extends JDAIntegration {
Expand All @@ -24,6 +28,18 @@ public static void main(String[] args) throws Exception {

instance = new Test(jda);

instance.setSuggestionsCallback((SuggestionsCallback<MessageReceivedEvent>) (e,list) -> {
if (list.isEmpty()) {
e.getChannel().sendMessage("Command not found.").queue();
return;
}
StringBuilder sb = new StringBuilder();
for (CommandInfo info : list) {
sb.append(Arrays.toString(info.getAliases())).append(" - ");
}
e.getChannel().sendMessage("Last command is not found. Suggestions: \n"+sb.toString()).queue();
});

KCommando kcm = new KCommando(instance)
.setPackage(Test.class.getPackage().getName())
.setPrefix(".")
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>me.koply</groupId>
<artifactId>kcommando-root</artifactId>
<packaging>pom</packaging>
<version>4.2.1</version>
<version>4.2.2</version>

<scm>
<connection>scm:git:git://github.com/MusaBrt/KCommando.git</connection>
Expand Down

0 comments on commit ac38667

Please sign in to comment.