package net.blay09.mods.eirairc.client.gui.servers;
import net.blay09.mods.eirairc.ConnectionManager;
import net.blay09.mods.eirairc.api.event.*;
import net.blay09.mods.eirairc.api.irc.IRCConnection;
import net.blay09.mods.eirairc.client.gui.EiraGui;
import net.blay09.mods.eirairc.client.gui.GuiEiraIRCConfig;
import net.blay09.mods.eirairc.client.gui.base.GuiAdvancedTextField;
import net.blay09.mods.eirairc.client.gui.base.GuiImageButton;
import net.blay09.mods.eirairc.client.gui.base.GuiLabel;
import net.blay09.mods.eirairc.client.gui.base.list.GuiList;
import net.blay09.mods.eirairc.client.gui.base.tab.GuiTabContainer;
import net.blay09.mods.eirairc.client.gui.base.tab.GuiTabPage;
import net.blay09.mods.eirairc.client.gui.overlay.OverlayYesNo;
import net.blay09.mods.eirairc.config.AuthManager;
import net.blay09.mods.eirairc.config.ChannelConfig;
import net.blay09.mods.eirairc.config.ConfigurationHandler;
import net.blay09.mods.eirairc.config.ServerConfig;
import net.blay09.mods.eirairc.util.ConfigHelper;
import net.blay09.mods.eirairc.util.Globals;
import net.blay09.mods.eirairc.util.I19n;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.config.GuiConfig;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard;
import java.io.IOException;
public class GuiServerConfig extends GuiTabPage implements GuiYesNoCallback {
private final ServerConfig config;
private GuiAdvancedTextField txtAddress;
private GuiAdvancedTextField txtNick;
private GuiList<GuiListEntryChannel> lstChannels;
private GuiImageButton btnChannelAdd;
private GuiImageButton btnChannelDelete;
private GuiImageButton btnChannelJoinLeave;
private GuiButton btnTheme;
private GuiButton btnBotSettings;
private GuiButton btnOtherSettings;
private GuiButton btnAdvanced;
private GuiButton btnDelete;
private GuiButton btnConnect;
private boolean isNew;
private ChannelConfig deleteChannel;
public GuiServerConfig(GuiTabContainer tabContainer) {
super(tabContainer, I19n.format("eirairc:gui.server.new"));
this.config = new ServerConfig();
isNew = true;
}
public GuiServerConfig(GuiTabContainer tabContainer, ServerConfig config) {
super(tabContainer, config.getAddress());
this.config = config;
}
@Override
public void initGui() {
super.initGui();
Keyboard.enableRepeatEvents(true);
allowSideClickClose = false;
title = config.getAddress().isEmpty() ? I19n.format("eirairc:gui.server.new") : config.getAddress();
final boolean isConnected = ConnectionManager.isConnectedTo(config.getIdentifier());
final int leftX = width / 2 - 130;
final int rightX = width / 2 + 130;
final int topY = height / 2 - 80;
String oldText;
labelList.add(new GuiLabel(I19n.format("eirairc:gui.server.address"), leftX, topY, Globals.TEXT_COLOR));
if(txtAddress != null) {
oldText = txtAddress.getText();
} else {
oldText = config.getAddress();
}
txtAddress = new GuiAdvancedTextField(0, fontRendererObj, leftX, topY + 15, 100, 15);
txtAddress.setEnabled(!isConnected);
txtAddress.setText(oldText);
textFieldList.add(txtAddress);
labelList.add(new GuiLabel(I19n.format("eirairc:gui.server.nick"), leftX, topY + 40, Globals.TEXT_COLOR));
if(txtNick != null) {
oldText = txtNick.getText();
} else {
oldText = config.getNick();
}
txtNick = new GuiAdvancedTextField(0, fontRendererObj, leftX, topY + 55, 100, 15);
txtNick.setDefaultText(Globals.DEFAULT_NICK, false);
txtNick.setText(oldText);
textFieldList.add(txtNick);
txtAddress.setNextTabField(txtNick);
txtNick.setNextTabField(txtAddress);
btnConnect = new GuiButton(8, rightX - 100, topY, 100, 20, "");
if(isConnected) {
btnConnect.displayString = I19n.format("eirairc:gui.server.disconnect");
} else {
btnConnect.displayString = I19n.format("eirairc:gui.server.connect");
}
buttonList.add(btnConnect);
labelList.add(new GuiLabel(I19n.format("eirairc:gui.server.channels"), rightX - 100, topY + 25, Globals.TEXT_COLOR));
int oldSelectedIdx = -1;
if(lstChannels != null) {
oldSelectedIdx = lstChannels.getSelectedIdx();
}
lstChannels = new GuiList<>(this, rightX - 100, topY + 35, 100, 60, 20);
for(ChannelConfig channelConfig : config.getChannelConfigs()) {
lstChannels.addEntry(new GuiListEntryChannel(this, fontRendererObj, channelConfig, lstChannels.getEntryHeight()));
}
if(oldSelectedIdx < lstChannels.getEntries().size()) {
lstChannels.setSelectedIdx(oldSelectedIdx);
}
listList.add(lstChannels);
btnChannelJoinLeave = new GuiImageButton(7, rightX - 95, topY + 100, EiraGui.atlas.findRegion("button_join"));
buttonList.add(btnChannelJoinLeave);
btnChannelAdd = new GuiImageButton(5, rightX - 75, topY + 100, EiraGui.atlas.findRegion("button_add"));
buttonList.add(btnChannelAdd);
btnChannelDelete = new GuiImageButton(6, rightX - 55, topY + 100, EiraGui.atlas.findRegion("button_remove"));
buttonList.add(btnChannelDelete);
btnDelete = new GuiButton(0, rightX - 100, topY + 150, 100, 20, I19n.format("eirairc:gui.delete"));
btnDelete.packedFGColour = -65536;
buttonList.add(btnDelete);
labelList.add(new GuiLabel(I19n.format("eirairc:gui.override"), leftX, topY + 85, Globals.TEXT_COLOR));
btnTheme = new GuiButton(1, leftX, topY + 95, 100, 20, I19n.format("eirairc:gui.override.theme"));
buttonList.add(btnTheme);
btnBotSettings = new GuiButton(2, leftX, topY + 120, 100, 20, I19n.format("eirairc:gui.override.bot"));
buttonList.add(btnBotSettings);
btnOtherSettings = new GuiButton(3, leftX, topY + 145, 100, 20, I19n.format("eirairc:gui.override.other"));
buttonList.add(btnOtherSettings);
btnAdvanced = new GuiButton(4, rightX - 100, topY + 125, 100, 20, I19n.format("eirairc:gui.server.advanced"));
buttonList.add(btnAdvanced);
MinecraftForge.EVENT_BUS.register(this);
}
@Override
public boolean requestClose() {
if(txtAddress.getText().isEmpty() && isNew) {
tabContainer.removePage(this);
tabContainer.initGui();
}
return true;
}
public boolean isNew() {
return isNew;
}
@Override
public void actionPerformed(GuiButton button) {
if(button == btnTheme) {
mc.displayGuiScreen(new GuiConfig(tabContainer, GuiEiraIRCConfig.getAllConfigElements(config.getTheme().pullDummyConfig()), Globals.MOD_ID, "server:" + config.getAddress(), false, false, I19n.format("eirairc:gui.config.theme", config.getAddress())));
} else if(button == btnBotSettings) {
mc.displayGuiScreen(new GuiConfig(tabContainer, GuiEiraIRCConfig.getAllConfigElements(config.getBotSettings().pullDummyConfig()), Globals.MOD_ID, "server:" + config.getAddress(), false, false, I19n.format("eirairc:gui.config.bot", config.getAddress())));
} else if(button == btnOtherSettings) {
mc.displayGuiScreen(new GuiConfig(tabContainer, GuiEiraIRCConfig.getAllConfigElements(config.getGeneralSettings().pullDummyConfig()), Globals.MOD_ID, "server:" + config.getAddress(), false, false, I19n.format("eirairc:gui.config.other", config.getAddress())));
} else if(button == btnAdvanced) {
tabContainer.setCurrentTab(new GuiServerConfigAdvanced(tabContainer, this), false);
} else if(button == btnChannelAdd) {
tabContainer.setCurrentTab(new GuiChannelConfig(tabContainer, this), false);
} else if(button == btnChannelDelete) {
if (lstChannels.hasSelection()) {
deleteChannel = lstChannels.getSelectedItem().getConfig();
setOverlay(new OverlayYesNo(this, I19n.format("eirairc:gui.channel.deleteConfirm"), I19n.format("eirairc:gui.channel.deleteNoUndo"), 1));
}
} else if(button == btnChannelJoinLeave) {
applyChanges();
if(lstChannels.hasSelection()) {
IRCConnection connection = ConnectionManager.getConnection(config.getIdentifier());
if(connection == null) {
connection = ConnectionManager.connectTo(config);
}
if(connection != null) {
btnChannelJoinLeave.enabled = false;
ChannelConfig channelConfig = lstChannels.getSelectedItem().getConfig();
if (connection.getChannel(channelConfig.getName()) != null) {
connection.part(channelConfig.getName());
} else {
connection.join(channelConfig.getName(), AuthManager.getChannelPassword(channelConfig.getIdentifier()));
}
}
}
} else if(button == btnDelete) {
if(isNew) {
tabContainer.removePage(this);
tabContainer.initGui();
} else {
setOverlay(new OverlayYesNo(this, I19n.format("eirairc:gui.server.deleteConfirm"), I19n.format("eirairc:gui.server.deleteNoUndo"), 0));
}
} else if(button == btnConnect) {
IRCConnection connection = ConnectionManager.getConnection(config.getIdentifier());
if(connection != null) {
btnConnect.enabled = false;
btnConnect.displayString = I19n.format("eirairc:gui.server.disconnecting");
connection.disconnect("");
} else {
btnConnect.enabled = false;
btnConnect.displayString = I19n.format("eirairc:gui.server.connecting");
ConnectionManager.connectTo(config);
}
}
}
@SubscribeEvent
public void onChannelJoined(IRCChannelJoinedEvent event) {
for(GuiListEntryChannel entry : lstChannels.getEntries()) {
if(entry.getConfig().getIdentifier().equals(event.channel.getIdentifier())) {
entry.setJoined(true);
}
}
updateButtonStates();
}
@SubscribeEvent
public void onChannelLeft(IRCChannelLeftEvent event) {
for(GuiListEntryChannel entry : lstChannels.getEntries()) {
if(entry.getConfig().getIdentifier().equals(event.channel.getIdentifier())) {
entry.setJoined(false);
}
}
updateButtonStates();
}
@SubscribeEvent
public void onDisconnect(IRCDisconnectEvent event) {
if(event.connection.getIdentifier().equals(config.getIdentifier())) {
txtAddress.setEnabled(true);
btnConnect.enabled = true;
btnConnect.displayString = I19n.format("eirairc:gui.server.connect");
for(GuiListEntryChannel entry : lstChannels.getEntries()) {
entry.setJoined(false);
}
updateButtonStates();
}
}
@SubscribeEvent
public void onConnect(IRCConnectEvent event) {
if(event.connection.getIdentifier().equals(config.getIdentifier())) {
txtAddress.setEnabled(false);
txtAddress.setText(config.getAddress());
btnConnect.enabled = true;
btnConnect.displayString = I19n.format("eirairc:gui.server.disconnect");
}
}
@SubscribeEvent
public void onConnectionFailed(IRCConnectionFailedEvent event) {
if(event.connection.getIdentifier().equals(config.getIdentifier())) {
txtAddress.setEnabled(true);
btnConnect.enabled = true;
btnConnect.displayString = I19n.format("eirairc:gui.server.connect");
}
}
@Override
public void keyTyped(char unicode, int keyCode) throws IOException {
super.keyTyped(unicode, keyCode);
if(txtAddress.isFocused()) {
boolean enabled = txtAddress.getText().length() > 0;
btnBotSettings.enabled = enabled;
btnAdvanced.enabled = enabled;
btnDelete.enabled = enabled;
btnOtherSettings.enabled = enabled;
btnTheme.enabled = enabled;
btnChannelAdd.enabled = enabled;
btnChannelDelete.enabled = enabled;
btnChannelJoinLeave.enabled = enabled;
}
}
private void updateButtonStates() {
if(lstChannels.hasSelection()) {
IRCConnection connection = ConnectionManager.getConnection(config.getIdentifier());
ChannelConfig channelConfig = lstChannels.getSelectedItem().getConfig();
if(connection != null && channelConfig != null && connection.getChannel(channelConfig.getName()) != null) {
btnChannelJoinLeave.setTextureRegion(EiraGui.atlas.findRegion("button_part"));
} else {
btnChannelJoinLeave.setTextureRegion(EiraGui.atlas.findRegion("button_join"));
}
btnChannelDelete.enabled = true;
btnChannelJoinLeave.enabled = true;
} else {
btnChannelDelete.enabled = false;
btnChannelJoinLeave.enabled = false;
btnChannelJoinLeave.setTextureRegion(EiraGui.atlas.findRegion("button_join"));
}
}
public void channelSelected(ChannelConfig channelConfig) {
updateButtonStates();
}
public void channelClicked(ChannelConfig channelConfig) {
tabContainer.setCurrentTab(new GuiChannelConfig(tabContainer, this, channelConfig), false);
}
@Override
public void confirmClicked(boolean result, int id) {
if(result) {
if(id == 0) {
ServerConfig serverConfig = ConfigurationHandler.removeServerConfig(config.getAddress());
if(serverConfig != null) {
IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier());
if(connection != null) {
connection.disconnect("");
}
}
ConfigurationHandler.saveServers();
tabContainer.removePage(this);
} else if(id == 1) {
ChannelConfig channelConfig = config.removeChannelConfig(deleteChannel.getName());
if(channelConfig != null) {
IRCConnection connection = ConnectionManager.getConnection(channelConfig.getServerConfig().getIdentifier());
if(connection != null) {
connection.part(channelConfig.getName());
}
}
ConfigurationHandler.saveServers();
}
}
Minecraft.getMinecraft().displayGuiScreen(tabContainer);
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
Keyboard.enableRepeatEvents(false);
applyChanges();
MinecraftForge.EVENT_BUS.unregister(this);
}
public ServerConfig getServerConfig() {
return config;
}
public void applyChanges() {
if(!txtAddress.getText().isEmpty() && !txtAddress.getText().equals(config.getAddress())) {
ConfigurationHandler.removeServerConfig(config.getAddress());
config.setAddress(txtAddress.getText());
ConfigurationHandler.addServerConfig(config);
isNew = false;
}
config.setNick(txtNick.getTextOrDefault());
// If connected, send nick change to IRC
IRCConnection connection = ConnectionManager.getConnection(config.getIdentifier());
if(connection != null && !connection.getNick().equals(config.getNick())) {
connection.nick(ConfigHelper.formatNick(config.getNick()));
}
ConfigurationHandler.saveServers();
title = config.getAddress();
tabContainer.initGui();
}
}