Limit length of chat string conversions

This commit is contained in:
md_5 2025-06-05 21:00:01 +10:00
parent 93508d5083
commit b60c1bdb37
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
7 changed files with 57 additions and 16 deletions

View File

@ -4,6 +4,7 @@ import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@ -677,11 +678,11 @@ public abstract class BaseComponent
public String toPlainText()
{
StringBuilder builder = new StringBuilder();
toPlainText( builder );
toPlainText( new LimitedStringVisitor( builder, Short.MAX_VALUE ) );
return builder.toString();
}
void toPlainText(StringBuilder builder)
void toPlainText(StringVisitor builder)
{
if ( extra != null )
{
@ -701,11 +702,11 @@ public abstract class BaseComponent
public String toLegacyText()
{
StringBuilder builder = new StringBuilder();
toLegacyText( builder );
toLegacyText( new LimitedStringVisitor( builder, Short.MAX_VALUE ) );
return builder.toString();
}
void toLegacyText(StringBuilder builder)
void toLegacyText(StringVisitor builder)
{
if ( extra != null )
{
@ -716,7 +717,7 @@ public abstract class BaseComponent
}
}
void addFormat(StringBuilder builder)
void addFormat(StringVisitor builder)
{
builder.append( getColor() );
if ( isBold() )
@ -740,4 +741,35 @@ public abstract class BaseComponent
builder.append( ChatColor.MAGIC );
}
}
@FunctionalInterface
protected static interface StringVisitor
{
void append(String s);
default void append(Object obj)
{
append( String.valueOf( obj ) );
}
}
@Data
protected static class LimitedStringVisitor implements StringVisitor
{
private final StringBuilder builder;
private final int maxLength;
@Override
public void append(String s)
{
if ( builder.length() >= maxLength )
{
throw new IllegalArgumentException( "String exceeded maximum length " + maxLength );
}
builder.append( s );
}
}
}

View File

@ -50,14 +50,14 @@ public final class KeybindComponent extends BaseComponent
}
@Override
protected void toPlainText(StringBuilder builder)
protected void toPlainText(StringVisitor builder)
{
builder.append( getKeybind() );
super.toPlainText( builder );
}
@Override
protected void toLegacyText(StringBuilder builder)
protected void toLegacyText(StringVisitor builder)
{
addFormat( builder );
builder.append( getKeybind() );

View File

@ -85,14 +85,14 @@ public final class ScoreComponent extends BaseComponent
}
@Override
protected void toPlainText(StringBuilder builder)
protected void toPlainText(StringVisitor builder)
{
builder.append( this.value );
super.toPlainText( builder );
}
@Override
protected void toLegacyText(StringBuilder builder)
protected void toLegacyText(StringVisitor builder)
{
addFormat( builder );
builder.append( this.value );

View File

@ -69,14 +69,14 @@ public final class SelectorComponent extends BaseComponent
}
@Override
protected void toPlainText(StringBuilder builder)
protected void toPlainText(StringVisitor builder)
{
builder.append( this.selector );
super.toPlainText( builder );
}
@Override
protected void toLegacyText(StringBuilder builder)
protected void toLegacyText(StringVisitor builder)
{
addFormat( builder );
builder.append( this.selector );

View File

@ -280,14 +280,14 @@ public final class TextComponent extends BaseComponent
}
@Override
protected void toPlainText(StringBuilder builder)
protected void toPlainText(StringVisitor builder)
{
builder.append( text );
super.toPlainText( builder );
}
@Override
protected void toLegacyText(StringBuilder builder)
protected void toLegacyText(StringVisitor builder)
{
addFormat( builder );
builder.append( text );

View File

@ -156,20 +156,20 @@ public final class TranslatableComponent extends BaseComponent
}
@Override
protected void toPlainText(StringBuilder builder)
protected void toPlainText(StringVisitor builder)
{
convert( builder, false );
super.toPlainText( builder );
}
@Override
protected void toLegacyText(StringBuilder builder)
protected void toLegacyText(StringVisitor builder)
{
convert( builder, true );
super.toLegacyText( builder );
}
private void convert(StringBuilder builder, boolean applyFormat)
private void convert(StringVisitor builder, boolean applyFormat)
{
String trans = TranslationRegistry.INSTANCE.translate( translate );

View File

@ -564,6 +564,15 @@ public class ComponentsTest
assertEquals( "http://google.com/test", url2.getValue() );
}
@Test
public void testLong()
{
BaseComponent test = ComponentSerializer.deserialize( "{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[{\"translate\":\"%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s%1$s\",\"with\":[\"Test\"]}]}]}]}]}]}]}]}]}]}" );
assertThrows( RuntimeException.class, test::toLegacyText );
assertThrows( RuntimeException.class, test::toPlainText );
}
@Test
public void testBuilderCreate()
{