use of org.spongepowered.api.command.CommandMapping in project core by CubeEngine.
the class CubeCommandManager method addCommand.
@Override
public boolean addCommand(CommandBase command) {
if (command instanceof AliasCommand) {
Set<CommandBase> cmds = commands.computeIfAbsent(((AliasCommand) command).getTarget(), k -> new HashSet<>());
cmds.add(command);
}
if (command.getDescriptor() instanceof CubeDescriptor) {
CubeDescriptor descriptor = (CubeDescriptor) command.getDescriptor();
String name = mm.getModuleName(descriptor.getOwner()).orElse(descriptor.getOwner().getSimpleName());
Permission parent = pm.register(descriptor.getOwner(), "command", "Allows using all commands of " + name, null);
descriptor.registerPermission(pm, parent);
}
boolean b = super.addCommand(command);
if (!(command instanceof AliasCommand) || ((AliasDescriptor) command.getDescriptor()).mainDescriptor().getDispatcher() != this) {
Optional<CommandMapping> mapping = registerSpongeCommand(command.getDescriptor());
if (mapping.isPresent()) {
mappings.put(command, mapping.get());
commandLogger.debug("Registered command: " + mapping.get().getPrimaryAlias());
return b;
}
commandLogger.warn("Command was not registered successfully!");
}
return b;
}
use of org.spongepowered.api.command.CommandMapping 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();
}
use of org.spongepowered.api.command.CommandMapping in project LanternServer by LanternPowered.
the class CommandHelp method completeSpec.
@Override
public void completeSpec(PluginContainer pluginContainer, CommandSpec.Builder specBuilder) {
final Comparator<CommandMapping> comparator = Comparator.comparing(CommandMapping::getPrimaryAlias);
specBuilder.arguments(GenericArguments.optional(new CommandElement(Text.of("command")) {
@Nullable
@Override
protected Object parseValue(CommandSource source, CommandArgs args) throws ArgumentParseException {
return args.next();
}
@Override
public List<String> complete(CommandSource src, CommandArgs args, CommandContext context) {
final String nextArg = args.nextIfPresent().orElse("");
return Lantern.getGame().getCommandManager().getAliases().stream().filter(new StartsWithPredicate(nextArg)).collect(Collectors.toList());
}
})).description(Text.of("View a list of all commands")).extendedDescription(Text.of("View a list of all commands. Hover over\n" + " a command to view its description. Click\n" + " a command to insert it into your chat bar.")).executor((src, args) -> {
Optional<String> command = args.getOne("command");
if (command.isPresent()) {
Optional<? extends CommandMapping> mapping = Sponge.getCommandManager().get(command.get());
if (mapping.isPresent()) {
CommandCallable callable = mapping.get().getCallable();
Optional<? extends Text> desc;
// command name in the usage message
if (callable instanceof CommandSpec) {
Text.Builder builder = Text.builder();
callable.getShortDescription(src).ifPresent(des -> builder.append(des, Text.NEW_LINE));
builder.append(t("commands.generic.usage", t("/%s %s", command.get(), callable.getUsage(src))));
Text extendedDescription;
try {
// TODO: Why is there no method :(
extendedDescription = (Text) extendedDescriptionField.get(callable);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
if (extendedDescription != null) {
builder.append(Text.NEW_LINE, extendedDescription);
}
src.sendMessage(builder.build());
} else if ((desc = callable.getHelp(src)).isPresent()) {
src.sendMessage(desc.get());
} else {
src.sendMessage(t("commands.generic.usage", t("/%s %s", command.get(), callable.getUsage(src))));
}
return CommandResult.success();
}
throw new CommandException(Text.of("No such command: ", command.get()));
}
Lantern.getGame().getScheduler().submitAsyncTask(() -> {
TreeSet<CommandMapping> commands = new TreeSet<>(comparator);
commands.addAll(Collections2.filter(Sponge.getCommandManager().getAll().values(), input -> input.getCallable().testPermission(src)));
final Text title = Text.builder("Available commands:").color(TextColors.DARK_GREEN).build();
final List<Text> lines = commands.stream().map(c -> getDescription(src, c)).collect(Collectors.toList());
// Console sources cannot see/use the pagination
if (!(src instanceof ConsoleSource)) {
Sponge.getGame().getServiceManager().provide(PaginationService.class).get().builder().title(title).padding(Text.of(TextColors.DARK_GREEN, "=")).contents(lines).sendTo(src);
} else {
src.sendMessage(title);
src.sendMessages(lines);
}
return null;
});
return CommandResult.success();
});
}
use of org.spongepowered.api.command.CommandMapping in project Nucleus by NucleusPowered.
the class CommandSpyListener method onCommand.
@Listener(order = Order.LAST)
public void onCommand(SendCommandEvent event, @Root Player player) {
if (!player.hasPermission(this.exemptTarget)) {
boolean isInList = false;
if (!this.listIsEmpty) {
String command = event.getCommand().toLowerCase();
Optional<? extends CommandMapping> oc = Sponge.getCommandManager().get(command, player);
Set<String> cmd;
// If the command exists, then get all aliases.
cmd = oc.map(commandMapping -> commandMapping.getAllAliases().stream().map(String::toLowerCase).collect(Collectors.toSet())).orElseGet(() -> Sets.newHashSet(command));
isInList = this.config.getCommands().stream().map(String::toLowerCase).anyMatch(cmd::contains);
}
// If the command is in the list, report it.
if (isInList == this.config.isUseWhitelist()) {
List<Player> playerList = Sponge.getServer().getOnlinePlayers().stream().filter(x -> !x.getUniqueId().equals(player.getUniqueId())).filter(x -> x.hasPermission(this.basePermission)).filter(x -> Nucleus.getNucleus().getUserDataManager().getUnchecked(x).get(CommandSpyUserDataModule.class).isCommandSpy()).collect(Collectors.toList());
if (!playerList.isEmpty()) {
Text prefix = this.config.getTemplate().getForCommandSource(player);
TextParsingUtils.StyleTuple st = TextParsingUtils.getLastColourAndStyle(prefix, null);
Text messageToSend = prefix.toBuilder().append(Text.of(st.colour, st.style, "/", event.getCommand(), Util.SPACE, event.getArguments())).build();
playerList.forEach(x -> x.sendMessage(messageToSend));
}
}
}
}
use of org.spongepowered.api.command.CommandMapping in project SpongeCommon by SpongePowered.
the class CommandPermissions method populateMinecraftPermissions.
public static void populateMinecraftPermissions(ICommandSender sender, MemorySubjectData data) {
// ICommandSenders have a *very* basic understanding of permissions, so
// get what we can.
populateNonCommandPermissions(data, sender::canUseCommand);
for (CommandMapping command : SpongeImpl.getGame().getCommandManager().getCommands()) {
if (command.getCallable() instanceof MinecraftCommandWrapper) {
MinecraftCommandWrapper wrapper = (MinecraftCommandWrapper) command.getCallable();
data.setPermission(SubjectData.GLOBAL_CONTEXT, wrapper.getCommandPermission(), Tristate.fromBoolean(wrapper.command.checkPermission(sender.getServer(), sender)));
}
}
}
Aggregations