From fe5417046d15bf1f6c5f86963221d4f8f5ec80d9 Mon Sep 17 00:00:00 2001 From: JAJames Date: Fri, 1 Jul 2016 21:12:58 -0400 Subject: [PATCH] GenericCommand as IRCCommand instantiation moved to new plugin named IRC.Core Removed old wrappers Updated plugins as necessary Updated Jupiter (bug fix) --- Bot/IRC_Bot.cpp | 4 - Bot/IRC_Command.cpp | 86 ++++++++++++++++- Bot/IRC_Command.h | 153 +++++++++++------------------- CoreCommands/CoreCommands.cpp | 2 - ExtraCommands/ExtraCommands.cpp | 12 +-- IRC.Core/IRC.Core.vcxproj | 84 ++++++++++++++++ IRC.Core/IRC.Core.vcxproj.filters | 35 +++++++ IRC.Core/IRC_Core.cpp | 52 ++++++++++ IRC.Core/IRC_Core.h | 47 +++++++++ Jupiter | 2 +- Jupiter Bot.sln | 11 ++- PluginManager/PluginManager.cpp | 3 +- Release/Bot.lib | Bin 19292 -> 23442 bytes Release/Plugins/RenX.Core.lib | Bin 206580 -> 206580 bytes RenX.Ladder/RenX_Ladder.cpp | 1 - 15 files changed, 370 insertions(+), 122 deletions(-) create mode 100644 IRC.Core/IRC.Core.vcxproj create mode 100644 IRC.Core/IRC.Core.vcxproj.filters create mode 100644 IRC.Core/IRC_Core.cpp create mode 100644 IRC.Core/IRC_Core.h diff --git a/Bot/IRC_Bot.cpp b/Bot/IRC_Bot.cpp index 05695be..b776b7a 100644 --- a/Bot/IRC_Bot.cpp +++ b/Bot/IRC_Bot.cpp @@ -145,8 +145,6 @@ void IRC_Bot::setCommandAccessLevels() command = this->getCommand(tmp_key); if (command != nullptr) command->setAccessLevel(tmp_sub_key, pair->getValue().asInt()); - else if (this->getPrintOutput() != nullptr) - fprintf(this->getPrintOutput(), "Unable to find command \"%.*s\"" ENDL, tmp_key.size(), tmp_key.ptr()); } } else @@ -155,8 +153,6 @@ void IRC_Bot::setCommandAccessLevels() command = this->getCommand(pair->getKey()); if (command != nullptr) command->setAccessLevel(pair->getValue().asInt()); - else if (this->getPrintOutput() != nullptr) - fprintf(this->getPrintOutput(), "Unable to find command \"%.*s\"" ENDL, pair->getKey().size(), pair->getKey().ptr()); } } } diff --git a/Bot/IRC_Command.cpp b/Bot/IRC_Command.cpp index 4a81d0c..bf76546 100644 --- a/Bot/IRC_Command.cpp +++ b/Bot/IRC_Command.cpp @@ -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 @@ -21,6 +21,8 @@ Jupiter::ArrayList _IRCMasterCommandList; Jupiter::ArrayList *IRCMasterCommandList = &_IRCMasterCommandList; +/** IRCCommand */ + IRCCommand::IRCCommand() { IRCCommand::access = 0; @@ -120,4 +122,84 @@ void IRCCommand::setAccessLevel(const Jupiter::ReadableString &channel, int acce pair->channel = channel; pair->access = accessLevel; IRCCommand::channels.add(pair); -} \ No newline at end of file +} + +void IRCCommand::create() +{ +} + +/** GenericCommandWrapperIRCCommand */ + +GenericCommandWrapperIRCCommand::GenericCommandWrapperIRCCommand(GenericCommandWrapperIRCCommand &in_command) : IRCCommand(in_command) +{ + GenericCommandWrapperIRCCommand::m_command = in_command.m_command; + + // Copy triggers + size_t index = 0; + while (index != GenericCommandWrapperIRCCommand::m_command->getTriggerCount()) + { + this->addTrigger(GenericCommandWrapperIRCCommand::m_command->getTrigger(index)); + ++index; + } +} + +GenericCommandWrapperIRCCommand::GenericCommandWrapperIRCCommand(Jupiter::GenericCommand &in_command) : IRCCommand() +{ + GenericCommandWrapperIRCCommand::m_command = &in_command; + + // Copy triggers + size_t index = 0; + while (index != GenericCommandWrapperIRCCommand::m_command->getTriggerCount()) + { + this->addTrigger(GenericCommandWrapperIRCCommand::m_command->getTrigger(index)); + ++index; + } + + if (serverManager != nullptr) + serverManager->addCommand(this); +} + +// GenericCommandWrapperIRCCommand functions + +void GenericCommandWrapperIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &in_channel, const Jupiter::ReadableString &in_nick, const Jupiter::ReadableString &in_parameters) +{ + Jupiter::GenericCommand::ResponseLine *del; + Jupiter::GenericCommand::ResponseLine *result = GenericCommandWrapperIRCCommand::m_command->trigger(in_parameters); + + while (result != nullptr) + { + switch (result->type) + { + case Jupiter::GenericCommand::DisplayType::PublicSuccess: + case Jupiter::GenericCommand::DisplayType::PublicError: + source->sendMessage(in_channel, result->response); + break; + case Jupiter::GenericCommand::DisplayType::PrivateSuccess: + case Jupiter::GenericCommand::DisplayType::PrivateError: + source->sendNotice(in_nick, result->response); + break; + default: + source->sendMessage(in_nick, result->response); + break; + } + + del = result; + result = result->next; + delete del; + } +} + +const Jupiter::ReadableString &GenericCommandWrapperIRCCommand::getHelp(const Jupiter::ReadableString ¶meters) +{ + return GenericCommandWrapperIRCCommand::m_command->getHelp(parameters); +} + +IRCCommand *GenericCommandWrapperIRCCommand::copy() +{ + return new GenericCommandWrapperIRCCommand(*this); +} + +const Jupiter::GenericCommand &GenericCommandWrapperIRCCommand::getGenericCommand() const +{ + return *GenericCommandWrapperIRCCommand::m_command; +} diff --git a/Bot/IRC_Command.h b/Bot/IRC_Command.h index 7c504d8..374ab72 100644 --- a/Bot/IRC_Command.h +++ b/Bot/IRC_Command.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 @@ -105,6 +105,11 @@ public: */ void setAccessLevel(const Jupiter::ReadableString &channel, int accessLevel); + /** + * @brief Called when the command is intially created. Define triggers and access levels here. + */ + virtual void create(); + /** * @brief Called when the command is to be executed. * @@ -115,11 +120,6 @@ public: */ virtual void trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) = 0; - /** - * @brief Called when the command is intially created. Define triggers and access levels here. - */ - virtual void create() = 0; - /** * @brief Creates a copy of a command. * Note: This is primarily for internal usage. @@ -169,6 +169,55 @@ private: Jupiter::ArrayList channels; /** Access levels for specific channels */ }; +class JUPITER_BOT_API GenericCommandWrapperIRCCommand : public IRCCommand +{ +public: + /** + * @brief Triggers the underlying GenericCommand and outputs the result + * + * @param in_server IRC server to deliver result to + * @param in_channel Name of the channel to deliver result to (if result is not 'Private' type) + * @param in_nick Name of the user to deliver result to (if result is 'Private' type) + * @param in_parameters Parameters to pass to the GenericCommand's trigger() + */ + void trigger(IRC_Bot *in_server, const Jupiter::ReadableString &in_channel, const Jupiter::ReadableString &in_nick, const Jupiter::ReadableString &in_parameters) override; + + /** + * @brief Forwards the help message from the underlying GenericCommand + * + * @param in_parameters Parameters to forward to the GenericCommand's getHelp() + * @return Help string from the GenericCommand + */ + const Jupiter::ReadableString &getHelp(const Jupiter::ReadableString &in_parameters) override; + + /** + * @brief Copies the GenericCommandWrapperIRCCommand + * + * @return Copy of the GenericCommandWrapperIRCCommand + */ + IRCCommand *copy() override; + + /** + * @brief Fetches the underlying GenericCommand + * + * @return GenericCommand this wrapper interfaces with + */ + const Jupiter::GenericCommand &getGenericCommand() const; + + /** + * @brief Copy constructor for the GenericCommandWrapperIRCCommand class + */ + GenericCommandWrapperIRCCommand(GenericCommandWrapperIRCCommand &in_command); + + /** + * @brief Wrapper constructor for the GenericCommandWrapperIRCCommand class + */ + GenericCommandWrapperIRCCommand(Jupiter::GenericCommand &in_command); + +private: + Jupiter::GenericCommand *m_command; +}; + /** IRC Command Macros */ /** Defines the core of an IRC command's declaration. This should be included in every IRC command. */ @@ -191,98 +240,6 @@ class CLASS : public IRCCommand { \ CLASS CLASS ## _instance; \ IRCCommand *CLASS::copy() { return new CLASS(*this); } -/** GenericCommand to IRCCommand conversion */ - -/** Generates an IRC command from a generic command. */ -template class Generic_Command_As_IRC_Command : public IRCCommand -{ -public: - virtual void trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) override; - virtual const Jupiter::ReadableString &getHelp(const Jupiter::ReadableString ¶meters) override; - - void copyTriggers(); - Generic_Command_As_IRC_Command(); - Generic_Command_As_IRC_Command(const Generic_Command_As_IRC_Command &cmd); -}; - -template Generic_Command_As_IRC_Command::Generic_Command_As_IRC_Command() : IRCCommand() -{ - Generic_Command_As_IRC_Command::copyTriggers(); -} - -template Generic_Command_As_IRC_Command::Generic_Command_As_IRC_Command(const Generic_Command_As_IRC_Command &cmd) : IRCCommand(cmd) -{ - Generic_Command_As_IRC_Command::copyTriggers(); -} - -template void Generic_Command_As_IRC_Command::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) -{ - Jupiter::GenericCommand::ResponseLine *del; - Jupiter::GenericCommand::ResponseLine *ret = T::instance.trigger(parameters); - while (ret != nullptr) - { - switch (ret->type) - { - case Jupiter::GenericCommand::DisplayType::PublicSuccess: - case Jupiter::GenericCommand::DisplayType::PublicError: - source->sendMessage(channel, ret->response); - break; - case Jupiter::GenericCommand::DisplayType::PrivateSuccess: - case Jupiter::GenericCommand::DisplayType::PrivateError: - source->sendNotice(nick, ret->response); - break; - default: - source->sendMessage(nick, ret->response); - break; - } - del = ret; - ret = ret->next; - delete del; - } -} - -template const Jupiter::ReadableString &Generic_Command_As_IRC_Command::getHelp(const Jupiter::ReadableString ¶meters) -{ - return T::instance.getHelp(parameters); -} - -template void Generic_Command_As_IRC_Command::copyTriggers() -{ - size_t index = 0; - while (index != T::instance.getTriggerCount()) - this->addTrigger(T::instance.getTrigger(index++)); -} - -/** Defines the core of an IRC command's declaration. This should be included in every Generic to IRC command conversion. */ -#define GENERIC_COMMAND_AS_IRC_COMMAND_2_BASE(CLASS, NEW_CLASS) \ - public: \ - void create(); \ - IRCCommand *copy() override; \ - NEW_CLASS() : Generic_Command_As_IRC_Command< CLASS >() { \ - this->create(); \ - if (serverManager != nullptr) serverManager->addCommand(this); } \ - NEW_CLASS(const NEW_CLASS &cmd) : Generic_Command_As_IRC_Command< CLASS >(cmd) { this->create(); } - -/** Generates an IRC command from a generic command. */ -#define GENERIC_COMMAND_AS_IRC_COMMAND_2(CLASS, NEW_CLASS) \ - class NEW_CLASS : public Generic_Command_As_IRC_Command< CLASS > { \ - GENERIC_COMMAND_AS_IRC_COMMAND_2_BASE(CLASS, NEW_CLASS) }; \ - IRC_COMMAND_INIT(NEW_CLASS) - -/** Generates an IRC command from a generic command. */ -#define GENERIC_COMMAND_AS_IRC_COMMAND(CLASS) \ - GENERIC_COMMAND_AS_IRC_COMMAND_2(CLASS, CLASS ## _AS_IRC_COMMAND); - -/** Generates an IRC command from a generic command, and defines a default create() function. */ -#define GENERIC_COMMAND_AS_IRC_COMMAND_NO_CREATE(CLASS) \ - GENERIC_COMMAND_AS_IRC_COMMAND(CLASS) \ - void CLASS ## _AS_IRC_COMMAND::create() {} - -/** Generates an IRC command from a generic command, and defines an access-setting create() function. */ -#define GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(CLASS, ACCESS_LEVEL) \ - GENERIC_COMMAND_AS_IRC_COMMAND(CLASS) \ - void CLASS ## _AS_IRC_COMMAND::create() { this->setAccessLevel(ACCESS_LEVEL); } - /** Re-enable warnings */ #if defined _MSC_VER #pragma warning(pop) diff --git a/CoreCommands/CoreCommands.cpp b/CoreCommands/CoreCommands.cpp index 2c4bdb3..19497e6 100644 --- a/CoreCommands/CoreCommands.cpp +++ b/CoreCommands/CoreCommands.cpp @@ -146,7 +146,6 @@ const Jupiter::ReadableString &VersionGenericCommand::getHelp(const Jupiter::Rea GENERIC_COMMAND_INIT(VersionGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(VersionGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_NO_CREATE(VersionGenericCommand) // Rehash Command @@ -173,7 +172,6 @@ const Jupiter::ReadableString &RehashGenericCommand::getHelp(const Jupiter::Read GENERIC_COMMAND_INIT(RehashGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(RehashGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(RehashGenericCommand, 4) // Plugin instantiation and entry point. CoreCommandsPlugin pluginInstance; diff --git a/ExtraCommands/ExtraCommands.cpp b/ExtraCommands/ExtraCommands.cpp index ea2b7f9..86d4baf 100644 --- a/ExtraCommands/ExtraCommands.cpp +++ b/ExtraCommands/ExtraCommands.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 @@ -59,7 +59,6 @@ const Jupiter::ReadableString &SelectGenericCommand::getHelp(const Jupiter::Read GENERIC_COMMAND_INIT(SelectGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(SelectGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(SelectGenericCommand, 4) // Deselect Command @@ -92,7 +91,6 @@ const Jupiter::ReadableString &DeselectGenericCommand::getHelp(const Jupiter::Re GENERIC_COMMAND_INIT(DeselectGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(DeselectGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(DeselectGenericCommand, 4) // Raw Command @@ -127,7 +125,6 @@ const Jupiter::ReadableString &RawGenericCommand::getHelp(const Jupiter::Readabl GENERIC_COMMAND_INIT(RawGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(RawGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(RawGenericCommand, 5) // Message Command @@ -163,7 +160,6 @@ const Jupiter::ReadableString &IRCMessageGenericCommand::getHelp(const Jupiter:: GENERIC_COMMAND_INIT(IRCMessageGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(IRCMessageGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(IRCMessageGenericCommand, 5) // Join Command @@ -201,7 +197,6 @@ const Jupiter::ReadableString &JoinGenericCommand::getHelp(const Jupiter::Readab GENERIC_COMMAND_INIT(JoinGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(JoinGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(JoinGenericCommand, 3) // Part Command @@ -239,7 +234,6 @@ const Jupiter::ReadableString &PartGenericCommand::getHelp(const Jupiter::Readab GENERIC_COMMAND_INIT(PartGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(PartGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(PartGenericCommand, 3) // DebugInfo Command @@ -291,7 +285,6 @@ const Jupiter::ReadableString &DebugInfoGenericCommand::getHelp(const Jupiter::R GENERIC_COMMAND_INIT(DebugInfoGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(DebugInfoGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(DebugInfoGenericCommand, 4) // Exit command @@ -313,7 +306,6 @@ const Jupiter::ReadableString &ExitGenericCommand::getHelp(const Jupiter::Readab GENERIC_COMMAND_INIT(ExitGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(ExitGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(ExitGenericCommand, 5) // IRC Connect command @@ -357,7 +349,6 @@ const Jupiter::ReadableString &IRCConnectGenericCommand::getHelp(const Jupiter:: GENERIC_COMMAND_INIT(IRCConnectGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(IRCConnectGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(IRCConnectGenericCommand, 5) // IRC Disconnect command @@ -388,7 +379,6 @@ const Jupiter::ReadableString &IRCDisconnectGenericCommand::getHelp(const Jupite GENERIC_COMMAND_INIT(IRCDisconnectGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(IRCDisconnectGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(IRCDisconnectGenericCommand, 5) // Plugin instantiation and entry point. FunCommandsPlugin pluginInstance; diff --git a/IRC.Core/IRC.Core.vcxproj b/IRC.Core/IRC.Core.vcxproj new file mode 100644 index 0000000..eca8021 --- /dev/null +++ b/IRC.Core/IRC.Core.vcxproj @@ -0,0 +1,84 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {89368D08-5E06-4530-B82A-AD2BC07B09E7} + IRC.Core + + + + Application + true + v140 + MultiByte + + + DynamicLibrary + false + v140 + true + Unicode + + + + + + + + + + + + + $(SolutionDir)$(Configuration)\Plugins\ + AllRules.ruleset + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + ../Bot;../Jupiter + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IRC.Core/IRC.Core.vcxproj.filters b/IRC.Core/IRC.Core.vcxproj.filters new file mode 100644 index 0000000..ee8f459 --- /dev/null +++ b/IRC.Core/IRC.Core.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/IRC.Core/IRC_Core.cpp b/IRC.Core/IRC_Core.cpp new file mode 100644 index 0000000..ed12728 --- /dev/null +++ b/IRC.Core/IRC_Core.cpp @@ -0,0 +1,52 @@ +/** + * Copyright (C) 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 + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Written by Jessica James + */ + +#include "Jupiter/GenericCommand.h" +#include "ServerManager.h" +#include "IRC_Command.h" +#include "IRC_Core.h" + +IRCCorePlugin::~IRCCorePlugin() +{ + IRCCorePlugin::m_wrapped_commands.emptyAndDelete(); +} + +void IRCCorePlugin::OnGenericCommandAdd(Jupiter::GenericCommand &in_command) +{ + IRCCorePlugin::m_wrapped_commands.add(new GenericCommandWrapperIRCCommand(in_command)); +} + +void IRCCorePlugin::OnGenericCommandRemove(Jupiter::GenericCommand &in_command) +{ + for (size_t index = 0; index != IRCCorePlugin::m_wrapped_commands.size(); ++index) + if (&IRCCorePlugin::m_wrapped_commands.get(index)->getGenericCommand() == &in_command) + { + delete IRCCorePlugin::m_wrapped_commands.remove(index); + return; + } +} + + + +// Plugin instantiation and entry point. +IRCCorePlugin pluginInstance; + +extern "C" __declspec(dllexport) Jupiter::Plugin *getPlugin() +{ + return &pluginInstance; +} diff --git a/IRC.Core/IRC_Core.h b/IRC.Core/IRC_Core.h new file mode 100644 index 0000000..7dede25 --- /dev/null +++ b/IRC.Core/IRC_Core.h @@ -0,0 +1,47 @@ +/** + * Copyright (C) 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 + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Written by Jessica James + */ + +#if !defined _IRC_CORE_H_HEADER +#define _IRC_CORE_H_HEADER + +#include "Jupiter/Plugin.h" +#include "Jupiter/Reference_String.h" + +class IRCCorePlugin : public Jupiter::Plugin +{ +public: + /** + * @brief This is called when a GenericCommand is instantiated. + */ + virtual void OnGenericCommandAdd(Jupiter::GenericCommand &command); + + /** + * @brief This is called when a GenericCommand is deleted. + */ + virtual void OnGenericCommandRemove(Jupiter::GenericCommand &command); + + /** + * @brief Destructor for the IRCCorPlugin class + */ + ~IRCCorePlugin(); + +private: + Jupiter::ArrayList m_wrapped_commands; +}; + +#endif // _IRC_CORE_H_HEADER \ No newline at end of file diff --git a/Jupiter b/Jupiter index 5a34f89..5966674 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 5a34f8989d4f9bdd3fb44efeb8b8bc90a5dd02b2 +Subproject commit 5966674d67b66f380b73ba3028d6176c0d3af2cb diff --git a/Jupiter Bot.sln b/Jupiter Bot.sln index f5389d5..7f363eb 100644 --- a/Jupiter Bot.sln +++ b/Jupiter Bot.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bot", "Bot\Bot.vcxproj", "{C188871B-5F32-4946-B301-24CA2EBB275D}" EndProject @@ -212,6 +212,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.ServerList", "RenX.Ser {BB048D6F-F001-4E9B-95F4-886081E0807A} = {BB048D6F-F001-4E9B-95F4-886081E0807A} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IRC.Core", "IRC.Core\IRC.Core.vcxproj", "{89368D08-5E06-4530-B82A-AD2BC07B09E7}" + ProjectSection(ProjectDependencies) = postProject + {C188871B-5F32-4946-B301-24CA2EBB275D} = {C188871B-5F32-4946-B301-24CA2EBB275D} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -362,6 +367,10 @@ Global {6B0D59BA-B153-4DE8-8DD4-FBE5D810B033}.Debug|Win32.Build.0 = Debug|Win32 {6B0D59BA-B153-4DE8-8DD4-FBE5D810B033}.Release|Win32.ActiveCfg = Release|Win32 {6B0D59BA-B153-4DE8-8DD4-FBE5D810B033}.Release|Win32.Build.0 = Release|Win32 + {89368D08-5E06-4530-B82A-AD2BC07B09E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {89368D08-5E06-4530-B82A-AD2BC07B09E7}.Debug|Win32.Build.0 = Debug|Win32 + {89368D08-5E06-4530-B82A-AD2BC07B09E7}.Release|Win32.ActiveCfg = Release|Win32 + {89368D08-5E06-4530-B82A-AD2BC07B09E7}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PluginManager/PluginManager.cpp b/PluginManager/PluginManager.cpp index 06eff2a..1fe052d 100644 --- a/PluginManager/PluginManager.cpp +++ b/PluginManager/PluginManager.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 @@ -83,7 +83,6 @@ const Jupiter::ReadableString &PluginGenericCommand::getHelp(const Jupiter::Read GENERIC_COMMAND_INIT(PluginGenericCommand) GENERIC_COMMAND_AS_CONSOLE_COMMAND(PluginGenericCommand) -GENERIC_COMMAND_AS_IRC_COMMAND_ACCESS_CREATE(PluginGenericCommand, 5) // Plugin instantiation and entry point. PluginManager pluginInstance; diff --git a/Release/Bot.lib b/Release/Bot.lib index 92554546783fe0f12ea056cdd2b4ceba71ef7476..1218a4e84a644b3c75b2a4f63c9c45305f82631a 100644 GIT binary patch literal 23442 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 delta 2954 zcma)8YiOHQ7=GGjt~Yyc(@WZ zM6{c}DEl#|!W=kZUZM;cX#F9G%-cVaIXfMqOxP3=nf~xO-^mxh6$A@UlkYswdpYlU zzxU+%GkND<%sbM&t~c7>7m~z?bE&T{;xYdgivipXbftlfdw}kvfbj`1oC3xo8sTL? zA-JGnP^-}My+))A=pO`PjljeOem?<34gr&^8dHA)CJyqGNL*S{|A6>8jRX@=NYY55 zk2xs>$t(0GGzO0Y3Q?Cv?`f_R19civCa(}WsS&15VSvdiOdrq~UvdEBM7&BPd5wXI z(PJ9J=UD+F#%G1T`!qr=bWBX{=JPii(|^z@G4g=Mrl$cDW&9+DPHChL0SaTZ3#)%K zdo>0<+!ZnYuExYoEF&?*HHDcU735k+NKQp+Gmqq#=ZmYWQGW6_$}f)hLl>z6mXEZlmO1f*=77Z zl%#VW?K%2L^a97(Hm)eJbea!!0}RNAlOZlL&@!J7OaqQ_po$Kz(fHUXaGuE=W5E09 zsD;|y4E7Db|3U2oBf!&}m>6+thyhdNnE2iqz{6ng($`H))I;t^uCeP-jKU=}pb^ao zz=Kw-M?JdGjUu$54G}cK1vmVNB8*N15kfC~s6`!W;6w*D;074nmKOsUL?xMH9Bw$A+p)l;?Kk84gJ_yVltC$F-t`iULzn zBTX@n&BtxSTH&F>LB;;&200na&DvO(nHxI~>*VtAT+Xt~jNHNX8)%g*ciXK-oKl|9 zep{(nZz`OUO0?$eox(ktKH8`#q~dCGlkAP>BGU)6H>0cUi)33olC@qj>g7bd%H*2J z70ZWl!{*r@yM&%^ZE2LrgjLVEiLO#rwE!(kxo6q$Z&3ZEVrncFHNAWw}mrRr2$g)eaRiP8m;WJB}Ds%k8O!oSoh<=N(^oZunwXhq%Ub zyGiLYR&=fGAFnlEx;MuQB|T)l2CSJ`ZB?^6Q?u-@l)$7_v=yedFR8Mo~?wZsZPDj+s6O%L96u+F*DRK&O(lEtus{?X&%5twv@14@^!U4-s=aAzKVVlCU zRVT=ih$g9=-fgSr;b|R|V-|ctrmcFaS_fw}$B~L=nVr4WX6N3bxmj{8a&h*~Ts@s~ zHp}sjfty^rypql}H?#dVt!;S)z+>{R&E1y0Q73n9t}zRG5BXMkV)K*N$2DIJ6}OE$ z4V9#1>o%(vs?>~bDpd4#Q_(8dwpj653zJo~@MhVHk~Vo});e+?r>RiK>9Z7bmi-Fz zOV8DqZvgLcUJyKx=Ylg#qEKGhYW0LF-<3I?2yZUlA`W@AYSf-89X+*8JDR7WQ#lG2 zq}Mo7@$53cl7&KRWvU6f=k;61YnnHlDf7#N^KG`uzB8{YdmAMI`C|TITV?OKS)a;g zavNpo<~>OlY3~N#E}a#B yf}l^5yQZ?f)g*f@%X!He^3ks0|A^ZU$Mf|*S>2V}E{$JU(2jjHj>y{!{(k@-(bO9N diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index d6b3d8bbaedbd34522463e5f1ae30612ead79465..c9d9e548b347ad9c42d4a6b9e6838d0641e6f3bd 100644 GIT binary patch delta 12977 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