ProjectAres/Util/core/src/main/java/tc/oc/commons/core/commands/CommandRegistryImpl.java

56 lines
2.0 KiB
Java

package tc.oc.commons.core.commands;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Provider;
import com.sk89q.minecraft.util.commands.CommandsManager;
import tc.oc.commons.core.logging.Loggers;
import tc.oc.minecraft.api.command.CommandSender;
/**
* Base for the cross-platform command system.
*/
public abstract class CommandRegistryImpl<Sender extends CommandSender> implements CommandRegistry {
protected Logger logger;
@Inject private CommandExceptionHandler.Factory exceptionHandlerFactory;
protected final CommandsManager<Sender> commandsManager = new CommandsManager<Sender>() {
@Override
public boolean hasPermission(Sender player, String permission) {
return player.hasPermission(permission);
}
};
@Inject void init(Loggers loggers, GuiceInjectorAdapter injector, Set<CommandBinder.Binding> bindings) {
logger = loggers.get(getClass());
// Adapt the Guice Injector directly to a command-framework Injector
commandsManager.setInjector(injector);
// Commands registered through CommandBinder
bindings.forEach(binding -> register(binding.type, binding.provider));
}
protected @Nullable List<String> handleCompletion(Sender sender, String command, String[] args) {
return commandsManager.complete(command, args, sender, sender);
}
protected void handleCommand(Sender sender, String command, String[] args) {
try {
commandsManager.execute(command, args, sender, sender);
} catch(Throwable e) {
handleException(sender, CommandInvocationInfo.of(sender, command, Arrays.asList(args)), e);
}
}
protected void handleException(Sender sender, CommandInvocationInfo command, Throwable throwable) {
exceptionHandlerFactory.create(sender, command).handleException(throwable, null, null);
}
}