package tc.oc.commons.bukkit.chat; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.command.CommandSender; import java.util.ArrayList; import java.util.List; public interface ComponentRenderContext { BaseComponent render(BaseComponent original, CommandSender viewer); default BaseComponent[] render(BaseComponent[] originals, CommandSender viewer) { if(originals == null) return null; BaseComponent[] replacements = originals; int index = 0; for(BaseComponent original : originals) { BaseComponent replacement = render(original, viewer); if(replacement != original && replacements == originals) { // If an entry was replaced and we are still using the original list, // create the replacement list and copy the entries we've already passed. replacements = new BaseComponent[originals.length]; for(BaseComponent passed : originals) { if(passed == original) break; replacements[index++] = passed; } } if(replacements != originals) { // If we have already replaced the list, append the current entry replacements[index++] = replacement; } } return replacements; } default List<BaseComponent> render(List<BaseComponent> originals, CommandSender viewer) { if(originals == null) return null; List<BaseComponent> replacements = originals; for(BaseComponent original : originals) { BaseComponent replacement = render(original, viewer); if(replacement != original && replacements == originals) { // If an entry was replaced and we are still using the original list, // create the replacement list and copy the entries we've already passed. replacements = new ArrayList<>(originals.size()); for(BaseComponent passed : originals) { if(passed == original) break; replacements.add(passed); } } if(replacements != originals) { // If we have already replaced the list, append the current entry replacements.add(replacement); } } return replacements; } default String renderLegacy(BaseComponent original, CommandSender viewer) { return render(original, viewer).toLegacyText(); } default void send(BaseComponent original, CommandSender viewer) { viewer.sendMessage(render(original, viewer)); } default void send(BaseComponent[] originals, CommandSender viewer) { for(BaseComponent component : originals) send(component, viewer); } default void send(List<? extends BaseComponent> originals, CommandSender viewer) { for(BaseComponent component : originals) send(component, viewer); } }