package net.minecraft.command.arg; import java.util.IdentityHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import net.minecraft.command.CommandException; import net.minecraft.command.CommandResultStats; import net.minecraft.command.ICommandSender; import net.minecraft.command.IPermission; import net.minecraft.command.completion.DataRequest; import net.minecraft.command.completion.ITabCompletion; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.completion.TabCompletionData.Weighted; import net.minecraft.command.parser.CompletionParser.CompletionData; public class PermissionWrapper<T> extends CommandArg<T> { private final CommandArg<T> arg; private final IPermission permission; public PermissionWrapper(final CommandArg<T> arg, final IPermission permission) { this.arg = arg; this.permission = permission; } @Override public T eval(final ICommandSender sender) throws CommandException { if (this.permission.canCommandSenderUseCommand(sender)) return this.arg.eval(sender); throw new CommandException("commands.generic.permission"); } public static <T> ArgWrapper<T> wrap(final ArgWrapper<T> toWrap, final IPermission permission) { return toWrap.type.wrap(new PermissionWrapper<>(toWrap.arg(), permission)); } public static class Command extends PermissionWrapper<Integer> { public Command(final CommandArg<Integer> arg, final IPermission permission) { super(arg, permission); } @Override public final Integer eval(final ICommandSender sender) throws CommandException { final int ret = super.eval(sender); sender.func_174794_a(CommandResultStats.Type.SUCCESS_COUNT, ret); return ret; } } public static void complete(final TCDSet tcDataSet, final int startIndex, final CompletionData cData, final Map<ITabCompletion, IPermission> completions) { final Map<Weighted, IPermission> filtered = new IdentityHashMap<>(); for (final Entry<ITabCompletion, IPermission> e : completions.entrySet()) { final Weighted tcData = e.getKey().getMatchData(startIndex, cData); if (tcData != null) filtered.put(tcData, e.getValue()); } tcDataSet.add(new DataRequest() { @Override public void process() { for (final Entry<Weighted, IPermission> e : filtered.entrySet()) { final IPermission permission = e.getValue(); if (permission == null || permission.canCommandSenderUseCommand(cData.sender)) tcDataSet.add(e.getKey()); } } @Override public void createCompletions(final Set<Weighted> tcDataSet) { } }); } }