Search in sources :

Example 1 with CommandPermissionException

use of org.spongepowered.api.command.CommandPermissionException in project SpongeCommon by SpongePowered.

the class MinecraftCommandWrapper method process.

@Override
public CommandResult process(CommandSource source, String arguments) throws CommandException {
    if (!testPermission(source)) {
        throw new CommandPermissionException(Text.of(SpongeImpl.getGame().getRegistry().getTranslationById(TRANSLATION_NO_PERMISSION).get()));
    }
    CommandHandler handler = (CommandHandler) SpongeImpl.getServer().getCommandManager();
    final ICommandSender mcSender = WrapperICommandSender.of(source);
    final String[] splitArgs = splitArgs(arguments);
    int usernameIndex = 0;
    try {
        usernameIndex = handler.getUsernameIndex(this.command, splitArgs);
    } catch (net.minecraft.command.CommandException e) {
        throw new RuntimeException(e);
    }
    int successCount = 0;
    if (!throwEvent(mcSender, splitArgs)) {
        return CommandResult.empty();
    }
    // Below this is copied from CommandHandler.execute. This might need to be updated between versions.
    int affectedEntities = 1;
    if (usernameIndex > -1) {
        List<Entity> list = null;
        try {
            list = EntitySelector.matchEntities(mcSender, splitArgs[usernameIndex], Entity.class);
        } catch (net.minecraft.command.CommandException e) {
            throw new RuntimeException(e);
        }
        String previousNameVal = splitArgs[usernameIndex];
        affectedEntities = list.size();
        ((IMixinCommandHandler) handler).setExpandedSelector(true);
        for (Entity entity : list) {
            splitArgs[usernameIndex] = entity.getCachedUniqueIdString();
            if (tryExecute(handler, mcSender, splitArgs, arguments)) {
                ++successCount;
            }
        }
        splitArgs[usernameIndex] = previousNameVal;
        ((IMixinCommandHandler) handler).setExpandedSelector(false);
    } else {
        if (tryExecute(handler, mcSender, splitArgs, arguments)) {
            ++successCount;
        }
    }
    return CommandResult.builder().affectedEntities(affectedEntities).successCount(successCount).build();
}
Also used : Entity(net.minecraft.entity.Entity) CommandPermissionException(org.spongepowered.api.command.CommandPermissionException) CommandHandler(net.minecraft.command.CommandHandler) IMixinCommandHandler(org.spongepowered.common.interfaces.command.IMixinCommandHandler) ICommandSender(net.minecraft.command.ICommandSender) IMixinCommandHandler(org.spongepowered.common.interfaces.command.IMixinCommandHandler)

Example 2 with CommandPermissionException

use of org.spongepowered.api.command.CommandPermissionException in project SpongeCommon by SpongePowered.

the class SpongeCommandManager method process.

@Override
public CommandResult process(CommandSource source, String commandLine) {
    final String[] argSplit = commandLine.split(" ", 2);
    Sponge.getCauseStackManager().pushCause(source);
    final SendCommandEvent event = SpongeEventFactory.createSendCommandEvent(Sponge.getCauseStackManager().getCurrentCause(), argSplit.length > 1 ? argSplit[1] : "", argSplit[0], CommandResult.empty());
    Sponge.getGame().getEventManager().post(event);
    Sponge.getCauseStackManager().popCause();
    if (event.isCancelled()) {
        return event.getResult();
    }
    // Only the first part of argSplit is used at the moment, do the other in the future if needed.
    argSplit[0] = event.getCommand();
    commandLine = event.getCommand();
    if (!event.getArguments().isEmpty()) {
        commandLine = commandLine + ' ' + event.getArguments();
    }
    try {
        try (StackFrame frame = Sponge.getCauseStackManager().pushCauseFrame();
            // Since we know we are in the main thread, this is safe to do without a thread check
            CommandPhaseContext context = GeneralPhase.State.COMMAND.createPhaseContext().source(source).addCaptures().addEntityDropCaptures().buildAndSwitch()) {
            if (source instanceof EntityPlayer) {
                // Enable player inventory capture
                ((IMixinInventoryPlayer) ((EntityPlayer) source).inventory).setCapture(true);
            }
            Sponge.getCauseStackManager().pushCause(source);
            final CommandResult result = this.dispatcher.process(source, commandLine);
            return result;
        } catch (InvocationCommandException ex) {
            if (ex.getCause() != null) {
                throw ex.getCause();
            }
        } catch (CommandPermissionException ex) {
            Text text = ex.getText();
            if (text != null) {
                source.sendMessage(error(text));
            }
        } catch (CommandException ex) {
            Text text = ex.getText();
            if (text != null) {
                source.sendMessage(error(text));
            }
            if (ex.shouldIncludeUsage()) {
                final Optional<CommandMapping> mapping = this.dispatcher.get(argSplit[0], source);
                if (mapping.isPresent()) {
                    Text usage;
                    if (ex instanceof ArgumentParseException.WithUsage) {
                        usage = ((ArgumentParseException.WithUsage) ex).getUsage();
                    } else {
                        usage = mapping.get().getCallable().getUsage(source);
                    }
                    source.sendMessage(error(t("Usage: /%s %s", argSplit[0], usage)));
                }
            }
        }
    } catch (Throwable thr) {
        Text.Builder excBuilder;
        if (thr instanceof TextMessageException) {
            Text text = ((TextMessageException) thr).getText();
            excBuilder = text == null ? Text.builder("null") : Text.builder();
        } else {
            excBuilder = Text.builder(String.valueOf(thr.getMessage()));
        }
        if (source.hasPermission("sponge.debug.hover-stacktrace")) {
            final StringWriter writer = new StringWriter();
            thr.printStackTrace(new PrintWriter(writer));
            excBuilder.onHover(TextActions.showText(Text.of(writer.toString().replace("\t", "    ").replace("\r\n", "\n").replace("\r", // I mean I guess somebody could be running this on like OS 9?
            "\n"))));
        }
        source.sendMessage(error(t("Error occurred while executing command: %s", excBuilder.build())));
        this.logger.error(TextSerializers.PLAIN.serialize(t("Error occurred while executing command '%s' for source %s: %s", commandLine, source.toString(), String.valueOf(thr.getMessage()))), thr);
    }
    return CommandResult.empty();
}
Also used : CommandPermissionException(org.spongepowered.api.command.CommandPermissionException) Optional(java.util.Optional) ArgumentParseException(org.spongepowered.api.command.args.ArgumentParseException) Text(org.spongepowered.api.text.Text) InvocationCommandException(org.spongepowered.api.command.InvocationCommandException) CommandException(org.spongepowered.api.command.CommandException) CommandResult(org.spongepowered.api.command.CommandResult) IMixinInventoryPlayer(org.spongepowered.common.interfaces.entity.player.IMixinInventoryPlayer) InvocationCommandException(org.spongepowered.api.command.InvocationCommandException) StringWriter(java.io.StringWriter) CommandPhaseContext(org.spongepowered.common.event.tracking.phase.general.CommandPhaseContext) StackFrame(org.spongepowered.api.event.CauseStackManager.StackFrame) SendCommandEvent(org.spongepowered.api.event.command.SendCommandEvent) EntityPlayer(net.minecraft.entity.player.EntityPlayer) TextMessageException(org.spongepowered.api.util.TextMessageException) PrintWriter(java.io.PrintWriter)

Example 3 with CommandPermissionException

use of org.spongepowered.api.command.CommandPermissionException in project LanternServer by LanternPowered.

the class LanternCommandManager method process.

@Override
public CommandResult process(CommandSource source, String commandLine) {
    checkNotNull(source, "source");
    final String[] argSplit = commandLine.split(" ", 2);
    final CauseStack causeStack = CauseStack.currentOrEmpty();
    try (CauseStack.Frame frame = causeStack.pushCauseFrame()) {
        frame.pushCause(source);
        final SendCommandEvent event = SpongeEventFactory.createSendCommandEvent(frame.getCurrentCause(), argSplit.length > 1 ? argSplit[1] : "", argSplit[0], CommandResult.empty());
        Sponge.getGame().getEventManager().post(event);
        if (event.isCancelled()) {
            return event.getResult();
        }
        // Only the first part of argSplit is used at the moment, do the other in the future if needed.
        argSplit[0] = event.getCommand();
        commandLine = event.getCommand();
        if (!event.getArguments().isEmpty()) {
            commandLine = commandLine + ' ' + event.getArguments();
        }
        try {
            return this.dispatcher.process(source, commandLine);
        } catch (InvocationCommandException ex) {
            if (ex.getCause() != null) {
                throw ex.getCause();
            }
        } catch (CommandPermissionException ex) {
            Text text = ex.getText();
            if (text != null) {
                source.sendMessage(error(text));
            }
        } catch (CommandException ex) {
            Text text = ex.getText();
            if (text != null) {
                source.sendMessage(error(text));
            }
            if (ex.shouldIncludeUsage()) {
                final Optional<CommandMapping> mapping = this.dispatcher.get(argSplit[0], source);
                mapping.ifPresent(commandMapping -> source.sendMessage(error(t("commands.generic.usage", t("/%s %s", argSplit[0], commandMapping.getCallable().getUsage(source))))));
            }
        }
    } catch (Throwable thr) {
        final Text.Builder excBuilder;
        if (thr instanceof TextMessageException) {
            final Text text = ((TextMessageException) thr).getText();
            excBuilder = text == null ? Text.builder("null") : Text.builder().append(text);
        } else {
            excBuilder = Text.builder(String.valueOf(thr.getMessage()));
        }
        if (source.hasPermission("sponge.debug.hover-stacktrace")) {
            final StringWriter writer = new StringWriter();
            thr.printStackTrace(new PrintWriter(writer));
            excBuilder.onHover(TextActions.showText(Text.of(writer.toString().replace("\t", "    ").replace("\r\n", "\n").replace("\r", // I mean I guess somebody could be running this on like OS 9?
            "\n"))));
        }
        source.sendMessage(error(t("Error occurred while executing command: %s", excBuilder.build())));
        this.logger.error(LanternTexts.toLegacy(t("Error occurred while executing command '%s' for source %s: %s", commandLine, source.toString(), String.valueOf(thr.getMessage()))), thr);
    }
    return CommandResult.empty();
}
Also used : Arrays(java.util.Arrays) Inject(com.google.inject.Inject) CommandCallable(org.spongepowered.api.command.CommandCallable) CommandMapping(org.spongepowered.api.command.CommandMapping) Multimap(com.google.common.collect.Multimap) LanternTexts(org.lanternpowered.server.text.LanternTexts) Function(java.util.function.Function) InvocationCommandException(org.spongepowered.api.command.InvocationCommandException) ArrayList(java.util.ArrayList) SpongeApiTranslationHelper.t(org.spongepowered.api.util.SpongeApiTranslationHelper.t) HashMultimap(com.google.common.collect.HashMultimap) CauseStack(org.lanternpowered.server.event.CauseStack) CommandPermissionException(org.spongepowered.api.command.CommandPermissionException) ImmutableList(com.google.common.collect.ImmutableList) Text(org.spongepowered.api.text.Text) Map(java.util.Map) TabCompleteEvent(org.spongepowered.api.event.command.TabCompleteEvent) PluginContainer(org.spongepowered.api.plugin.PluginContainer) Nullable(javax.annotation.Nullable) PrintWriter(java.io.PrintWriter) CommandResult(org.spongepowered.api.command.CommandResult) TextActions(org.spongepowered.api.text.action.TextActions) Location(org.spongepowered.api.world.Location) ImmutableSet(com.google.common.collect.ImmutableSet) Logger(org.slf4j.Logger) SimpleDispatcher(org.spongepowered.api.command.dispatcher.SimpleDispatcher) Iterator(java.util.Iterator) CommandSource(org.spongepowered.api.command.CommandSource) TextMessageException(org.spongepowered.api.util.TextMessageException) SpongeEventFactory(org.spongepowered.api.event.SpongeEventFactory) StringWriter(java.io.StringWriter) Collection(java.util.Collection) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Sponge(org.spongepowered.api.Sponge) Set(java.util.Set) CommandException(org.spongepowered.api.command.CommandException) List(java.util.List) World(org.spongepowered.api.world.World) CommandManager(org.spongepowered.api.command.CommandManager) Optional(java.util.Optional) SendCommandEvent(org.spongepowered.api.event.command.SendCommandEvent) CommandMessageFormatting.error(org.spongepowered.api.command.CommandMessageFormatting.error) Singleton(com.google.inject.Singleton) Disambiguator(org.spongepowered.api.command.dispatcher.Disambiguator) CauseStack(org.lanternpowered.server.event.CauseStack) CommandPermissionException(org.spongepowered.api.command.CommandPermissionException) Optional(java.util.Optional) Text(org.spongepowered.api.text.Text) InvocationCommandException(org.spongepowered.api.command.InvocationCommandException) CommandException(org.spongepowered.api.command.CommandException) InvocationCommandException(org.spongepowered.api.command.InvocationCommandException) StringWriter(java.io.StringWriter) SendCommandEvent(org.spongepowered.api.event.command.SendCommandEvent) TextMessageException(org.spongepowered.api.util.TextMessageException) PrintWriter(java.io.PrintWriter)

Example 4 with CommandPermissionException

use of org.spongepowered.api.command.CommandPermissionException in project Nucleus by NucleusPowered.

the class AbstractCommand method process.

private CommandResult process(CommandSource source, String command, String arguments, CommandArgs args) throws CommandException {
    // Phase one: child command processing. Keep track of all thrown arguments.
    List<Tuple<String, CommandException>> thrown = Lists.newArrayList();
    final CommandContext context = new CommandContext();
    T castedSource;
    try {
        // If we have a child command to execute, then we execute it.
        if (args.hasNext() && this.dispatcher.containsAlias(args.peek())) {
            Object state = args.getState();
            String next = args.next();
            try {
                // If this works, then we're A-OK.
                CommandCallable callable = this.dispatcher.get(next.toLowerCase()).get().getCallable();
                if (callable instanceof AbstractCommand) {
                    return ((AbstractCommand) callable).process(source, command + " " + next, arguments, args);
                }
                return callable.process(source, arguments);
            } catch (NucleusCommandException e) {
                // Didn't work out. Let's move on.
                thrown.addAll(e.getExceptions());
                if (!e.isAllowFallback()) {
                    throw e;
                }
            } catch (CommandException e) {
                // If the Exception is _not_ of right type, wrap it and add it. This shouldn't happen though.
                thrown.add(Tuple.of(command + " " + next, e));
            } finally {
                args.setState(state);
            }
        }
        // Phase one: test for what is required
        if (requiresEconomy && !plugin.getEconHelper().economyServiceExists()) {
            source.sendMessage(NucleusPlugin.getNucleus().getMessageProvider().getTextMessageWithFormat("command.economyrequired"));
            return CommandResult.empty();
        }
        // Phase two: source type - test to see if the person in question can execute this command.
        castedSource = checkSourceType(source);
        // Phase three - test the permission.
        if (!testPermissionOnSubject(castedSource)) {
            throw new CommandPermissionException();
        }
        if (!this.hasExecutor) {
            if (thrown.isEmpty()) {
                // OK, we just process the usage command instead.
                return this.usageCommand.process(source, "", args.nextIfPresent().map(String::toLowerCase).orElse(null));
            } else {
                throw new NucleusCommandException(thrown);
            }
        }
        // Phase four - create the context and parse the arguments.
        this.argumentParser.parse(source, args, context);
        if (args.hasNext()) {
            thrown.add(Tuple.of(command, new NucleusArgumentParseException(Text.of(TextColors.RED, "Too many arguments"), args.getRaw(), args.getRawPosition(), Text.of(getSimpleUsage(source)), getChildrenUsage(source).orElse(null), true)));
            throw new NucleusCommandException(thrown, allowFallback(source, args, context));
        }
    } catch (NucleusCommandException nce) {
        throw nce;
    } catch (ArgumentParseException ape) {
        // get the command to get the usage/subs from.
        thrown.add(Tuple.of(command, NucleusArgumentParseException.from(ape, Text.of(getSimpleUsage(source)), getChildrenUsage(source).orElse(null))));
        throw new NucleusCommandException(thrown, allowFallback(source, args, context));
    } catch (CommandException ex) {
        // Errors at this point are expected, so we'll run with it - no need for debug mode checks.
        thrown.add(Tuple.of(command, ex));
        throw new NucleusCommandException(thrown, allowFallback(source, args, context));
    } catch (Throwable throwable) {
        String m;
        if (throwable.getMessage() == null) {
            m = "null";
        } else {
            m = throwable.getMessage();
        }
        thrown.add(Tuple.of(command, new CommandException(Nucleus.getNucleus().getMessageProvider().getTextMessageWithFormat("command.exception.unexpected", m), throwable)));
        // this is on demand, so we should throw it.
        throwable.printStackTrace();
        throw new NucleusCommandException(thrown, allowFallback(source, args, context));
    }
    try {
        commandTimings.startTimingIfSync();
        ContinueMode mode = preProcessChecks(castedSource, context);
        if (!mode.cont) {
            return mode.returnType;
        }
        if (castedSource instanceof Player) {
            @SuppressWarnings("unchecked") ContinueMode cm = runChecks((Player) castedSource, context);
            if (!cm.cont) {
                return cm.returnType;
            }
        }
        // If we're running async...
        if (isAsync) {
            // Create an executor that runs the command async.
            plugin.getLogger().debug("Running " + this.getClass().getName() + " in async mode.");
            Sponge.getScheduler().createAsyncExecutor(plugin).execute(() -> onExecute(castedSource, context));
            // Tell Sponge we're done.
            return CommandResult.success();
        }
        return onExecute(castedSource, context);
    } finally {
        commandTimings.stopTimingIfSync();
    }
}
Also used : CommandPermissionException(org.spongepowered.api.command.CommandPermissionException) Player(org.spongepowered.api.entity.living.player.Player) CommandContext(org.spongepowered.api.command.args.CommandContext) ArgumentParseException(org.spongepowered.api.command.args.ArgumentParseException) CommandException(org.spongepowered.api.command.CommandException) CommandCallable(org.spongepowered.api.command.CommandCallable) Tuple(org.spongepowered.api.util.Tuple)

Aggregations

CommandPermissionException (org.spongepowered.api.command.CommandPermissionException)4 CommandException (org.spongepowered.api.command.CommandException)3 PrintWriter (java.io.PrintWriter)2 StringWriter (java.io.StringWriter)2 Optional (java.util.Optional)2 CommandCallable (org.spongepowered.api.command.CommandCallable)2 CommandResult (org.spongepowered.api.command.CommandResult)2 InvocationCommandException (org.spongepowered.api.command.InvocationCommandException)2 ArgumentParseException (org.spongepowered.api.command.args.ArgumentParseException)2 SendCommandEvent (org.spongepowered.api.event.command.SendCommandEvent)2 Text (org.spongepowered.api.text.Text)2 TextMessageException (org.spongepowered.api.util.TextMessageException)2 Preconditions.checkNotNull (com.google.common.base.Preconditions.checkNotNull)1 HashMultimap (com.google.common.collect.HashMultimap)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableSet (com.google.common.collect.ImmutableSet)1 Multimap (com.google.common.collect.Multimap)1 Inject (com.google.inject.Inject)1 Singleton (com.google.inject.Singleton)1 ArrayList (java.util.ArrayList)1