From 65684d003696d9d1e980ea357ca9263ede341b7c Mon Sep 17 00:00:00 2001 From: jmp Date: Wed, 25 Nov 2020 21:47:40 -0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Add=20stacktrace=20click=20and?= =?UTF-8?q?=20hover=20events=20to=20the=20default=20minecraft-extras=20Com?= =?UTF-8?q?mandExecutionException=20handler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extras/MinecraftExceptionHandler.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/cloud-minecraft/cloud-minecraft-extras/src/main/java/cloud/commandframework/minecraft/extras/MinecraftExceptionHandler.java b/cloud-minecraft/cloud-minecraft-extras/src/main/java/cloud/commandframework/minecraft/extras/MinecraftExceptionHandler.java index 6f210731..55119f31 100644 --- a/cloud-minecraft/cloud-minecraft-extras/src/main/java/cloud/commandframework/minecraft/extras/MinecraftExceptionHandler.java +++ b/cloud-minecraft/cloud-minecraft-extras/src/main/java/cloud/commandframework/minecraft/extras/MinecraftExceptionHandler.java @@ -32,9 +32,14 @@ import cloud.commandframework.exceptions.NoPermissionException; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.identity.Identity; 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.TextDecoration; import org.checkerframework.checker.nullness.qual.NonNull; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; @@ -97,10 +102,30 @@ public final class MinecraftExceptionHandler { */ public static final Function DEFAULT_COMMAND_EXECUTION_FUNCTION = 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 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() - .append(Component.text("An internal error occurred while attempting to perform this command.", - NamedTextColor.RED)) + .append(Component.text( + "An internal error occurred while attempting to perform this command.", + NamedTextColor.RED + )) + .hoverEvent(hover) + .clickEvent(click) .build(); };