package com.plotsquared.bukkit.chat; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import com.google.gson.stream.JsonWriter; import com.intellectualcrafters.configuration.serialization.ConfigurationSerializable; import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; /** * Internal class: Represents a component of a JSON-serializable {@link FancyMessage}. */ final class MessagePart implements JsonRepresentedObject, ConfigurationSerializable, Cloneable { static final BiMap stylesToNames; static { final ImmutableBiMap.Builder builder = ImmutableBiMap.builder(); for (final ChatColor style : ChatColor.values()) { if (!style.isFormat()) { continue; } String styleName; switch (style) { case MAGIC: styleName = "obfuscated"; break; case UNDERLINE: styleName = "underlined"; break; default: styleName = style.name().toLowerCase(); break; } builder.put(style, styleName); } stylesToNames = builder.build(); } static { ConfigurationSerialization.registerClass(MessagePart.class); } ChatColor color = ChatColor.WHITE; ArrayList styles = new ArrayList(); String clickActionName = null, clickActionData = null, hoverActionName = null; JsonRepresentedObject hoverActionData = null; TextualComponent text = null; String insertionData = null; ArrayList translationReplacements = new ArrayList(); MessagePart(final TextualComponent text) { this.text = text; } MessagePart() { text = null; } @SuppressWarnings("unchecked") public static MessagePart deserialize(final Map serialized) { final MessagePart part = new MessagePart((TextualComponent) serialized.get("text")); part.styles = (ArrayList) serialized.get("styles"); part.color = ChatColor.getByChar(serialized.get("color").toString()); part.hoverActionName = (String) serialized.get("hoverActionName"); part.hoverActionData = (JsonRepresentedObject) serialized.get("hoverActionData"); part.clickActionName = (String) serialized.get("clickActionName"); part.clickActionData = (String) serialized.get("clickActionData"); part.insertionData = (String) serialized.get("insertion"); part.translationReplacements = (ArrayList) serialized.get("translationReplacements"); return part; } boolean hasText() { return text != null; } @Override @SuppressWarnings("unchecked") public MessagePart clone() throws CloneNotSupportedException { final MessagePart obj = (MessagePart) super.clone(); obj.styles = (ArrayList) styles.clone(); if (hoverActionData instanceof JsonString) { obj.hoverActionData = new JsonString(((JsonString) hoverActionData).getValue()); } else if (hoverActionData instanceof FancyMessage) { obj.hoverActionData = ((FancyMessage) hoverActionData).clone(); } obj.translationReplacements = (ArrayList) translationReplacements.clone(); return obj; } @Override public void writeJson(final JsonWriter json) { try { json.beginObject(); text.writeJson(json); json.name("color").value(color.name().toLowerCase()); for (final ChatColor style : styles) { json.name(stylesToNames.get(style)).value(true); } if ((clickActionName != null) && (clickActionData != null)) { json.name("clickEvent").beginObject().name("action").value(clickActionName).name("value").value(clickActionData).endObject(); } if ((hoverActionName != null) && (hoverActionData != null)) { json.name("hoverEvent").beginObject().name("action").value(hoverActionName).name("value"); hoverActionData.writeJson(json); json.endObject(); } if (insertionData != null) { json.name("insertion").value(insertionData); } if ((!translationReplacements.isEmpty()) && (text != null) && TextualComponent.isTranslatableText(text)) { json.name("with").beginArray(); for (final JsonRepresentedObject obj : translationReplacements) { obj.writeJson(json); } json.endArray(); } json.endObject(); } catch (final IOException e) { Bukkit.getLogger().log(Level.WARNING, "A problem occurred during writing of JSON string", e); } } @Override public Map serialize() { final HashMap map = new HashMap(); map.put("text", text); map.put("styles", styles); map.put("color", color.getChar()); map.put("hoverActionName", hoverActionName); map.put("hoverActionData", hoverActionData); map.put("clickActionName", clickActionName); map.put("clickActionData", clickActionData); map.put("insertion", insertionData); map.put("translationReplacements", translationReplacements); return map; } }