From 9de94d91ac5323e515838f2e0155a3dc945d37ac Mon Sep 17 00:00:00 2001 From: sciwhiz12 Date: Mon, 16 Sep 2024 06:05:14 +0800 Subject: [PATCH] Truncate tags command clipboard text to 1000 entries Fixes #1543 --- .../neoforge/server/command/TagsCommand.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/server/command/TagsCommand.java b/src/main/java/net/neoforged/neoforge/server/command/TagsCommand.java index 7586efd3e4..167514f56f 100644 --- a/src/main/java/net/neoforged/neoforge/server/command/TagsCommand.java +++ b/src/main/java/net/neoforged/neoforge/server/command/TagsCommand.java @@ -52,6 +52,10 @@ * */ class TagsCommand { + // The limit of how many elements can be in the clipboard text at once + // Roughly equal to how many 32-characters-long elements can fit into a 32,767-long string + // (which is the default limit for UTF-8 strings in FriendlyByteBuf + private static final long CLIPBOARD_TEXT_ELEMENTS_LIMIT = 1000; private static final long PAGE_SIZE = 8; private static final ResourceKey>> ROOT_REGISTRY_KEY = ResourceKey.createRegistryKey(ResourceLocation.withDefaultNamespace("root")); @@ -172,16 +176,26 @@ private static MutableComponent createMessage(final MutableComponent header, final long currentPage, final ChatFormatting elementColor, final Supplier> names) { - final String allElementNames = names.get().sorted().collect(Collectors.joining("\n")); final long totalPages = (count - 1) / PAGE_SIZE + 1; final long actualPage = (long) Mth.clamp(currentPage, 1, totalPages); MutableComponent containsComponent = Component.translatable(containsText, count); if (count > 0) // Highlight the count text, make it clickable, and append page counters { + final String clipboardText; + final String clipboardElements = names.get().sorted().limit(CLIPBOARD_TEXT_ELEMENTS_LIMIT).collect(Collectors.joining("\n")); + if (count > CLIPBOARD_TEXT_ELEMENTS_LIMIT) { + // Over the limit; add additional info to clipboard text + clipboardText = "(Too many entries to fit in clipboard, showing only first " + CLIPBOARD_TEXT_ELEMENTS_LIMIT + " entries...)" + '\n' + + clipboardElements + '\n' + + "(..." + (count - CLIPBOARD_TEXT_ELEMENTS_LIMIT) + " more entries not shown)"; + } else { + clipboardText = clipboardElements; + } + containsComponent = ComponentUtils.wrapInSquareBrackets(containsComponent.withStyle(s -> s .withColor(ChatFormatting.GREEN) - .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, allElementNames)) + .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, clipboardText)) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.translatable(copyHoverText))))); containsComponent = Component.translatable("commands.neoforge.tags.page_info",