/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.gmail.filoghost.holographicdisplays.disk; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.TimeZone; import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; import com.gmail.filoghost.holographicdisplays.util.ConsoleLogger; import com.gmail.filoghost.holographicdisplays.util.Utils; /** * Just a bunch of static varibles to hold the settings. * Useful for fast access. */ public class Configuration { public static double spaceBetweenLines; public static boolean preciseHologramMovement; public static String imageSymbol; public static String transparencySymbol; public static boolean updateNotification; public static ChatColor transparencyColor; public static SimpleDateFormat timeFormat; public static int bungeeRefreshSeconds; public static boolean useRedisBungee; public static boolean pingerEnable; public static int pingerTimeout; public static String pingerOfflineMotd; public static String pingerStatusOnline; public static String pingerStatusOffline; public static boolean pingerTrimMotd; public static Map pingerServers; public static void load(Plugin plugin) { File configFile = new File(plugin.getDataFolder(), "config.yml"); if (!configFile.exists()) { plugin.getDataFolder().mkdirs(); plugin.saveResource("config.yml", true); } YamlConfiguration config = new YamlConfiguration(); try { config.load(configFile); } catch (InvalidConfigurationException e) { e.printStackTrace(); ConsoleLogger.log(Level.WARNING, "The configuration is not a valid YAML file! Please check it with a tool like http://yaml-online-parser.appspot.com/"); return; } catch (IOException e) { e.printStackTrace(); ConsoleLogger.log(Level.WARNING, "I/O error while reading the configuration. Was the file in use?"); return; } catch (Exception e) { e.printStackTrace(); ConsoleLogger.log(Level.WARNING, "Unhandled exception while reading the configuration!"); return; } boolean needsSave = false; for (ConfigNode node : ConfigNode.values()) { if (!config.isSet(node.getPath())) { needsSave = true; config.set(node.getPath(), node.getDefaultValue()); } } // Check the old values. List nodesToRemove = Arrays.asList( "vertical-spacing", "time-format", "bungee-refresh-seconds", "using-RedisBungee", "bungee-online-format", "bungee-offline-format" ); for (String oldNode : nodesToRemove) { if (config.isSet(oldNode)) { config.set(oldNode, null); needsSave = true; } } if (needsSave) { config.options().header(Utils.join(new String[] { ".", ". Read the tutorial at: http://dev.bukkit.org/bukkit-plugins/holographic-displays/", ".", ". Plugin created by filoghost.", "."}, "\n")); config.options().copyHeader(true); try { config.save(configFile); } catch (IOException e) { e.printStackTrace(); ConsoleLogger.log(Level.WARNING, "I/O error while saving the configuration. Was the file in use?"); } } spaceBetweenLines = config.getDouble(ConfigNode.SPACE_BETWEEN_LINES.getPath()); preciseHologramMovement = config.getBoolean(ConfigNode.PRECISE_HOLOGRAM_MOVEMENT.getPath()); updateNotification = config.getBoolean(ConfigNode.UPDATE_NOTIFICATION.getPath()); imageSymbol = StringConverter.toReadableFormat(config.getString(ConfigNode.IMAGES_SYMBOL.getPath())); transparencySymbol = StringConverter.toReadableFormat(config.getString(ConfigNode.TRANSPARENCY_SPACE.getPath())); bungeeRefreshSeconds = config.getInt(ConfigNode.BUNGEE_REFRESH_SECONDS.getPath()); useRedisBungee = config.getBoolean(ConfigNode.BUNGEE_USE_REDIS_BUNGEE.getPath()); pingerEnable = config.getBoolean(ConfigNode.BUNGEE_USE_FULL_PINGER.getPath()); pingerTimeout = config.getInt(ConfigNode.BUNGEE_PINGER_TIMEOUT.getPath()); pingerTrimMotd = config.getBoolean(ConfigNode.BUNGEE_PINGER_TRIM_MOTD.getPath()); pingerOfflineMotd = StringConverter.toReadableFormat(config.getString(ConfigNode.BUNGEE_PINGER_OFFLINE_MOTD.getPath())); pingerStatusOnline = StringConverter.toReadableFormat(config.getString(ConfigNode.BUNGEE_PINGER_ONLINE_FORMAT.getPath())); pingerStatusOffline = StringConverter.toReadableFormat(config.getString(ConfigNode.BUNGEE_PINGER_OFFLINE_FORMAT.getPath())); if (pingerTimeout <= 0) { pingerTimeout = 100; } else if (pingerTimeout >= 10000) { pingerTimeout = 10000; } pingerServers = Utils.newMap(); if (pingerEnable) { for (String singleServer : config.getStringList(ConfigNode.BUNGEE_PINGER_SERVERS.getPath())) { String[] nameAndAddress = singleServer.split(":", 2); if (nameAndAddress.length < 2) { ConsoleLogger.log(Level.WARNING, "The server info \"" + singleServer + "\" is not valid. There should be a name and an address, separated by a colon."); continue; } String name = nameAndAddress[0].trim(); String address = nameAndAddress[1].replace(" ", ""); String ip; int port; if (address.contains(":")) { String[] ipAndPort = address.split(":", 2); ip = ipAndPort[0]; try { port = Integer.parseInt(ipAndPort[1]); } catch (NumberFormatException e) { ConsoleLogger.log(Level.WARNING, "Invalid port number in the server info \"" + singleServer + "\"."); continue; } } else { ip = address; port = 25565; // The default Minecraft port. } pingerServers.put(name, new ServerAddress(ip, port)); } } ConsoleLogger.setDebugEnabled(config.getBoolean(ConfigNode.DEBUG.getPath())); String tempColor = config.getString(ConfigNode.TRANSPARENCY_COLOR.getPath()).replace('&', ChatColor.COLOR_CHAR); boolean foundColor = false; for (ChatColor chatColor : ChatColor.values()) { if (chatColor.toString().equals(tempColor)) { Configuration.transparencyColor = chatColor; foundColor = true; } } if (!foundColor) { Configuration.transparencyColor = ChatColor.GRAY; ConsoleLogger.log(Level.WARNING, "You didn't set a valid chat color for transparency in the configuration, light gray (&7) will be used."); } try { timeFormat = new SimpleDateFormat(config.getString(ConfigNode.TIME_FORMAT.getPath())); timeFormat.setTimeZone(TimeZone.getTimeZone(config.getString(ConfigNode.TIME_ZONE.getPath()))); } catch (IllegalArgumentException ex) { timeFormat = new SimpleDateFormat("H:mm"); ConsoleLogger.log(Level.WARNING, "Time format not valid in the configuration, using the default."); } if (bungeeRefreshSeconds < 1) { ConsoleLogger.log(Level.WARNING, "The minimum interval for pinging BungeeCord's servers is 1 second. It has been automatically set."); bungeeRefreshSeconds = 1; } if (bungeeRefreshSeconds > 60) { ConsoleLogger.log(Level.WARNING, "The maximum interval for pinging BungeeCord's servers is 60 seconds. It has been automatically set."); bungeeRefreshSeconds = 60; } } }