package heufybot.core;
import heufybot.config.GlobalConfig;
import heufybot.config.GlobalConfig.PasswordType;
import heufybot.config.ServerConfig;
import heufybot.core.cap.SASLCapHandler;
import heufybot.core.events.LoggingInterface;
import heufybot.modules.Module;
import heufybot.modules.ModuleInterface;
import heufybot.modules.ModuleInterface.ModuleLoaderResponse;
import heufybot.utils.FileUtils;
import java.io.File;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.HashMap;
public class HeufyBot
{
public final static String VERSION = "0.6.0";
public final static int MODULE_API_VERSION = 60;
private static final HeufyBot instance = new HeufyBot();
private GlobalConfig config;
private HashMap<String, IRCServer> servers;
private HeufyBot()
{
FileUtils.touchDir("config");
FileUtils.touchDir("data");
FileUtils.touchDir("modules");
this.servers = new HashMap<String, IRCServer>();
}
public static HeufyBot getInstance()
{
return instance;
}
public void loadConfigs()
{
this.config = new GlobalConfig();
this.config.loadGlobalConfig("config/globalconfig.yml");
FileUtils.touchDir(this.config.getSettingWithDefault("logPath", "logs"));
File[] folder = new File("config").listFiles();
int foundServerConfigs = 0;
for (File file : folder)
{
if (!file.getName().equals("globalconfig.yml") && file.getName().endsWith(".yml"))
{
// We found a config file. Assume it's a server config
foundServerConfigs++;
ServerConfig serverConfig = new ServerConfig();
serverConfig.loadServerConfig(file.getPath(), this.config.getSettings());
this.addServer(serverConfig);
}
}
if (foundServerConfigs == 0)
{
ServerConfig serverConfig = new ServerConfig();
serverConfig.loadServerConfig(null, this.config.getSettings());
this.addServer(serverConfig);
}
}
public void addServer(ServerConfig config)
{
String serverName = config.getSettingWithDefault("server", "irc.foo.bar");
int serverID = 1;
while (this.servers.containsKey(serverName + "-" + serverID))
{
serverID++;
}
serverName = serverName + "-" + serverID;
IRCServer server = new IRCServer(serverName, config);
this.servers.put(serverName, server);
FileUtils.touchDir(config.getSettingWithDefault("logPath", "logs"));
FileUtils.touchDir("data/" + serverName);
ModuleInterface moduleInterface = new ModuleInterface(this, serverName);
server.getEventListenerManager().addListener(moduleInterface);
server.setModuleInterface(moduleInterface);
this.loadModules(server);
}
public void start()
{
LoggingInterface loggingInterface = new LoggingInterface(this);
for (IRCServer server : this.servers.values())
{
server.getEventListenerManager().addListener(loggingInterface);
ServerConfig sConfig = server.getConfig();
if (sConfig.getSettingWithDefault("passwordType", PasswordType.None) == PasswordType.SASL)
{
SASLCapHandler handler = new SASLCapHandler(sConfig.getSettingWithDefault(
"username", "RE_HeufyBot"), sConfig.getSettingWithDefault("password", ""));
server.getConfig().getCapHandlers().add(handler);
}
if (server.connect(sConfig.getSettingWithDefault("server", "irc.foo.bar"),
sConfig.getSettingWithDefault("port", 6667)))
{
server.login();
}
}
}
public void stop(String message)
{
for (IRCServer server : this.servers.values())
{
server.cmdQUIT(message);
server.disconnect(false);
this.unloadModules(server);
}
this.servers.clear();
Logger.log("*** Stopping...");
}
public void restart()
{
// Disconnect from the server
this.stop("Restarting...");
// Reload config and reconnect
this.loadConfigs();
this.start();
}
public void loadModules(IRCServer server)
{
Logger.log("*** Loading modules...");
for (String module : server.getConfig().getSettingWithDefault("modules",
new ArrayList<String>()))
{
SimpleEntry<ModuleLoaderResponse, String> result = server.getModuleInterface()
.loadModule(module);
switch (result.getKey())
{
case Success:
Logger.log(" - Module \"" + result.getValue() + "\" was loaded");
break;
case AlreadyLoaded:
Logger.error("Module Loader", "Module \"" + module + "\" is already loaded");
break;
case DoesNotExist:
Logger.error("Module Loader", "Module \"" + module + "\" does not exist");
break;
case APIVersionDoesNotMatch:
String moduleVersion = result.getValue().split(" ")[0];
String apiVersion = result.getValue().split(" ")[1];
Logger.error("Module Loader", "Module \"" + module
+ "\" could not be loaded. Its module API version (" + moduleVersion
+ ") does not match the bot's API version (" + apiVersion + ")");
break;
default:
break;
}
}
}
public void unloadModules(IRCServer server)
{
Logger.log("*** Unloading modules...");
Module[] loadedModules = new Module[server.getModuleInterface().getModuleList().size()];
loadedModules = server.getModuleInterface().getModuleList().toArray(loadedModules);
for (Module module : loadedModules)
{
SimpleEntry<ModuleLoaderResponse, String> result = server.getModuleInterface()
.unloadModule(module.toString());
switch (result.getKey())
{
case Success:
Logger.log(" - Module " + result.getValue() + " was unloaded");
break;
case DoesNotExist:
// If for whatever reason a loaded module doesn't exist
Logger.error("Module Loader", "Module " + module
+ " is already unloaded or does not exist");
break;
default:
break;
}
}
}
public IRCServer getServer(String name)
{
return this.servers.get(name);
}
public HashMap<String, IRCServer> getServers()
{
return this.servers;
}
public GlobalConfig getGlobalConfig()
{
return this.config;
}
}