Skip to content

Commit

Permalink
Added support for sub-command aliases
Browse files Browse the repository at this point in the history
  • Loading branch information
Despical committed Jan 30, 2024
1 parent 729a21d commit fd9a766
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 15 deletions.
4 changes: 2 additions & 2 deletions .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ To add this project as a dependency to your project, add the following to your p
<dependency>
<groupId>com.github.Despical</groupId>
<artifactId>CommandFramework</artifactId>
<version>1.3.1</version>
<version>1.3.2</version>
<scope>compile</scope>
</dependency>
```
Expand All @@ -50,7 +50,7 @@ repositories {
```
```
dependencies {
compileOnly group: "com.github.Despical", name: "CommandFramework", version: "1.3.1";
compileOnly group: "com.github.Despical", name: "CommandFramework", version: "1.3.2";
}
```

Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>me.despical</groupId>
<artifactId>command-framework</artifactId>
<version>1.3.1</version>
<version>1.3.2</version>

<name>Command Framework</name>
<inceptionYear>2020</inceptionYear>
Expand Down
24 changes: 12 additions & 12 deletions src/main/java/me/despical/commandframework/CommandFramework.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ public CommandFramework(@NotNull Plugin plugin) {
field.setAccessible(true);

commandMap = (CommandMap) field.get(manager);
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
} catch (ReflectiveOperationException exception) {
exception.printStackTrace();
}
}
}
Expand Down Expand Up @@ -159,6 +159,10 @@ public void registerCommands(@NotNull Object instance) {
}

registerCommand(command, method, instance);

// If aliases are registered as a sub-command then register them as a plugin command.
// Otherwise, they will not be recognized as a command and will not be proceeded.
Stream.of(command.aliases()).filter(alias -> alias.contains(".")).forEach(alias -> registerCommand(Utils.createCommand(command, alias), method, instance));
} else if (method.isAnnotationPresent(Completer.class)) {
if (!List.class.isAssignableFrom(method.getReturnType())) {
plugin.getLogger().log(Level.WARNING, "Skipped registration of ''{0}'' because it is not returning java.util.List type.", method.getName());
Expand All @@ -177,18 +181,11 @@ public void registerCommands(@NotNull Object instance) {

subCommands.forEach((key, value) -> {
final String splitName = key.name().split("\\.")[0];
boolean shouldThrowException = false;

// This is an unsupported behaviour at least for now.
// All sub-commands must have their own main command to be registered.
// Framework is going to work properly but this should not be handled that way.
if (commands.keySet().stream().noneMatch(cmd -> cmd.name().equals(splitName))) {
shouldThrowException = true;

unregisterCommand(key.name());
registerCommand(Utils.createCommand(key, splitName), null, null);
}

if (shouldThrowException)
throw new CommandException("You can not create sub-commands without a main command! (%s)", key.name());
});
}

Expand Down Expand Up @@ -217,7 +214,7 @@ private void registerCommand(Command command, Method method, Object instance) {
pluginCommand.setUsage(command.usage());
pluginCommand.setPermission(!command.permission().isEmpty() ? null : command.permission());
pluginCommand.setDescription(command.desc());
pluginCommand.setAliases(Stream.of(command.aliases()).map(String::toLowerCase).collect(Collectors.toList()));
pluginCommand.setAliases(Stream.of(command.aliases()).filter(alias -> !alias.contains(".")).collect(Collectors.toList()));

commandMap.register(cmdName, pluginCommand);
} catch (Exception exception) {
Expand Down Expand Up @@ -406,6 +403,9 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull org.bukkit.comm
final Method method = entry.getValue().getKey();
final Object instance = entry.getValue().getValue();

if (method == null)
return;

if (method.isAnnotationPresent(NoCommandArguments.class)) {
method.invoke(instance);
return;
Expand Down
75 changes: 75 additions & 0 deletions src/main/java/me/despical/commandframework/utils/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@

package me.despical.commandframework.utils;

import me.despical.commandframework.Command;
import org.jetbrains.annotations.ApiStatus;

import java.lang.annotation.Annotation;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Map;
Expand All @@ -30,6 +34,7 @@
*
* This class is a part of Despical's Commons library.
*/
@ApiStatus.Internal
public class Utils {

private Utils() {
Expand Down Expand Up @@ -189,4 +194,74 @@ public static <K, V> Map<K, V> mapOf(K a, V b) {
public static <K, V> Map<K, V> mapOf(Map.Entry<K, V>... a) {
return Arrays.stream(a).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (b, c) -> c));
}

public static Command createCommand(final Command command, final String commandName) {
return new Command() {

@Override
public String name() {
return commandName;
}

@Override
public String permission() {
return command.permission();
}

@Override
public String[] aliases() {
return new String[0];
}

@Override
public String desc() {
return command.desc();
}

@Override
public String usage() {
return command.usage();
}

@Override
public int min() {
return command.min();
}

@Override
public int max() {
return command.max();
}

@Override
public int cooldown() {
return command.cooldown();
}

@Override
public boolean allowInfiniteArgs() {
return command.allowInfiniteArgs();
}

@Override
public boolean onlyOp() {
return command.onlyOp();
}

@Override
public boolean async() {
return command.async();
}

@Override
public SenderType senderType() {
return command.senderType();
}

@Override
public Class<? extends Annotation> annotationType() {
return command.annotationType();
}
};
}
}

0 comments on commit fd9a766

Please sign in to comment.