Rewrite the code for replacing legacy codes in chat

- Just simply replace the text in the JSON as
   building with TextComponents is unneccesary and
   causes more issues...
This commit is contained in:
Mathias Lystbæk 2024-03-11 01:03:08 +01:00
parent 13c12ced63
commit a564da45be
3 changed files with 38 additions and 84 deletions

View File

@ -10,11 +10,6 @@ import com.comphenix.protocol.wrappers.WrappedChatComponent;
import eu.mathiasl.legacychatfix.config.ConfigManager;
import eu.mathiasl.legacychatfix.config.LegacyChatOption;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.chat.ComponentSerializer;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.MemorySection;
import org.bukkit.configuration.file.FileConfiguration;
@ -60,14 +55,21 @@ public class LegacyChatFixPacketAdapter extends PacketAdapter {
/**
* Set the adapter to listen for packets being sent to the client from "system chat".
*
* @param plugin A reference to the plugin class responsible for the adapter.
*/
public LegacyChatFixPacketAdapter(Plugin plugin, ConfigManager configManager) {
super(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.SYSTEM_CHAT);
this.legacyColors = getLegacyColors(configManager);
this.legacyColors = getLegacyChatOptions(configManager);
}
private HashMap<String, LegacyChatOption> getLegacyColors(ConfigManager configManager) {
/**
* Get the legacy chat options from the config file.
*
* @param configManager The config manager to get the config file from.
* @return A map of legacy color codes to replace.
*/
private HashMap<String, LegacyChatOption> getLegacyChatOptions(ConfigManager configManager) {
HashMap<String, LegacyChatOption> legacyColors = new HashMap<>();
FileConfiguration config = configManager.getConfig("config.yml");
@ -80,13 +82,15 @@ public class LegacyChatFixPacketAdapter extends PacketAdapter {
if (!(value instanceof MemorySection)) return;
MemorySection valueSection = (MemorySection) value;
String legacyCode = valueSection.getString("legacy_code");
String modernCode = valueSection.getString("modern_code");
LegacyChatOption legacyChatOption = new LegacyChatOption(
valueSection.getString("legacy_code"),
valueSection.getString("modern_code")
);
try {
LegacyChatOption legacyChatOption = new LegacyChatOption(legacyCode, modernCode);
legacyColors.put(key, legacyChatOption);
} catch (Exception e) {
plugin.getLogger().warning("Failed to parse legacy color option: legacy_code=" + legacyCode + ", modern_code=" + modernCode);
}
});
return legacyColors;
@ -108,76 +112,26 @@ public class LegacyChatFixPacketAdapter extends PacketAdapter {
WrappedChatComponent chatComponent = chatComponents.read(0); // Get the chat component
// Convert the chat component to a JSON string
String message = chatComponent.getJson(); // Get the message
// Parse the message (to check if it's a chat component)
BaseComponent[] bungeeComponents;
try {
bungeeComponents = ComponentSerializer.parse(message); // Parse the message (to check if it's a chat component
} catch (Exception e) {
plugin.getLogger().warning("Failed to parse chat component: " + message);
return;
}
// If no bungee components are found after all, return
if (bungeeComponents == null || bungeeComponents.length == 0) return;
// Iterate through the bungee components and replace legacy color codes
for (BaseComponent component : bungeeComponents) {
// If the component is not a text component, continue
if (!(component instanceof TextComponent))
continue;
// Replace legacy color codes in the text component
TextComponent textComponent = (TextComponent) component;
replaceLegacyColor(textComponent, legacyColors);
if (textComponent.getExtra() == null || textComponent.getExtra().isEmpty())
continue;
// If the text component has extra components, replace legacy color codes in those as well
for (BaseComponent extra : textComponent.getExtra()) {
if (!(extra instanceof TextComponent))
continue;
TextComponent extraTextComponent = (TextComponent) extra;
replaceLegacyColor(extraTextComponent, legacyColors);
}
}
// Write the modified chat components back to the packet
chatComponents.write(0, WrappedChatComponent.fromJson(ComponentSerializer.toString(bungeeComponents)));
}
/**
* Replaces legacy color code formatting with modern color formatting in
* through the TextComponent and its extra components.
*
* @param textComponent The text component to replace the legacy color codes in.
* @param legacyColors The legacy color codes to replace.
*/
private void replaceLegacyColor(TextComponent textComponent, HashMap<String, LegacyChatOption> legacyColors) {
// Get the text from the text component
String text = textComponent.getText();
// Iterate through the legacy color codes and replace them with modern color codes
boolean containedLegacyCoding = false;
for (String legacyColorIdentifier : legacyColors.keySet()) {
// If the text does not contain the legacy color code, continue
if (!text.contains(legacyColorIdentifier))
continue;
LegacyChatOption legacyColorOption = legacyColors.get(legacyColorIdentifier);
// If the text does not contain the legacy color code, continue
if (!message.contains(legacyColorOption.getLegacyCode()))
continue;
containedLegacyCoding = true;
// Replace the legacy color code with an empty string
text = text.replace(legacyColorOption.getLegacyCode(), "");
// Set the text component's text to the modified text
textComponent.setText(text);
// Set the text component's color to "RESET" initially
ChatColor chatColor = ChatColor.WHITE;
try {
// Try to set the text component's color to the modern color code
chatColor = legacyColorOption.getModernCode();
} catch (IllegalArgumentException e) {
// If the modern color code is invalid, log a warning
this.getPlugin().getLogger().warning("Invalid color code: " + legacyColorOption.getModernCode());
message = message.replace(legacyColorOption.getLegacyCode().replace("\\", "\\\\"), legacyColorOption.getModernCode().toString());
}
// Set the text component's color to the modern color code
textComponent.setColor(chatColor);
// No reason to continue if the message doesn't contain any legacy color codes
if (!containedLegacyCoding) return;
// Write the modified chat components back to the packet
try {
chatComponents.write(0, WrappedChatComponent.fromJson(message));
} catch (Exception e) {
plugin.getLogger().warning("Failed to write chat components back to the packet: " + e.getCause());
}
}
}

View File

@ -35,8 +35,8 @@ public class LegacyChatOption {
@Override
public String toString() {
return "LegacyOption[" +
"legacyColor='" + legacyCode + '\'' +
", modernColor='" + modernCode + '\'' +
"legacyCode='" + legacyCode + '\'' +
", modernCode='" + modernCode + '\'' +
']';
}
}

View File

@ -4,7 +4,7 @@
# - Can be essentially anything as it is just used to check if it is in the chat and replace it accordingly.
# - modern_code: The modern formatting code to replace with.
# - Must be written according to bungeecoord-chat:Chatcolor! This is the actual formatting code that will be used in the chat.
# Including readable name (e.g., black), the older §# codes (e.g., §0), or even RGB using #RRGGBB (e.g., #000000).
# Including readable name (e.g., black), the older §# codes (e.g., §0).
# See: https://github.com/SpigotMC/BungeeCord/blob/master/chat/src/main/java/net/md_5/bungee/api/ChatColor.java
legacy_codes:
black:
@ -72,7 +72,7 @@ legacy_codes:
modern_code: 'obfuscated'
reset:
legacy_code: '\<reset>'
modern_code: 'white' # apparently, 'reset' is not a valid color in modern formatting, so we'll just use white.
modern_code: 'reset' # apparently, 'reset' is not a valid color in modern formatting, so we'll just use black.
secondary:
legacy_code: '\<secondary>'
modern_code: 'white'