Update to latest Piston changes

This commit is contained in:
Kenzie Togami 2019-04-27 03:33:13 -07:00
parent 7dcf8f5a45
commit 0960f70e6b
No known key found for this signature in database
GPG Key ID: 5D200B325E157A81
5 changed files with 77 additions and 55 deletions

View File

@ -39,6 +39,7 @@ import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.io.Closer;
import com.sk89q.worldedit.util.io.file.FilenameException;
import org.enginehub.piston.annotation.Command;
@ -159,7 +160,7 @@ public class SchematicCommands {
boolean overwrite = f.exists();
if (overwrite) {
if (!player.hasPermission("worldedit.schematic.delete")) {
throw new StopExecutionException("That schematic already exists!");
throw new StopExecutionException(TextComponent.of("That schematic already exists!"));
}
if (!allowOverwrite) {
player.printError("That schematic already exists. Use the -f flag to overwrite it.");
@ -186,7 +187,8 @@ public class SchematicCommands {
File parent = f.getParentFile();
if (parent != null && !parent.exists()) {
if (!parent.mkdirs()) {
throw new StopExecutionException("Could not create folder for schematics!");
throw new StopExecutionException(TextComponent.of(
"Could not create folder for schematics!"));
}
}
@ -277,7 +279,7 @@ public class SchematicCommands {
@Switch(name = 'n', desc = "Sort by date, newest first")
boolean newFirst) {
if (oldFirst && newFirst) {
throw new StopExecutionException("Cannot sort by oldest and newest.");
throw new StopExecutionException(TextComponent.of("Cannot sort by oldest and newest."));
}
File dir = worldEdit.getWorkingDirectoryFile(worldEdit.getConfiguration().saveDir);
List<File> fileList = allFiles(dir);

View File

@ -83,13 +83,13 @@ public class PrintCommandHelp {
return;
}
List<String> visited = new ArrayList<>();
List<Command> visited = new ArrayList<>();
Command currentCommand = detectCommand(manager, commandPath.get(0));
if (currentCommand == null) {
actor.printError(String.format("The command '%s' could not be found.", commandPath.get(0)));
return;
}
visited.add(commandPath.get(0));
visited.add(currentCommand);
// Drill down to the command
for (int i = 1; i < commandPath.size(); i++) {
@ -103,8 +103,8 @@ public class PrintCommandHelp {
}
if (subCommands.containsKey(subCommand)) {
visited.add(subCommand);
currentCommand = subCommands.get(subCommand);
visited.add(currentCommand);
} else {
actor.printError(String.format("The sub-command '%s' under '%s' could not be found.",
subCommand, Joiner.on(" ").join(visited)));
@ -116,7 +116,8 @@ public class PrintCommandHelp {
if (subCommands.isEmpty()) {
// Create the message
CommandUsageBox box = new CommandUsageBox(currentCommand, String.join(" ", visited));
CommandUsageBox box = new CommandUsageBox(visited, visited.stream()
.map(Command::getName).collect(Collectors.joining(" ")));
actor.print(box.create());
} else {
printAllCommands(page, perPage, subCommands.values().stream(), actor, visited);
@ -124,7 +125,7 @@ public class PrintCommandHelp {
}
private static void printAllCommands(int page, int perPage, Stream<Command> commandStream, Actor actor,
List<String> commandList) {
List<Command> commandList) {
// Get a list of aliases
List<Command> commands = commandStream
.sorted(byCleanName())
@ -151,7 +152,8 @@ public class PrintCommandHelp {
// Add each command
for (Command mapping : list) {
String alias = (commandList.isEmpty() ? "/" : "") + mapping.getName();
String command = Stream.concat(commandList.stream(), Stream.of(mapping.getName()))
String command = Stream.concat(commandList.stream(), Stream.of(mapping))
.map(Command::getName)
.collect(Collectors.joining(" ", "/", ""));
box.appendCommand(alias, mapping.getDescription(), command);
}

View File

@ -94,9 +94,11 @@ import com.sk89q.worldedit.util.command.parametric.ExceptionConverter;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
import com.sk89q.worldedit.util.logging.DynamicStreamHandler;
import com.sk89q.worldedit.util.logging.LogFormat;
import com.sk89q.worldedit.world.World;
import org.enginehub.piston.ColorConfig;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.DefaultCommandManagerService;
@ -112,6 +114,7 @@ import org.enginehub.piston.inject.MapBackedValueStore;
import org.enginehub.piston.inject.MemoizingValueAccess;
import org.enginehub.piston.inject.MergedValueAccess;
import org.enginehub.piston.part.SubCommandPart;
import org.enginehub.piston.util.HelpGenerator;
import org.enginehub.piston.util.ValueProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -499,21 +502,28 @@ public final class PlatformCommandManager {
actor.printError("You are not permitted to do that. Are you in the right mode?");
}
} catch (UsageException e) {
String message = e.getMessage();
actor.printError(message != null ? message : "The command was not used properly (no more help available).");
actor.print(TextComponent.builder("")
.color(TextColor.RED)
.append(e.getRichMessage())
.build());
ImmutableList<Command> cmd = e.getCommands();
if (cmd.size() > 0) {
actor.print(TextComponent.builder("Usage: ")
.color(TextColor.RED)
.append(TextComponent.of("/", ColorConfig.getMainText()))
.append(HelpGenerator.create(cmd).getUsage())
.build());
}
} catch (CommandExecutionException e) {
Throwable t = e.getCause();
actor.printError("Please report this error: [See console]");
actor.printRaw(t.getClass().getName() + ": " + t.getMessage());
log.error("An unexpected error while handling a WorldEdit command", t);
} catch (CommandException e) {
String message = e.getMessage();
if (message != null) {
actor.printError(e.getMessage());
} else {
actor.printError("An unknown error has occurred! Please see console.");
log.error("An unknown error occurred", e);
}
actor.print(TextComponent.builder("")
.color(TextColor.RED)
.append(e.getRichMessage())
.build());
} finally {
Optional<EditSession> editSessionOpt =
context.snapshotMemory().injectedValue(Key.of(EditSession.class));

View File

@ -21,6 +21,7 @@ package com.sk89q.worldedit.internal.command;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableList;
import com.sk89q.worldedit.DisallowedItemException;
import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.IncompleteRegionException;
@ -39,6 +40,7 @@ import com.sk89q.worldedit.internal.expression.ExpressionException;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.util.command.parametric.ExceptionConverterHelper;
import com.sk89q.worldedit.util.command.parametric.ExceptionMatch;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.io.file.FileSelectionAbortedException;
import com.sk89q.worldedit.util.io.file.FilenameResolutionException;
import com.sk89q.worldedit.util.io.file.InvalidFilenameException;
@ -61,110 +63,114 @@ public class WorldEditExceptionConverter extends ExceptionConverterHelper {
this.worldEdit = worldEdit;
}
private CommandException newCommandException(String message, Throwable cause) {
return new CommandException(TextComponent.of(message), cause, ImmutableList.of());
}
@ExceptionMatch
public void convert(NumberFormatException e) throws CommandException {
final Matcher matcher = numberFormat.matcher(e.getMessage());
if (matcher.matches()) {
throw newCommandException("Number expected; string \"" + matcher.group(1)
+ "\" given.", e, null);
+ "\" given.", e);
} else {
throw new CommandException("Number expected; string given.", e, null);
throw newCommandException("Number expected; string given.", e);
}
}
@ExceptionMatch
public void convert(IncompleteRegionException e) throws CommandException {
throw new CommandException("Make a region selection first.", e, null);
throw newCommandException("Make a region selection first.", e);
}
@ExceptionMatch
public void convert(UnknownItemException e) throws CommandException {
throw new CommandException("Block name '" + e.getID() + "' was not recognized.", e, null);
throw newCommandException("Block name '" + e.getID() + "' was not recognized.", e);
}
@ExceptionMatch
public void convert(InvalidItemException e) throws CommandException {
throw new CommandException(e.getMessage(), e, null);
throw newCommandException(e.getMessage(), e);
}
@ExceptionMatch
public void convert(DisallowedItemException e) throws CommandException {
throw newCommandException("Block '" + e.getID()
+ "' not allowed (see WorldEdit configuration).", e, null);
+ "' not allowed (see WorldEdit configuration).", e);
}
@ExceptionMatch
public void convert(MaxChangedBlocksException e) throws CommandException {
throw newCommandException("Max blocks changed in an operation reached ("
+ e.getBlockLimit() + ").", e, null);
+ e.getBlockLimit() + ").", e);
}
@ExceptionMatch
public void convert(MaxBrushRadiusException e) throws CommandException {
throw new CommandException("Maximum brush radius (in configuration): " + worldEdit.getConfiguration().maxBrushRadius, e, null);
throw newCommandException("Maximum brush radius (in configuration): " + worldEdit.getConfiguration().maxBrushRadius, e);
}
@ExceptionMatch
public void convert(MaxRadiusException e) throws CommandException {
throw new CommandException("Maximum radius (in configuration): " + worldEdit.getConfiguration().maxRadius, e, null);
throw newCommandException("Maximum radius (in configuration): " + worldEdit.getConfiguration().maxRadius, e);
}
@ExceptionMatch
public void convert(UnknownDirectionException e) throws CommandException {
throw new CommandException("Unknown direction: " + e.getDirection(), e, null);
throw newCommandException("Unknown direction: " + e.getDirection(), e);
}
@ExceptionMatch
public void convert(InsufficientArgumentsException e) throws CommandException {
throw new CommandException(e.getMessage(), e, null);
throw newCommandException(e.getMessage(), e);
}
@ExceptionMatch
public void convert(RegionOperationException e) throws CommandException {
throw new CommandException(e.getMessage(), e, null);
throw newCommandException(e.getMessage(), e);
}
@ExceptionMatch
public void convert(ExpressionException e) throws CommandException {
throw new CommandException(e.getMessage(), e, null);
throw newCommandException(e.getMessage(), e);
}
@ExceptionMatch
public void convert(EmptyClipboardException e) throws CommandException {
throw new CommandException("Your clipboard is empty. Use //copy first.", e, null);
throw newCommandException("Your clipboard is empty. Use //copy first.", e);
}
@ExceptionMatch
public void convert(InvalidFilenameException e) throws CommandException {
throw newCommandException("Filename '" + e.getFilename() + "' invalid: "
+ e.getMessage(), e, null);
+ e.getMessage(), e);
}
@ExceptionMatch
public void convert(FilenameResolutionException e) throws CommandException {
throw newCommandException(
"File '" + e.getFilename() + "' resolution error: " + e.getMessage(), e, null);
"File '" + e.getFilename() + "' resolution error: " + e.getMessage(), e);
}
@ExceptionMatch
public void convert(InvalidToolBindException e) throws CommandException {
throw new CommandException("Can't bind tool to " + e.getItemType().getName() + ": " + e.getMessage(), e, null);
throw newCommandException("Can't bind tool to " + e.getItemType().getName() + ": " + e.getMessage(), e);
}
@ExceptionMatch
public void convert(FileSelectionAbortedException e) throws CommandException {
throw new CommandException("File selection aborted.", e, null);
throw newCommandException("File selection aborted.", e);
}
@ExceptionMatch
public void convert(WorldEditException e) throws CommandException {
throw new CommandException(e.getMessage(), e, null);
throw newCommandException(e.getMessage(), e);
}
@ExceptionMatch
public void convert(IllegalArgumentException e) throws CommandException {
throw new CommandException(e.getMessage(), e, null);
throw newCommandException(e.getMessage(), e);
}
}

View File

@ -19,8 +19,10 @@
package com.sk89q.worldedit.util.formatting.component;
import com.google.common.collect.Iterables;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandParameters;
import org.enginehub.piston.util.HelpGenerator;
import javax.annotation.Nullable;
import java.util.List;
@ -39,26 +41,26 @@ public class CommandUsageBox extends TextComponentProducer {
/**
* Create a new usage box.
*
* @param command the command to describe
* @param commandString the command that was used, such as "/we" or "/brush sphere"
* @param commands the commands to describe
* @param commandString the commands that were used, such as "/we" or "/brush sphere"
*/
public CommandUsageBox(Command command, String commandString) {
this(command, commandString, null);
public CommandUsageBox(List<Command> commands, String commandString) {
this(commands, commandString, null);
}
/**
* Create a new usage box.
*
* @param command the command to describe
* @param commandString the command that was used, such as "/we" or "/brush sphere"
* @param commands the commands to describe
* @param commandString the commands that were used, such as "/we" or "/brush sphere"
* @param parameters list of parameters to use
*/
public CommandUsageBox(Command command, String commandString, @Nullable CommandParameters parameters) {
checkNotNull(command);
public CommandUsageBox(List<Command> commands, String commandString, @Nullable CommandParameters parameters) {
checkNotNull(commands);
checkNotNull(commandString);
Map<String, Command> subCommands = getSubCommands(command);
Map<String, Command> subCommands = getSubCommands(Iterables.getLast(commands));
if (subCommands.isEmpty()) {
attachCommandUsage(command, commandString);
attachCommandUsage(commands, commandString);
} else {
attachSubcommandUsage(subCommands, commandString, parameters);
}
@ -81,9 +83,9 @@ public class CommandUsageBox extends TextComponentProducer {
append(box.create());
}
private void attachCommandUsage(Command description, String commandString) {
private void attachCommandUsage(List<Command> commands, String commandString) {
MessageBox box = new MessageBox("Help for " + commandString,
new TextComponentProducer().append(description.getFullHelp()));
new TextComponentProducer().append(HelpGenerator.create(commands).getFullHelp()));
append(box.create());
}