package net.blay09.mods.eirairc.util; import net.blay09.mods.eirairc.api.EiraIRCAPI; import net.blay09.mods.eirairc.api.irc.IRCContext; import net.minecraft.command.ICommandSender; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatStyle; import net.minecraft.util.IChatComponent; import java.util.Arrays; public class ChatComponentBuilder { private StringBuilder[] buffer = new StringBuilder[1]; private int index = -1; public ChatComponentBuilder() { push(); } public ChatComponentBuilder text(int i) { return text(String.valueOf(i)); } public ChatComponentBuilder text(String text) { buffer[index].append(text); return this; } public ChatComponentBuilder lang(String langKey, Object... params) { buffer[index].append(I19n.format(langKey, params)); return this; } public ChatComponentBuilder color(char c) { buffer[index].append('\u00a7').append(c); return this; } public void send() { send(null, null); } public void send(IRCContext source) { send(null, source); } public void send(ICommandSender sender) { send(sender, null); } public void send(ICommandSender sender, IRCContext source) { if(sender != null) { EiraIRCAPI.getChatHandler().addChatMessage(sender, toChatComponent(), source); } else { EiraIRCAPI.getChatHandler().addChatMessage(toChatComponent(), source); } buffer[index]= new StringBuilder(); } public ChatComponentBuilder push() { index++; if(buffer.length <= index) { buffer = Arrays.copyOf(buffer, index); } buffer[index] = new StringBuilder(); return this; } public String pop() { String result = buffer[index].toString(); buffer[index] = null; index--; return result; } public IChatComponent toChatComponent() { IChatComponent rootComponent = null; StringBuilder textBuffer = new StringBuilder(); StringBuilder styleBuffer = new StringBuilder(); String result = buffer[index].toString(); for(int i = 0; i < result.length(); i++) { char c = result.charAt(i); if(c == '\u00a7' && i + 1 < result.length()) { if(textBuffer.length() > 0) { IChatComponent newComponent = new ChatComponentText(textBuffer.toString()); setStyleFromString(newComponent, styleBuffer.toString()); if(rootComponent == null) { rootComponent = newComponent; } else { rootComponent.appendSibling(newComponent); } styleBuffer = new StringBuilder(); textBuffer = new StringBuilder(); } styleBuffer.append('\u00a7').append(result.charAt(i + 1)); i++; } else { textBuffer.append(c); } } if(textBuffer.length() > 0) { IChatComponent newComponent = new ChatComponentText(textBuffer.toString()); setStyleFromString(newComponent, styleBuffer.toString()); if(rootComponent == null) { rootComponent = newComponent; } else { rootComponent.appendSibling(newComponent); } } return rootComponent; } private void setStyleFromString(IChatComponent component, String style) { ChatStyle chatStyle = component.getChatStyle(); if(style.length() > 0) { for(int i = 1; i < style.length(); i += 2) { char c = style.charAt(i); switch(c) { case 'o': chatStyle.setItalic(true); break; case 'n': chatStyle.setUnderlined(true); break; case 'm': chatStyle.setStrikethrough(true); break; case 'l': chatStyle.setBold(true); break; case 'k': chatStyle.setObfuscated(true); break; case 'r': break; default: chatStyle.setColor(IRCFormatting.getColorFromMCColorCode(c)); } } } } public static ChatComponentBuilder create() { return new ChatComponentBuilder(); } }