package net.blay09.mods.eirairc.client.gui.chat;
import com.google.common.collect.Lists;
import net.blay09.mods.eirairc.EiraIRC;
import net.blay09.mods.eirairc.api.EiraIRCAPI;
import net.blay09.mods.eirairc.api.event.ClientChatEvent;
import net.blay09.mods.eirairc.api.irc.IRCChannel;
import net.blay09.mods.eirairc.api.irc.IRCContext;
import net.blay09.mods.eirairc.api.irc.IRCUser;
import net.blay09.mods.eirairc.client.gui.GuiEiraIRCMenu;
import net.blay09.mods.eirairc.client.gui.screenshot.GuiImagePreview;
import net.blay09.mods.eirairc.config.ClientGlobalConfig;
import net.blay09.mods.eirairc.config.SharedGlobalConfig;
import net.blay09.mods.eirairc.handler.ChatSessionHandler;
import net.blay09.mods.eirairc.util.Globals;
import net.blay09.mods.eirairc.util.I19n;
import net.blay09.mods.eirairc.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.*;
import net.minecraft.event.ClickEvent;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.common.MinecraftForge;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
public class GuiChatExtension {
public static final int COLOR_BACKGROUND = Integer.MIN_VALUE;
public static final int SHOW_HELP_TIME = 100;
private final GuiChat parentScreen;
private FontRenderer fontRenderer;
private final List<String> foundIRCNames = Lists.newArrayList();
private GuiTextField inputField;
private ChatSessionHandler chatSession;
private GuiButton btnOptions;
private URL clickedURL;
private IRCContext ircNamesFound;
private int autoCompleteIndex;
private int showHelpTime;
public GuiChatExtension(GuiChat parentScreen, GuiTextField inputField) {
this.parentScreen = parentScreen;
this.inputField = inputField;
chatSession = EiraIRC.instance.getChatSessionHandler();
}
public boolean autocompletePlayernames() {
if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
return false;
}
if(chatSession.getChatTarget() == null) {
return true;
} else {
int i = inputField.func_146197_a(-1, inputField.getCursorPosition(), false);
String searchName = inputField.getText().substring(i).toLowerCase();
if (ircNamesFound == chatSession.getChatTarget()) {
inputField.deleteFromCursor(inputField.func_146197_a(-1, inputField.getCursorPosition(), false) - inputField.getCursorPosition());
if(autoCompleteIndex >= foundIRCNames.size()) {
autoCompleteIndex = 0;
}
} else {
foundIRCNames.clear();
autoCompleteIndex = 0;
if(chatSession.getChatTarget() instanceof IRCChannel) {
for(IRCUser user : ((IRCChannel) chatSession.getChatTarget()).getUserList()) {
if(user.getName().toLowerCase().startsWith(searchName.toLowerCase())) {
foundIRCNames.add(user.getName());
}
}
}
if(this.foundIRCNames.isEmpty()) {
return false;
}
ircNamesFound = chatSession.getChatTarget();
inputField.deleteFromCursor(i - inputField.getCursorPosition());
}
if(foundIRCNames.size() > 1) {
StringBuilder sb = new StringBuilder();
for(String s : foundIRCNames) {
if(sb.length() > 0) {
sb.append(", ");
}
sb.append(s);
}
parentScreen.mc.ingameGUI.getChatGUI().printChatMessageWithOptionalDeletion(new ChatComponentText(sb.toString()), 1);
}
if(!foundIRCNames.isEmpty()) {
inputField.writeText(EnumChatFormatting.getTextWithoutFormattingCodes(foundIRCNames.get(autoCompleteIndex++)));
}
}
return false;
}
public void initGui(List<GuiButton> buttonList) {
fontRenderer = parentScreen.mc.fontRendererObj;
String s = I19n.format("eirairc:gui.options");
int bw = parentScreen.mc.fontRendererObj.getStringWidth(s) + 20;
btnOptions = new GuiButton(0, parentScreen.width - bw, 0, bw, 20, s);
buttonList.add(btnOptions);
showHelpTime = SHOW_HELP_TIME;
}
public void onGuiClosed() {
if(ClientGlobalConfig.autoResetChat.get()) {
if(SharedGlobalConfig.defaultChat.get().equals("Minecraft")) {
chatSession.setChatTarget(null);
} else {
IRCContext chatTarget = EiraIRCAPI.parseContext(null, SharedGlobalConfig.defaultChat.get(), IRCContext.ContextType.IRCChannel);
if(chatTarget.getContextType() != IRCContext.ContextType.Error) {
chatSession.setChatTarget(chatTarget);
} else {
chatSession.setChatTarget(null);
}
}
}
}
public void actionPerformed(GuiButton button) {
if(button == btnOptions) {
Minecraft.getMinecraft().displayGuiScreen(new GuiEiraIRCMenu());
}
}
public boolean confirmClicked(boolean result, int id) {
if(id == 1) {
if(result) {
Utils.openWebpage(clickedURL);
clickedURL = null;
}
parentScreen.mc.displayGuiScreen(parentScreen);
return false;
}
return true;
}
public void preRender() {
boolean terminalStyleInput = ClientGlobalConfig.terminalStyleInput.get();
String terminalChannel = chatSession.getChatTarget() != null ? (chatSession.getChatTarget().getName() + ": ") : null;
if(terminalStyleInput && terminalChannel != null) {
int terminalChannelWidth = parentScreen.mc.fontRendererObj.getStringWidth(terminalChannel);
inputField.xPosition = 4 + terminalChannelWidth;
inputField.width = parentScreen.width - 4 - terminalChannelWidth;
} else {
inputField.xPosition = 4;
inputField.width = parentScreen.width - 4;
}
}
public void postRender() {
boolean terminalStyleInput = ClientGlobalConfig.terminalStyleInput.get();
String terminalChannel = chatSession.getChatTarget() != null ? (chatSession.getChatTarget().getName() + ": ") : null;
if(terminalStyleInput && terminalChannel != null) {
parentScreen.mc.fontRendererObj.drawString(terminalChannel, 4, inputField.yPosition, 14737632);
}
if(!ClientGlobalConfig.disableChatToggle.get() && !ClientGlobalConfig.clientBridge.get()) {
IRCContext target = chatSession.getChatTarget();
String targetName;
if(target == null) {
targetName = "Minecraft";
} else {
targetName = target.getName() + " (" + target.getConnection().getHost() + ")";
}
String helpText = showHelpTime > 0 ? I19n.format("eirairc:gui.shiftToSwitch", Keyboard.getKeyName(ClientGlobalConfig.keyToggleTarget.getKeyCode())) : "";
String text = I19n.format("eirairc:gui.chatTarget", targetName);
int rectWidth = Math.max(200, Math.max(fontRenderer.getStringWidth(helpText), fontRenderer.getStringWidth(text)) + 10);
int rectHeight = showHelpTime > 0 ? fontRenderer.FONT_HEIGHT * 2 + 12 : fontRenderer.FONT_HEIGHT + 6;
GuiScreen.drawRect(0, 0, rectWidth, rectHeight, COLOR_BACKGROUND);
fontRenderer.drawString(text, 5, 5, Globals.TEXT_COLOR);
if(showHelpTime > 0) {
showHelpTime--;
fontRenderer.drawString(helpText, 5, 20, Globals.TEXT_COLOR);
}
}
}
public boolean keyTyped(char unicode, int keyCode) {
if(keyCode == 28 || keyCode == 156) {
String s = inputField.getText().trim();
if(s.length() > 0) {
if(!MinecraftForge.EVENT_BUS.post(new ClientChatEvent(s))) {
if(s.charAt(0) != '/' || ClientCommandHandler.instance.executeCommand(parentScreen.mc.thePlayer, s) != 1) {
parentScreen.mc.thePlayer.sendChatMessage(s);
}
}
parentScreen.mc.ingameGUI.getChatGUI().addToSentMessages(s);
}
parentScreen.mc.displayGuiScreen(null);
return false;
}
return true;
}
public boolean mouseClicked(int mouseX, int mouseY, int button) {
if(button == 0 && parentScreen.mc.gameSettings.chatLinks) {
IChatComponent clickedComponent = parentScreen.mc.ingameGUI.getChatGUI().getChatComponent(Mouse.getX(), Mouse.getY());
if(clickedComponent != null) {
ClickEvent clickEvent = clickedComponent.getChatStyle().getChatClickEvent();
if(clickEvent != null) {
if(clickEvent.getValue().startsWith("eirairc://")) {
String[] params = clickEvent.getValue().substring(10).split(";");
if(params.length > 0) {
if(params[0].equals("screenshot")) {
try {
if(ClientGlobalConfig.imageLinkPreview.get() && params[2].length() > 0) {
parentScreen.mc.displayGuiScreen(new GuiImagePreview(new URL(params[2]), new URL(params[1])));
} else {
if(parentScreen.mc.gameSettings.chatLinksPrompt) {
clickedURL = new URL(params[2]);
parentScreen.mc.displayGuiScreen(new GuiConfirmOpenLink(parentScreen, params[1], 0, false));
} else {
Utils.openWebpage(params[1]);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
return false;
} else {
// If this is an image link and imageLinkPreview is enabled, open the preview GUI. Otherwise, leave it to the super method.
if(ClientGlobalConfig.imageLinkPreview.get() && clickEvent.getValue().endsWith(".png") || clickEvent.getValue().endsWith(".jpg")) {
try {
parentScreen.mc.displayGuiScreen(new GuiImagePreview(new URL(clickEvent.getValue()), null));
return false;
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
}
}
return true;
}
}