package fr.Alphart.BAT.Modules;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger;
import net.cubespace.Yamler.Config.InvalidConfigurationException;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.plugin.Listener;
import fr.Alphart.BAT.BAT;
import fr.Alphart.BAT.Modules.Ban.Ban;
import fr.Alphart.BAT.Modules.Comment.Comment;
import fr.Alphart.BAT.Modules.Core.Core;
import fr.Alphart.BAT.Modules.Kick.Kick;
import fr.Alphart.BAT.Modules.Mute.Mute;
public class ModulesManager {
private final Logger log;
private String helpMessage;
private final StringBuilder sb;
private final Map<IModule, Integer> modules;
private final Map<String, IModule> modulesNames;
private Map<String, IModule> cmdsModules;
public ModulesManager() {
log = BAT.getInstance().getLogger();
sb = new StringBuilder();
modules = new LinkedHashMap<IModule, Integer>();
modulesNames = new HashMap<String, IModule>();
}
public void showHelp(final CommandSender sender) {
if (helpMessage == null) {
sb.append("&2---- &1Bungee&fAdmin&cTools&2 - HELP ----\n");
for (final Entry<IModule, Integer> entry : modules.entrySet()) {
if (entry.getValue() == IModule.ON_STATE) {
sb.append("- &B/");
sb.append(entry.getKey().getName());
sb.append(" help&2 : Show the help relative to the ");
sb.append(entry.getKey().getName());
sb.append(" module");
} else {
sb.append("- &MDisabled : /");
sb.append(entry.getKey().getName());
sb.append(" help&2 : Show the help relative to the ");
sb.append(entry.getKey().getName());
sb.append(" module");
}
sb.append("\n");
}
sb.append("&2-----------------------------------------");
helpMessage = ChatColor.translateAlternateColorCodes('&', sb.toString());
sb.setLength(0);
}
sender.sendMessage(new TextComponent(helpMessage));
}
public void loadModules() {
// The core module MUST NOT be disabled.
modules.put(new Core(), IModule.OFF_STATE);
modules.put(new Ban(), IModule.OFF_STATE);
modules.put(new Mute(), IModule.OFF_STATE);
modules.put(new Kick(), IModule.OFF_STATE);
modules.put(new Comment(), IModule.OFF_STATE);
cmdsModules = new HashMap<String, IModule>();
for (final IModule module : modules.keySet()) {
// The core doesn't have settings to enable or disable it
if (!module.getName().equals("core")) {
final Boolean isEnabled = module.getConfig().isEnabled();
if (isEnabled == null || !isEnabled) {
continue;
}
}
if (module.load()) {
modulesNames.put(module.getName(), module);
modules.put(module, IModule.ON_STATE);
if (module instanceof Listener) {
ProxyServer.getInstance().getPluginManager().registerListener(BAT.getInstance(), (Listener) module);
}
for (final BATCommand cmd : module.getCommands()) {
cmdsModules.put(cmd.getName(), module);
ProxyServer.getInstance().getPluginManager().registerCommand(BAT.getInstance(), cmd);
}
if(module.getConfig() != null){
try {
module.getConfig().save();
} catch (final InvalidConfigurationException e) {
e.printStackTrace();
}
}
} else {
log.severe("The " + module.getName() + " module encountered an error during his loading.");
}
}
}
public void unloadModules() {
for (final IModule module : getLoadedModules()) {
module.unload();
if(module instanceof Listener){
ProxyServer.getInstance().getPluginManager().unregisterListener((Listener) module);
}
modules.put(module, IModule.OFF_STATE);
}
ProxyServer.getInstance().getPluginManager().unregisterCommands(BAT.getInstance());
modules.clear();
}
public Set<IModule> getLoadedModules() {
final Set<IModule> modulesList = new HashSet<IModule>();
for (final Entry<IModule, Integer> entry : modules.entrySet()) {
if (entry.getValue() == IModule.ON_STATE) {
modulesList.add(entry.getKey());
}
}
return modulesList;
}
public boolean isLoaded(final String name) {
try {
if (getModule(name) != null) {
return true;
}
} catch (final InvalidModuleException e) {
}
return false;
}
public Core getCore() {
try {
final IModule module = getModule("core");
if (module != null) {
return (Core) module;
}
} catch (final InvalidModuleException e) {
BAT.getInstance().getLogger()
.severe("The core module encountered a problem. Please report this to the developper :");
e.printStackTrace();
}
return null;
}
public Ban getBanModule() throws InvalidModuleException {
final IModule module = getModule("ban");
if (module != null) {
return (Ban) module;
}
return null;
}
public Mute getMuteModule() throws InvalidModuleException {
final IModule module = getModule("mute");
if (module != null) {
return (Mute) module;
}
return null;
}
public Kick getKickModule() throws InvalidModuleException {
final IModule module = getModule("kick");
if (module != null) {
return (Kick) module;
}
return null;
}
public Comment getCommentModule() throws InvalidModuleException {
final IModule module = getModule("comment");
if (module != null) {
return (Comment) module;
}
return null;
}
public IModule getModule(final String name) throws InvalidModuleException {
final IModule module = modulesNames.get(name);
if (module != null && modules.get(module) == IModule.ON_STATE) {
return module;
}
throw new InvalidModuleException("Module not found or invalid");
}
}