package tv.mineinthebox.essentials;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import tv.mineinthebox.essentials.commands.CommandList;
import tv.mineinthebox.essentials.configurations.BanConfig;
import tv.mineinthebox.essentials.configurations.BlockConfig;
import tv.mineinthebox.essentials.configurations.BroadcastConfig;
import tv.mineinthebox.essentials.configurations.ChatConfig;
import tv.mineinthebox.essentials.configurations.CommandConfig;
import tv.mineinthebox.essentials.configurations.DebugConfig;
import tv.mineinthebox.essentials.configurations.EconomyConfig;
import tv.mineinthebox.essentials.configurations.EntityConfig;
import tv.mineinthebox.essentials.configurations.GreylistConfig;
import tv.mineinthebox.essentials.configurations.KitConfig;
import tv.mineinthebox.essentials.configurations.MiscConfig;
import tv.mineinthebox.essentials.configurations.MotdConfig;
import tv.mineinthebox.essentials.configurations.PlayerConfig;
import tv.mineinthebox.essentials.configurations.PortalConfig;
import tv.mineinthebox.essentials.configurations.ProtectionConfig;
import tv.mineinthebox.essentials.configurations.PvpConfig;
import tv.mineinthebox.essentials.configurations.RulesConfig;
import tv.mineinthebox.essentials.configurations.ShopConfig;
import tv.mineinthebox.essentials.configurations.SignConfig;
import tv.mineinthebox.essentials.configurations.VoteConfig;
import tv.mineinthebox.essentials.enums.ConfigType;
import tv.mineinthebox.essentials.enums.LogType;
import tv.mineinthebox.essentials.events.CustomEventHandler;
import tv.mineinthebox.essentials.events.Handler;
import tv.mineinthebox.essentials.greylist.GreyListServer;
import tv.mineinthebox.simpleserver.SimpleServer;
public class GlobalConfiguration {
private final EnumMap<ConfigType, Configuration> configurations = new EnumMap<ConfigType, Configuration>(ConfigType.class);
private final List<String> materials = new ArrayList<String>() { private static final long serialVersionUID = 1L; {
for(Material mat : Material.values()) {
add(mat.name());
}
}};
private final xEssentials pl;
private boolean isSilenceToggled = false;
public GlobalConfiguration(xEssentials pl) {
this.pl = pl;
createConfigs();
}
/**
* returns the protection configuration
*
* @author xize
* @return ProtectionConfig
*/
public ProtectionConfig getProtectionConfig() {
return (ProtectionConfig)configurations.get(ConfigType.PROTECTION);
}
/**
* returns the misc configuration
*
* @author xize
* @return MiscConfig
*/
public MiscConfig getMiscConfig() {
return (MiscConfig)configurations.get(ConfigType.MISC);
}
/**
* returns the ban configuration
*
* @author xize
* @return BanConfig
*/
public BanConfig getBanConfig() {
return (BanConfig)configurations.get(ConfigType.BAN);
}
/**
* returns the greylist configuration
*
* @author xize
* @return GreylistConfig
*/
public GreylistConfig getGreyListConfig() {
return (GreylistConfig)configurations.get(ConfigType.GREYLIST);
}
/**
* returns the economy configuration
*
* @author xize
* @return EconomyConfig
*/
public EconomyConfig getEconomyConfig() {
return (EconomyConfig)configurations.get(ConfigType.ECONOMY);
}
/**
* returns the block configuration
*
* @author xize
* @return BlockConfig
*/
public BlockConfig getBlockConfig() {
return (BlockConfig) configurations.get(ConfigType.BLOCKS);
}
/**
* returns the broadcast configuration
*
* @author xize
* @return BroadcastConfig
*/
public BroadcastConfig getBroadcastConfig() {
return (BroadcastConfig) configurations.get(ConfigType.BROADCAST);
}
/**
* returns the command configuration
*
* @author xize
* @return CommandConfig
*/
public CommandConfig getCommandConfig() {
return (CommandConfig) configurations.get(ConfigType.COMMAND);
}
/**
* returns the configuration for kits
*
* @author xize
* @return KitConfig
*/
public KitConfig getKitConfig() {
return (KitConfig) configurations.get(ConfigType.KITS);
}
/**
* returns the chat configuration
*
* @author xize
* @return ChatConfig
*/
public ChatConfig getChatConfig() {
return (ChatConfig) configurations.get(ConfigType.CHAT);
}
/**
* returns the shop configuration
*
* @author xize
* @return ShopConfig
*/
public ShopConfig getShopConfig() {
return (ShopConfig) configurations.get(ConfigType.SHOP);
}
/**
* returns the entity configuration
*
* @author xize
* @return EntityConfig
*/
public EntityConfig getEntityConfig() {
return (EntityConfig) configurations.get(ConfigType.ENTITY);
}
/**
* returns the motd configuration
*
* @author xize
* @return MotdConfig
*/
public MotdConfig getMotdConfig() {
return (MotdConfig) configurations.get(ConfigType.MOTD);
}
/**
* returns the player configuration
*
* @author xize
* @return PlayerConfig
*/
public PlayerConfig getPlayerConfig() {
return (PlayerConfig) configurations.get(ConfigType.PLAYER);
}
/**
* returns the pvp configuration
*
* @author xize
* @return PvpConfig
*/
public PvpConfig getPvpConfig() {
return (PvpConfig) configurations.get(ConfigType.PVP);
}
/**
* returns the portal configuration
*
* @author xize
* @return PortalConfig
*/
public PortalConfig getPortalConfig() {
return (PortalConfig) configurations.get(ConfigType.PORTAL);
}
/**
* returns the rules configuration
*
* @author xize
* @return RulesConfig
*/
public RulesConfig getRulesConfig() {
return (RulesConfig) configurations.get(ConfigType.RULES);
}
/**
* returns the sign configuration
*
* @author xize
* @return SignConfig
*/
public SignConfig getSignConfig() {
return (SignConfig) configurations.get(ConfigType.SIGN);
}
/**
* returns the vote configuration
*
* @author xize
* @return VoteConfig
*/
public VoteConfig getVoteConfig() {
return (VoteConfig) configurations.get(ConfigType.VOTE);
}
/**
* returns the debug configuration
*
* @author xize
* @return DebugConfig
*/
public DebugConfig getDebugConfig() {
return (DebugConfig) configurations.get(ConfigType.DEBUG);
}
public boolean reload() {
pl.getManagers().getMinigamesManager().disablePlugins();
Handler handler = new Handler(pl);
handler.stop();
if(pl.getManagers().getBroadcastManager().isRunning()) {
pl.getManagers().getBroadcastManager().stop();
}
if(pl.getManagers().getGreylistManager() != null) {
if(pl.getManagers().getGreylistManager().isRunning()) {
SimpleServer server = pl.getManagers().getGreylistManager();
xEssentials.log("stopping server " + server.getName() + " at port " + server.getPort(), LogType.INFO);
try {
server.stopServer();
xEssentials.log("server successfully stopped!", LogType.INFO);
} catch (IOException e) {
e.printStackTrace();
}
}
}
if(pl.getManagers().getRealisticWaterManager().isRunning()) {
pl.getManagers().getRealisticWaterManager().stop();
}
for(Configuration conf : configurations.values()) {
if(conf.hasAlternativeReload()) {
if(conf.getType() == ConfigType.KITS) {
KitConfig kconf = (KitConfig) conf;
kconf.reloadKits();
}
} else {
conf.reload();
}
}
HandleCommandManager();
if(getGreyListConfig().isEnabled()) {
SimpleServer server = pl.getManagers().getGreylistManager();
server.addListener(new GreyListServer(pl));
try {
server.startServer();
xEssentials.log(server.getName() + " has been started on port " + server.getPort(), LogType.INFO);
} catch (Exception e) {
xEssentials.log("failed to create server " + server.getName() + " on port " + server.getPort(), LogType.SEVERE);
e.printStackTrace();
}
}
if(getMiscConfig().isGatesEnabled()) {
pl.getManagers().getGateManager().reloadGates();
}
if(getMiscConfig().isBridgesEnabled()) {
pl.getManagers().getBridgeManager().reloadBridges();
}
if(getEntityConfig().isRealisticWaterEnabled()) {
pl.getManagers().getRealisticWaterManager().start();
}
pl.getManagers().getPlayerManager().reloadPlayerBase();
handler.start();
CustomEventHandler customhandler = new CustomEventHandler(pl);
customhandler.startCustomEvents();
pl.getManagers().getMinigamesManager().enablePlugins();
return true;
}
/**
* handles all the internal commands of xEssentials
*
* @author xize
*
*/
public void HandleCommandManager() {
CommandList cmdlist = new CommandList();
List<String> unregCommands = new ArrayList<String>(getCommandConfig().getUnregisteredCommands());
if(!getEconomyConfig().isEconomyEnabled()) {
unregCommands.add("money");
}
if(!getProtectionConfig().isProtectionEnabled()) {
unregCommands.add("cprivate");
unregCommands.add("cmodify");
unregCommands.add("cremove");
}
if(!getPortalConfig().isPortalEnabled()) {
unregCommands.add("portals");
}
for(String cmd : cmdlist.getAllCommands) {
if(!unregCommands.contains(cmd) && !getCommandConfig().isRegistered(cmd)) {
PluginCommand command = pl.getManagers().getCommandManager().createPluginCommand(cmd);
getCommandConfig().registerBukkitCommand(command);
} else if(unregCommands.contains(cmd) && getCommandConfig().isRegistered(cmd)) {
PluginCommand command = pl.getCommand(cmd);
getCommandConfig().unRegisterBukkitCommand(command);
}
}
}
/**
* toggles silence chat
*
* @author xize
*/
public void toggleSillenceChat() {
this.isSilenceToggled = !this.isSilenceToggled;
}
/**
* returns true if chat is silenced, otherwise false
*
* @author xize
* @return boolean
*/
public boolean isChatSillenced() {
return this.isSilenceToggled;
}
/**
* returns all the material names
*
* @author xize
* @return List<String>
*/
public List<String> getMaterials() {
return materials;
}
private void createConfigs() {
for(ConfigType type : ConfigType.values()) {
File f = new File(pl.getDataFolder() + File.separator + type.getFileName());
FileConfiguration con = YamlConfiguration.loadConfiguration(f);
Configuration conf = ConfigType.getNewConfiguration(pl, f, con, type);
if(!conf.isGenerated()) {
conf.generateConfig();
}
conf.validate();
configurations.put(type, conf);
}
}
}