diff --git a/Bot/IRC_Bot.cpp b/Bot/IRC_Bot.cpp index 65a9f3c..bbbda91 100644 --- a/Bot/IRC_Bot.cpp +++ b/Bot/IRC_Bot.cpp @@ -27,7 +27,7 @@ using namespace Jupiter::literals; -IRC_Bot::IRC_Bot(const Jupiter::ReadableString &configSection) : Client(configSection) +IRC_Bot::IRC_Bot(const Jupiter::INIFile::Section *in_primary_section, const Jupiter::INIFile::Section *in_secondary_section) : Client(in_primary_section, in_secondary_section) { IRC_Bot::commandPrefix = this->readConfigValue("Prefix"_jrs); for (size_t i = 0; i != IRCMasterCommandList->size(); i++) @@ -105,7 +105,7 @@ void IRC_Bot::setCommandAccessLevels() { auto set_command_access_levels = [this](const Jupiter::ReadableString §ion_name) { - Jupiter::INIFile::Section *section = this->Config->getSection(section_name); + Jupiter::INIFile::Section *section = g_config->getSection(section_name); if (section != nullptr) { @@ -162,13 +162,19 @@ void IRC_Bot::setCommandAccessLevels() } }; - set_command_access_levels("DefaultCommands"_jrs); - set_command_access_levels(this->getConfigSection() + "Commands"_jrs); + const Jupiter::INIFile::Section *section; + + section = this->getSecondaryConfigSection(); + if (section != nullptr) + set_command_access_levels(section->getName() + "Commands"_jrs); + + section = this->getPrimaryConfigSection(); + if (section != nullptr) + set_command_access_levels(section->getName() + "Commands"_jrs); } int IRC_Bot::OnRehash() { - if (Config->reload() == Jupiter::ERROR_INDICATOR) return 1; IRC_Bot::setCommandAccessLevels(); return 0; } diff --git a/Bot/IRC_Bot.h b/Bot/IRC_Bot.h index c36c5cf..2850103 100644 --- a/Bot/IRC_Bot.h +++ b/Bot/IRC_Bot.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -110,7 +110,7 @@ public: bool OnBadRehash(bool removed) { return removed; }; /** Constructor for IRC_Bot */ - IRC_Bot(const Jupiter::ReadableString &configSection); + IRC_Bot(const Jupiter::INIFile::Section *in_primary_section, const Jupiter::INIFile::Section *in_secondary_section); /** Destructor for IRC_Bot */ ~IRC_Bot(); diff --git a/Bot/Jupiter_Bot.h b/Bot/Jupiter_Bot.h index 3d9c417..b6c8f36 100644 --- a/Bot/Jupiter_Bot.h +++ b/Bot/Jupiter_Bot.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -36,4 +36,14 @@ #define JUPITER_BOT_API #endif // _WIN32 +#if defined __cplusplus + +/** Forward declaration */ +namespace Jupiter { class INIFile; } + +/** Application config file */ +extern Jupiter::INIFile *g_config; + +#endif // __cplusplus + #endif // JUPITER_BOT_API \ No newline at end of file diff --git a/Bot/Main.cpp b/Bot/Main.cpp index 49f25a6..1a0778d 100644 --- a/Bot/Main.cpp +++ b/Bot/Main.cpp @@ -35,6 +35,9 @@ using namespace Jupiter::literals; +Jupiter::INIFile o_config; +Jupiter::INIFile *g_config = &o_config; + #define INPUT_BUFFER_SIZE 2048 struct ConsoleInput @@ -89,11 +92,11 @@ int main(int argc, const char **args) atexit(onExit); std::set_terminate(onTerminate); std::thread inputThread(inputLoop); - Jupiter::ReferenceString command; + Jupiter::ReferenceString command, plugins_directory, configs_directory; srand(static_cast(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count())); puts(Jupiter::copyright); - const char *configFileName = CONFIG_INI; + const char *configFileName = "Config.ini"; for (int i = 1; i < argc; i++) { @@ -105,9 +108,9 @@ int main(int argc, const char **args) else if ("-config"_jrs.equalsi(args[i]) && ++i < argc) configFileName = args[i]; else if ("-pluginsdir"_jrs.equalsi(args[i]) && ++i < argc) - Jupiter::Plugin::setDirectory(Jupiter::ReferenceString(args[i])); + plugins_directory = args[i]; else if ("-configsdir"_jrs.equals(args[i]) && ++i < argc) - Jupiter::Plugin::setConfigDirectory(Jupiter::ReferenceString(args[i])); + configs_directory = args[i]; else if ("-configFormat"_jrs.equalsi(args[i]) && ++i < argc) puts("Feature not yet supported!"); else @@ -115,30 +118,34 @@ int main(int argc, const char **args) } puts("Loading config file..."); - if (!Jupiter::IRC::Client::Config->readFile(configFileName)) + if (!o_config.readFile(configFileName)) { puts("Unable to read config file. Closing..."); exit(0); } - fputs("Config loaded. ", stdout); + puts("Config loaded."); - const Jupiter::ReadableString &pDir = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("PluginsDirectory")); - if (pDir.isNotEmpty()) + if (plugins_directory.isEmpty()) + plugins_directory = o_config.get(Jupiter::ReferenceString::empty, "PluginsDirectory"_jrs); + + if (configs_directory.isEmpty()) + configs_directory = o_config.get(Jupiter::ReferenceString::empty, "ConfigsDirectory"_jrs); + + if (plugins_directory.isNotEmpty()) { - Jupiter::Plugin::setDirectory(pDir); - printf("Plugins will be loaded from \"%.*s\"." ENDL, pDir.size(), pDir.ptr()); + Jupiter::Plugin::setDirectory(plugins_directory); + printf("Plugins will be loaded from \"%.*s\"." ENDL, plugins_directory.size(), plugins_directory.ptr()); } - const Jupiter::ReadableString &cDir = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("PluginConfigsDirectory")); - if (cDir.isNotEmpty()) + if (configs_directory.isNotEmpty()) { - Jupiter::Plugin::setDirectory(cDir); - printf("Plugin configs will be loaded from \"%.*s\"." ENDL, cDir.size(), cDir.ptr()); + Jupiter::Plugin::setDirectory(configs_directory); + printf("Plugin configs will be loaded from \"%.*s\"." ENDL, configs_directory.size(), configs_directory.ptr()); } puts("Loading plugins..."); - const Jupiter::ReadableString &pluginList = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("Plugins")); + const Jupiter::ReadableString &pluginList = o_config.get(Jupiter::ReferenceString::empty, "Plugins"_jrs); if (pluginList.isEmpty()) puts("No plugins to load!"); else @@ -148,26 +155,27 @@ int main(int argc, const char **args) for (unsigned int i = 0; i < nPlugins; i++) { Jupiter::ReferenceString plugin = Jupiter::ReferenceString::getWord(pluginList, i, WHITESPACE); - if (Jupiter::Plugin::load(plugin) == nullptr) fprintf(stderr, "WARNING: Failed to load plugin \"%.*s\"!" ENDL, plugin.size(), plugin.ptr()); + if (Jupiter::Plugin::load(plugin) == nullptr) + fprintf(stderr, "WARNING: Failed to load plugin \"%.*s\"!" ENDL, plugin.size(), plugin.ptr()); else printf("\"%.*s\" loaded successfully." ENDL, plugin.size(), plugin.ptr()); } } if (consoleCommands->size() > 0) - printf("%u Console Commands have been initialized%s" ENDL, consoleCommands->size(), getConsoleCommand(STRING_LITERAL_AS_REFERENCE("help")) == nullptr ? "." : "; type \"help\" for more information."); + printf("%u Console Commands have been initialized%s" ENDL, consoleCommands->size(), getConsoleCommand("help"_jrs) == nullptr ? "." : "; type \"help\" for more information."); if (IRCMasterCommandList->size() > 0) printf("%u IRC Commands have been loaded into the master list." ENDL, IRCMasterCommandList->size()); puts("Retreiving network list..."); - const Jupiter::ReadableString &serverList = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("Servers")); + const Jupiter::ReadableString &serverList = o_config.get(Jupiter::ReferenceString::empty, "Servers"_jrs); if (serverList == nullptr) puts("Unable to find network list."); else { unsigned int nServers = serverList.wordCount(WHITESPACE); printf("Attempting to connect to %u servers..." ENDL, nServers); - for (unsigned int i = 0; i < nServers; i++) - serverManager->addServer(Jupiter::ReferenceString::getWord(serverList, i, WHITESPACE)); + for (unsigned int index = 0; index < nServers; ++index) + serverManager->addServer(Jupiter::ReferenceString::getWord(serverList, index, WHITESPACE)); } puts("Sockets established."); diff --git a/Bot/ServerManager.cpp b/Bot/ServerManager.cpp index 5e3a5f7..34105f1 100644 --- a/Bot/ServerManager.cpp +++ b/Bot/ServerManager.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014-2015 Jessica James. + * Copyright (C) 2014-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -21,6 +21,8 @@ #include "IRC_Bot.h" #include "IRC_Command.h" +using namespace Jupiter::literals; + ServerManager _serverManager; ServerManager *serverManager = &_serverManager; @@ -94,8 +96,8 @@ IRC_Bot *ServerManager::getServer(size_t serverIndex) bool ServerManager::addServer(const Jupiter::ReadableString &serverConfig) { - IRC_Bot *server = new IRC_Bot(serverConfig); - if (server->connect() == true) + IRC_Bot *server = new IRC_Bot(g_config->getSection(serverConfig), g_config->getSection("Default"_jrs)); + if (server->connect()) { ServerManager::servers.add(server); return true; diff --git a/Config.ini b/Config.ini index 72980ab..4bc1471 100644 --- a/Config.ini +++ b/Config.ini @@ -6,7 +6,7 @@ ; A Bool is either true or false. ; A Float is a decimal number. ; -; [Config] + ; This block is used to define settings that are global in nature. ; Currently, there is a "Servers" option to specify what sections ; to look at for server configuration options, and a "Plugins" @@ -14,17 +14,15 @@ ; folder. ; DO NOT INCLUDE A PLUGIN'S FILE EXTENSION (.dll or .so). ; -; Required Settings: -; Servers=String (Format: Server1 Server2) -; -; Optional Settings: +; Settings: ; Plugins=String (Format: Plugin1 Plugin2) +; Servers=String (Format: Server1 Server2) ; PluginsDirectory=String (Default: Plugins\) +; ConfigsDirectory=String (Default: Configs\) ; -[Config] +Plugins=CoreCommands PluginManager ExtraCommands RenX.Core RenX.Commands RenX.Logging RenX.Medals Servers=CnCIRC -Plugins=CoreCommands PluginManager ExtraCommands RenX.Core RenX.Commands RenX.Logging RenX.Medals RenX.SetJoin ; [Default] ; diff --git a/Jupiter b/Jupiter index 427ddec..f52413a 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 427ddecf8d89d64fbe90cbcd8eba3aaa7931939a +Subproject commit f52413a0f821f4bec3e1903ba1629023e3231a09 diff --git a/Release/Bot.lib b/Release/Bot.lib index b8e6a58..7fdf946 100644 Binary files a/Release/Bot.lib and b/Release/Bot.lib differ diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index a1024aa..cae83ca 100644 Binary files a/Release/Plugins/RenX.Core.lib and b/Release/Plugins/RenX.Core.lib differ diff --git a/RenX.Commands/RenX_Commands.cpp b/RenX.Commands/RenX_Commands.cpp index 77c6c4d..de8344d 100644 --- a/RenX.Commands/RenX_Commands.cpp +++ b/RenX.Commands/RenX_Commands.cpp @@ -16,7 +16,6 @@ * Written by Jessica James */ -#include #include "Jupiter/Functions.h" #include "Jupiter/SLList.h" #include "IRC_Bot.h"