package net.minecraft.command.type.custom.command;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher;
import net.minecraft.command.IPermission;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.CommandArg;
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.descriptors.CommandDescriptor;
import net.minecraft.command.parser.CompletionParser.CompletionData;
import net.minecraft.command.parser.Context;
import net.minecraft.command.parser.MatcherRegistry;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.IComplete;
import net.minecraft.command.type.base.CustomCompletable;
public final class ParserCommand extends CustomCompletable<CommandArg<Integer>>
{
private ParserCommand()
{
}
public static final MatcherRegistry commandNameMatcher = new MatcherRegistry("\\G\\s*+([\\w-]++|\\?)"); //don't ask...
@Override
public final CommandArg<Integer> iParse(final Parser parser, final Context context) throws SyntaxErrorException
{
final Matcher m = parser.getMatcher(commandNameMatcher);
if (!parser.find(m))
throw parser.SEE("No command name found ");
final String name = m.group(1);
final CommandDescriptor<?> descriptor = CommandDescriptor.getDescriptor(name);
if (descriptor == null)
throw parser.SEE("Unknown command ", ": " + name);
parser.incIndex(m);
return descriptor.parse(parser);
}
@Override
public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData)
{
nameCompleter.complete(tcDataSet, parser, startIndex, cData);
}
public static final IComplete nameCompleter = new IComplete()
{
@Override
public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData)
{
final Map<Weighted, IPermission> completions = new IdentityHashMap<>();
for (final Entry<ITabCompletion, IPermission> e : CommandDescriptor.commandCompletions.entrySet())
{
final Weighted tcData = e.getKey().getMatchData(startIndex, cData);
if (tcData != null)
completions.put(tcData, e.getValue());
}
tcDataSet.add(new DataRequest()
{
@Override
public void process()
{
for (final Entry<Weighted, IPermission> e : completions.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)
{
}
});
}
};
public static final ParserCommand parser = new ParserCommand();
}