🎨 Add stacktrace click and hover events to the default minecraft-extras CommandExecutionException handler

This commit is contained in:
jmp 2020-11-25 21:47:40 -08:00 • committed by Alexander Söderberg
parent 2cfbdc8415
commit 65684d0036

View file

@ -32,9 +32,14 @@ import cloud.commandframework.exceptions.NoPermissionException;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.identity.Identity; import net.kyori.adventure.identity.Identity;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@ -97,10 +102,30 @@ public final class MinecraftExceptionHandler<C> {
*/ */
public static final Function<Exception, Component> DEFAULT_COMMAND_EXECUTION_FUNCTION = public static final Function<Exception, Component> DEFAULT_COMMAND_EXECUTION_FUNCTION =
e -> { e -> {
e.getCause().printStackTrace(); final Throwable cause = e.getCause();
cause.printStackTrace();
final StringWriter writer = new StringWriter();
cause.printStackTrace(new PrintWriter(writer));
final String stackTrace = writer.toString().replaceAll("\t", " ");
final HoverEvent<Component> hover = HoverEvent.showText(
Component.text()
.append(Component.text(stackTrace))
.append(Component.newline())
.append(Component.text(
" Click to copy",
NamedTextColor.GRAY,
TextDecoration.ITALIC
))
);
final ClickEvent click = ClickEvent.copyToClipboard(stackTrace);
return Component.text() return Component.text()
.append(Component.text("An internal error occurred while attempting to perform this command.", .append(Component.text(
NamedTextColor.RED)) "An internal error occurred while attempting to perform this command.",
NamedTextColor.RED
))
.hoverEvent(hover)
.clickEvent(click)
.build(); .build();
}; };