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
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 );