package tc.oc.commons.bungee.commands;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Provider;
import com.sk89q.bungee.util.CommandRegistration;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.CommandBypassException;
import net.md_5.bungee.api.plugin.Plugin;
import tc.oc.commons.core.commands.CommandRegistryImpl;
import tc.oc.commons.core.commands.CommandInvocationInfo;
import tc.oc.commons.core.commands.CommandRegistry;
import tc.oc.commons.core.plugin.PluginScoped;
@PluginScoped
public class BungeeCommandRegistry extends CommandRegistryImpl<CommandSender> implements CommandRegistry, com.sk89q.bungee.util.CommandExecutor<CommandSender> {
private final @Nullable CommandRegistration registration;
@Inject BungeeCommandRegistry(Plugin plugin) {
// Don't register any commands if this plugin is disabled
this.registration = plugin.isActive() ? new CommandRegistration(plugin, plugin.getProxy().getPluginManager(), commandsManager, this)
: null;
}
@Override
public <T> void register(Class<T> clazz, @Nullable Provider<? extends T> provider) {
if(registration != null) {
registration.register(clazz, provider);
}
}
@Override
public void onCommand(CommandSender sender, String commandName, String[] args) {
handleCommand(sender, commandName, args);
}
@Override
protected void handleException(CommandSender sender, CommandInvocationInfo command, Throwable throwable) {
if(throwable instanceof CommandBypassException) {
// Propagate this so Bungee can do the actual bypass
throw (CommandBypassException) throwable;
} else {
super.handleException(sender, command, throwable);
}
}
}