Skip to content

Commit

Permalink
Updated Jupiter and refactored code as necessary. Will improve config…
Browse files Browse the repository at this point in the history
… file formats over time to use proper subsections.
  • Loading branch information
JAJames committed Dec 22, 2016
1 parent 164f00f commit 3f22f26
Show file tree
Hide file tree
Showing 52 changed files with 1,080 additions and 1,076 deletions.
36 changes: 16 additions & 20 deletions Bot/IRC_Bot.cpp
Expand Up @@ -19,15 +19,15 @@
#include <cstdio>
#include <cstring>
#include <cctype>
#include "Jupiter/INIFile.h"
#include "Jupiter/Config.h"
#include "Jupiter/Plugin.h"
#include "Jupiter/Functions.h"
#include "IRC_Bot.h"
#include "IRC_Command.h"

using namespace Jupiter::literals;

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::IRC_Bot(const Jupiter::Config *in_primary_section, const Jupiter::Config *in_secondary_section) : Client(in_primary_section, in_secondary_section)
{
IRC_Bot::commandPrefix = this->readConfigValue("Prefix"_jrs);

Expand Down Expand Up @@ -108,28 +108,24 @@ void IRC_Bot::setCommandAccessLevels(IRCCommand *in_command)
{
auto set_command_access_levels = [this, in_command](const Jupiter::ReadableString &section_name)
{
Jupiter::INIFile::Section *section = serverManager->getConfig().getSection(section_name);
Jupiter::Config *section = serverManager->getConfig().getSection(section_name);

if (section != nullptr)
{
size_t section_length = section->size();
Jupiter::INIFile::Section::KeyValuePair *pair;
size_t tmp_index;
Jupiter::ReferenceString tmp_key, tmp_sub_key;
IRCCommand *command;

for (size_t pair_index = 0; pair_index != section_length; ++pair_index)
auto read_section = [this, section, in_command](Jupiter::HashTable::Bucket::Entry &in_entry)
{
pair = section->getPair(pair_index);
size_t tmp_index;
Jupiter::ReferenceString tmp_key, tmp_sub_key;
IRCCommand *command;

tmp_index = pair->getKey().find('.');
tmp_index = in_entry.key.find('.');
if (tmp_index != Jupiter::INVALID_INDEX)
{
// non-default access assignment

tmp_key.set(pair->getKey().ptr(), tmp_index);
tmp_key.set(in_entry.key.ptr(), tmp_index);

tmp_sub_key = pair->getKey();
tmp_sub_key = in_entry.key;
tmp_sub_key.shiftRight(tmp_index + 1);

if (tmp_sub_key.findi("Type."_jrs) == 0)
Expand All @@ -138,7 +134,7 @@ void IRC_Bot::setCommandAccessLevels(IRCCommand *in_command)

command = this->getCommand(tmp_key);
if (command != nullptr && (in_command == nullptr || in_command == command))
command->setAccessLevel(tmp_sub_key.asInt(), pair->getValue().asInt());
command->setAccessLevel(tmp_sub_key.asInt(), in_entry.value.asInt());
}
else if (tmp_sub_key.findi("Channel."_jrs) == 0)
{
Expand All @@ -147,21 +143,21 @@ void IRC_Bot::setCommandAccessLevels(IRCCommand *in_command)
// Assign access level to command (if command exists)
command = this->getCommand(tmp_key);
if (command != nullptr && (in_command == nullptr || in_command == command))
command->setAccessLevel(tmp_sub_key, pair->getValue().asInt());
command->setAccessLevel(tmp_sub_key, in_entry.value.asInt());
}
}
else
{
// Assign access level to command (if command exists)
command = this->getCommand(pair->getKey());
command = this->getCommand(in_entry.key);
if (command != nullptr && (in_command == nullptr || in_command == command))
command->setAccessLevel(pair->getValue().asInt());
command->setAccessLevel(in_entry.value.asInt());
}
}
};
}
};

const Jupiter::INIFile::Section *section;
const Jupiter::Config *section;

section = this->getSecondaryConfigSection();
if (section != nullptr)
Expand Down
2 changes: 1 addition & 1 deletion Bot/IRC_Bot.h
Expand Up @@ -110,7 +110,7 @@ class JUPITER_BOT_API IRC_Bot : public Jupiter::IRC::Client
bool OnBadRehash(bool removed) { return removed; };

/** Constructor for IRC_Bot */
IRC_Bot(const Jupiter::INIFile::Section *in_primary_section, const Jupiter::INIFile::Section *in_secondary_section);
IRC_Bot(const Jupiter::Config *in_primary_section, const Jupiter::Config *in_secondary_section);

/** Destructor for IRC_Bot */
~IRC_Bot();
Expand Down
15 changes: 12 additions & 3 deletions Bot/Jupiter_Bot.h
Expand Up @@ -38,11 +38,20 @@

#if defined __cplusplus

#include <chrono>

/** Forward declaration */
namespace Jupiter { class INIFile; }
namespace Jupiter { class Config; }

namespace Jupiter
{

/** Application config file */
extern Jupiter::Config *g_config;

/** Application config file */
extern Jupiter::INIFile *g_config;
/** Application start time */
extern std::chrono::steady_clock::time_point g_start_time;
}

#endif // __cplusplus

Expand Down
40 changes: 27 additions & 13 deletions Bot/Main.cpp
Expand Up @@ -23,8 +23,7 @@
#include <thread>
#include <mutex>
#include "Jupiter/Functions.h"
#include "Jupiter/INIFile.h"
#include "Jupiter/Queue.h"
#include "Jupiter/INIConfig.h"
#include "Jupiter/Socket.h"
#include "Jupiter/Plugin.h"
#include "Jupiter/Timer.h"
Expand All @@ -38,8 +37,9 @@

using namespace Jupiter::literals;

Jupiter::INIFile o_config;
Jupiter::INIFile *g_config = &o_config;
Jupiter::INIConfig o_config;
Jupiter::Config *Jupiter::g_config = &o_config;
std::chrono::steady_clock::time_point Jupiter::g_start_time = std::chrono::steady_clock::now();

#define INPUT_BUFFER_SIZE 2048

Expand Down Expand Up @@ -127,20 +127,24 @@ int main(int argc, const char **args)
printf("Warning: Unknown command line argument \"%s\" specified. Ignoring...", args[i]);
}

std::chrono::steady_clock::time_point load_start = std::chrono::steady_clock::now();

puts("Loading config file...");
if (!o_config.readFile(configFileName))
if (!o_config.read(configFileName))
{
puts("Unable to read config file. Closing...");
exit(0);
}

puts("Config loaded.");
double time_taken = static_cast<double>(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - load_start).count()) / 1000.0;

printf("Config loaded (%fms)." ENDL, time_taken);

if (plugins_directory.isEmpty())
plugins_directory = o_config.get(Jupiter::ReferenceString::empty, "PluginsDirectory"_jrs);
plugins_directory = o_config.get("PluginsDirectory"_jrs);

if (configs_directory.isEmpty())
configs_directory = o_config.get(Jupiter::ReferenceString::empty, "ConfigsDirectory"_jrs);
configs_directory = o_config.get("ConfigsDirectory"_jrs);

if (plugins_directory.isNotEmpty())
{
Expand All @@ -155,7 +159,7 @@ int main(int argc, const char **args)
}

puts("Loading plugins...");
const Jupiter::ReadableString &pluginList = o_config.get(Jupiter::ReferenceString::empty, "Plugins"_jrs);
const Jupiter::ReadableString &pluginList = o_config.get("Plugins"_jrs);
if (pluginList.isEmpty())
puts("No plugins to load!");
else
Expand All @@ -164,19 +168,29 @@ int main(int argc, const char **args)
unsigned int nPlugins = pluginList.wordCount(WHITESPACE);
printf("Attempting to load %u plugins..." ENDL, nPlugins);

bool load_success;

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());
else printf("\"%.*s\" loaded successfully." ENDL, plugin.size(), plugin.ptr());

load_start = std::chrono::steady_clock::now();
load_success = Jupiter::Plugin::load(plugin) != nullptr;
time_taken = static_cast<double>(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - load_start).count()) / 1000.0;

if (load_success)
printf("\"%.*s\" loaded successfully (%fms)." ENDL, plugin.size(), plugin.ptr(), time_taken);
else
fprintf(stderr, "WARNING: Failed to load plugin \"%.*s\" (%fms)!" ENDL, plugin.size(), plugin.ptr(), time_taken);
}

// OnPostInitialize
for (index = 0; index != Jupiter::plugins->size(); ++index)
Jupiter::plugins->get(index)->OnPostInitialize();
}

printf("Initialization completed in %f milliseconds." ENDL, static_cast<double>(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - Jupiter::g_start_time).count()) / 1000.0 );

if (consoleCommands->size() > 0)
printf("%u Console Commands have been initialized%s" ENDL, consoleCommands->size(), getConsoleCommand("help"_jrs) == nullptr ? "." : "; type \"help\" for more information.");
if (IRCMasterCommandList->size() > 0)
Expand All @@ -190,7 +204,7 @@ int main(int argc, const char **args)
Jupiter::Plugin::free(index);
else
++index;
Jupiter_checkTimers();
Jupiter::Timer::check();

if (console_input.input_mutex.try_lock())
{
Expand Down
6 changes: 3 additions & 3 deletions Bot/ServerManager.h
Expand Up @@ -147,14 +147,14 @@ class JUPITER_BOT_API ServerManager : public Jupiter::Thinker
*
* @return Configuration file being used
*/
inline Jupiter::INIFile &getConfig() const { return *this->m_config; };
inline Jupiter::Config &getConfig() const { return *this->m_config; };

/**
* @brief Sets the configuration file to use
*
* @param Reference to the config file to use
*/
inline void setConfig(Jupiter::INIFile &in_config) { this->m_config = &in_config; };
inline void setConfig(Jupiter::Config &in_config) { this->m_config = &in_config; };

/**
* Destructor for the ServerManager class.
Expand All @@ -166,7 +166,7 @@ class JUPITER_BOT_API ServerManager : public Jupiter::Thinker
Jupiter::ArrayList<IRC_Bot> servers;

/** Config to read data from */
Jupiter::INIFile *m_config = g_config;
Jupiter::Config *m_config = Jupiter::g_config;
};

/** Pointer to an instance of the server manager. Note: DO NOT DELETE OR FREE THIS POINTER. */
Expand Down
3 changes: 1 addition & 2 deletions ChannelRelay/ChannelRelay.cpp
Expand Up @@ -17,7 +17,6 @@
*/

#include "Jupiter/IRC_Client.h"
#include "Jupiter/INIFile.h"
#include "Jupiter/String.h"
#include "ServerManager.h"
#include "IRC_Bot.h"
Expand All @@ -27,7 +26,7 @@ using namespace Jupiter::literals;

bool ChannelRelayPlugin::initialize()
{
Jupiter::ReferenceString str = this->config.get(Jupiter::ReferenceString::empty, "Types"_jrs);
Jupiter::ReferenceString str = this->config.get("Types"_jrs);
unsigned int words = str.wordCount(WHITESPACE);
if (words == 0)
return false;
Expand Down
1 change: 0 additions & 1 deletion Configs/IRC.Core.ini
Expand Up @@ -66,7 +66,6 @@ Nick=RenXBot
AltNick=RenXBot`
RealName=Jupiter IRC Framework by Agent
AutoPartMessage=Auto-Parting Enabled
AutoReconnect=1
MaxReconnectAttempts=3
AutoReconnectDelay=5
PrintOutput=1
Expand Down
1 change: 0 additions & 1 deletion CoreCommands/CoreCommands.cpp
Expand Up @@ -17,7 +17,6 @@
*/

#include <cstring>
#include "Jupiter/INIFile.h"
#include "Jupiter/Functions.h"
#include "Jupiter/ArrayList.h"
#include "CoreCommands.h"
Expand Down
3 changes: 1 addition & 2 deletions HTTPServer/HTTPServer.cpp
Expand Up @@ -16,14 +16,13 @@
* Written by Jessica James <jessica.aj@outlook.com>
*/

#include "Jupiter/INIFile.h"
#include "HTTPServer.h"

using namespace Jupiter::literals;

HTTPServerPlugin::HTTPServerPlugin()
{
HTTPServerPlugin::server.bind(this->config.get(Jupiter::ReferenceString::empty, "BindAddress"_jrs, "0.0.0.0"_jrs), this->config.getInt(Jupiter::ReferenceString::empty, "BindPort"_jrs, 80));
HTTPServerPlugin::server.bind(this->config.get("BindAddress"_jrs, "0.0.0.0"_jrs), this->config.get<uint16_t>("BindPort"_jrs, 80));
}

int HTTPServerPlugin::think()
Expand Down
2 changes: 1 addition & 1 deletion IRC.Core/IRC_Core.cpp
Expand Up @@ -30,7 +30,7 @@ IRCCorePlugin::~IRCCorePlugin()

bool IRCCorePlugin::initialize()
{
const Jupiter::ReadableString &serverList = this->config.get(Jupiter::ReferenceString::empty, "Servers"_jrs);
const Jupiter::ReadableString &serverList = this->config.get("Servers"_jrs);
if (serverList != nullptr)
{
serverManager->setConfig(this->config);
Expand Down
15 changes: 8 additions & 7 deletions RenX.Announcements/RenX_Announcements.cpp
Expand Up @@ -17,20 +17,21 @@
*/

#include "Jupiter/IRC_Client.h"
#include "Jupiter/INIFile.h"
#include "RenX_Announcements.h"
#include "RenX_Core.h"
#include "RenX_Server.h"
#include "RenX_Tags.h"

using namespace Jupiter::literals;

RenX_AnnouncementsPlugin pluginInstance;

void announce_(unsigned int x)
void announce_(unsigned int x, void*)
{
pluginInstance.announce(x);
pluginInstance.announce(x, nullptr);
}

void RenX_AnnouncementsPlugin::announce(unsigned int)
void RenX_AnnouncementsPlugin::announce(unsigned int, void *)
{
if (RenX_AnnouncementsPlugin::random == false)
{
Expand Down Expand Up @@ -73,15 +74,15 @@ int RenX_AnnouncementsPlugin::OnRehash()

bool RenX_AnnouncementsPlugin::initialize()
{
RenX_AnnouncementsPlugin::random = this->config.getBool(Jupiter::ReferenceString::empty, STRING_LITERAL_AS_REFERENCE("Random"));
RenX_AnnouncementsPlugin::random = this->config.get<bool>("Random"_jrs);

RenX_AnnouncementsPlugin::announcementsFile.load(this->config.get(Jupiter::ReferenceString::empty, STRING_LITERAL_AS_REFERENCE("File"), STRING_LITERAL_AS_REFERENCE("Announcements.txt")));
RenX_AnnouncementsPlugin::announcementsFile.load(this->config.get("File"_jrs, "Announcements.txt"_jrs));
if (RenX_AnnouncementsPlugin::announcementsFile.getLineCount() == 0)
{
fputs("[RenX.Announcements] ERROR: No announcements loaded." ENDL, stderr);
return false;
}
time_t delay = this->config.getInt(Jupiter::ReferenceString::empty, STRING_LITERAL_AS_REFERENCE("Delay"), 60);
std::chrono::milliseconds delay = std::chrono::seconds(this->config.get<long long>("Delay"_jrs, 60));
RenX_AnnouncementsPlugin::timer = new Jupiter::Timer(0, delay, announce_);
if (RenX_AnnouncementsPlugin::random == false)
RenX_AnnouncementsPlugin::lastLine = RenX_AnnouncementsPlugin::announcementsFile.getLineCount() - 1;
Expand Down
3 changes: 1 addition & 2 deletions RenX.Announcements/RenX_Announcements.h
Expand Up @@ -30,7 +30,7 @@
class RenX_AnnouncementsPlugin : public RenX::Plugin
{
public:
void announce(unsigned int);
void announce(unsigned int, void *);

public: // Jupiter::Plugin
virtual bool initialize() override;
Expand All @@ -41,7 +41,6 @@ class RenX_AnnouncementsPlugin : public RenX::Plugin
bool random;
unsigned int lastLine;
Jupiter::Timer *timer;
//Jupiter::StringS modsTag;
Jupiter::File announcementsFile;
};

Expand Down

0 comments on commit 3f22f26

Please sign in to comment.