// Copyright (c) 2015 Christopher "BlayTheNinth" Baker package net.blay09.mods.eirairc.config; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.blay09.mods.eirairc.api.irc.IRCChannel; import net.blay09.mods.eirairc.config.settings.BotSettings; import net.blay09.mods.eirairc.config.settings.GeneralSettings; import net.blay09.mods.eirairc.config.settings.ThemeSettings; import net.blay09.mods.eirairc.util.Globals; import net.blay09.mods.eirairc.util.Utils; import net.minecraft.command.ICommandSender; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; public class ServerConfig { private final Map<String, ChannelConfig> channels = new HashMap<>(); private final GeneralSettings generalSettings = new GeneralSettings(SharedGlobalConfig.generalSettings); private final BotSettings botSettings = new BotSettings(SharedGlobalConfig.botSettings); private final ThemeSettings theme = new ThemeSettings(SharedGlobalConfig.theme); private String address = ""; private String charset = Globals.DEFAULT_CHARSET; private String nick = Globals.DEFAULT_NICK; private boolean isRedirect; private boolean isSSL = false; private boolean isRemote = false; public ServerConfig() { } public ServerConfig(String address) { this.address = address; if(address.equals(Globals.TWITCH_SERVER)) { nick = ""; } } public void setAddress(String address) { this.address = address; } public String getAddress() { return address; } public void setNick(String nick) { if(address.equals(Globals.TWITCH_SERVER)) { this.nick = nick.toLowerCase(); } else { this.nick = nick; } } public String getNick() { return nick; } public ChannelConfig getOrCreateChannelConfig(String channelName) { ChannelConfig channelConfig = channels.get(channelName.toLowerCase()); if(channelConfig == null) { channelConfig = new ChannelConfig(this); channelConfig.setName(channelName); channels.put(channelConfig.getName().toLowerCase(), channelConfig); ConfigurationHandler.save(); } return channelConfig; } public ChannelConfig getOrCreateChannelConfig(IRCChannel channel) { return getOrCreateChannelConfig(channel.getName()); } public void addChannelConfig(ChannelConfig channelConfig) { channels.put(channelConfig.getName().toLowerCase(), channelConfig); } public ChannelConfig removeChannelConfig(String channelName) { return channels.remove(channelName.toLowerCase()); } public boolean hasChannelConfig(String channelName) { return channels.containsKey(channelName.toLowerCase()); } public ChannelConfig getChannelConfig(String channelName) { return channels.get(channelName.toLowerCase()); } public Collection<ChannelConfig> getChannelConfigs() { return channels.values(); } public static ServerConfig loadFromJson(JsonObject object) { ServerConfig config = new ServerConfig(object.get("address").getAsString()); if(object.has("nick")) { config.setNick(object.get("nick").getAsString()); } if(object.has("serverPassword")) { AuthManager.putServerPassword(config.getIdentifier(), object.get("serverPassword").getAsString()); } if(object.has("charset")) { config.charset = object.get("charset").getAsString(); } if(object.has("isRedirect")) { config.isRedirect = object.get("isRedirect").getAsBoolean(); } if(object.has("isSSL")) { config.isSSL = object.get("isSSL").getAsBoolean(); } if(object.has("nickserv")) { JsonObject nickServObject = object.getAsJsonObject("nickserv"); AuthManager.putNickServData(config.getIdentifier(), nickServObject.get("username").getAsString(), nickServObject.get("password").getAsString()); } if(object.has("bot")) { config.botSettings.load(object.getAsJsonObject("bot")); } if(object.has("theme")) { config.theme.load(object.getAsJsonObject("theme")); } if(object.has("settings")) { config.generalSettings.load(object.getAsJsonObject("settings")); } if(object.has("channels")) { JsonArray channelArray = object.getAsJsonArray("channels"); for(int i = 0; i < channelArray.size(); i++) { config.addChannelConfig(ChannelConfig.loadFromJson(config, channelArray.get(i).getAsJsonObject())); } } return config; } public JsonObject toJsonObject() { JsonObject object = new JsonObject(); object.addProperty("address", address); object.addProperty("nick", nick); if(!charset.equals(Globals.DEFAULT_CHARSET)) { object.addProperty("charset", charset); } if(isSSL) { object.addProperty("isSSL", true); } if(isRedirect) { object.addProperty("isRedirect", true); } JsonObject botSettingsObject = botSettings.toJsonObject(); if(botSettingsObject != null) { object.add("bot", botSettingsObject); } JsonObject themeObject = theme.toJsonObject(); if(themeObject != null) { object.add("theme", themeObject); } JsonObject generalSettingsObject = generalSettings.toJsonObject(); if(generalSettingsObject != null) { object.add("settings", generalSettingsObject); } JsonArray channelArray = new JsonArray(); for(ChannelConfig channelConfig : channels.values()) { channelArray.add(channelConfig.toJsonObject()); } object.add("channels", channelArray); return object; } public void handleConfigCommand(ICommandSender sender, String key) { String value; value = generalSettings.handleConfigCommand(sender, key); if(value == null) { value = botSettings.handleConfigCommand(sender, key); } if(value == null) { value = theme.handleConfigCommand(sender, key); } if(value != null) { Utils.sendLocalizedMessage(sender, "commands.config.lookup", address, key, value); } else { Utils.sendLocalizedMessage(sender, "commands.config.invalidOption", address, key); } } public void handleConfigCommand(ICommandSender sender, String key, String value) { if(!generalSettings.handleConfigCommand(sender, key, value) && !botSettings.handleConfigCommand(sender, key, value) && !theme.handleConfigCommand(sender, key, value)) { Utils.sendLocalizedMessage(sender, "commands.config.invalidOption", address, key, value); return; } Utils.sendLocalizedMessage(sender, "commands.config.change", address, key, value); ConfigurationHandler.save(); } public void addOptionsToList(List<String> list, String option, boolean autoCompleteOption) { generalSettings.addOptionsToList(list, option, autoCompleteOption); botSettings.addOptionsToList(list, option, autoCompleteOption); theme.addOptionsToList(list, option, autoCompleteOption); } public boolean isRemote() { return isRemote; } public void setIsRemote(boolean isRemote) { this.isRemote = isRemote; } public boolean isSSL() { return isSSL; } public String getCharset() { return charset; } public ThemeSettings getTheme() { return theme; } public GeneralSettings getGeneralSettings() { return generalSettings; } public BotSettings getBotSettings() { return botSettings; } public void setIsSSL(boolean isSSL) { this.isSSL = isSSL; } public void setCharset(String charset) { this.charset = charset; } public boolean isRedirect() { return isRedirect; } public String getIdentifier() { return Utils.extractHost(address); } }