diff --git a/Jupiter Bot.sln b/Jupiter Bot.sln index f1ee49e..e0f95cc 100644 --- a/Jupiter Bot.sln +++ b/Jupiter Bot.sln @@ -115,6 +115,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.Greetings", "RenX.Gree {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} = {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.IRCJoin", "RenX.IRCJoin\RenX.IRCJoin.vcxproj", "{672B3FC9-0B31-45B4-AAB6-669073F2D291}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -201,6 +203,10 @@ Global {8709993F-B08A-4156-BD93-581F297FE0A4}.Debug|Win32.Build.0 = Debug|Win32 {8709993F-B08A-4156-BD93-581F297FE0A4}.Release|Win32.ActiveCfg = Release|Win32 {8709993F-B08A-4156-BD93-581F297FE0A4}.Release|Win32.Build.0 = Release|Win32 + {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Debug|Win32.ActiveCfg = Debug|Win32 + {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Debug|Win32.Build.0 = Debug|Win32 + {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Release|Win32.ActiveCfg = Release|Win32 + {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RenX.IRCJoin/RenX.IRCJoin.vcxproj b/RenX.IRCJoin/RenX.IRCJoin.vcxproj new file mode 100644 index 0000000..7fba758 --- /dev/null +++ b/RenX.IRCJoin/RenX.IRCJoin.vcxproj @@ -0,0 +1,85 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {672B3FC9-0B31-45B4-AAB6-669073F2D291} + PluginExample + + + + Application + true + v120 + MultiByte + + + DynamicLibrary + false + v120 + true + Unicode + + + + + + + + + + + + + $(SolutionDir)$(Configuration)\Plugins\ + AllRules.ruleset + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + ../Bot;../Jupiter;../RenX.Core + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters b/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters new file mode 100644 index 0000000..b8f58d0 --- /dev/null +++ b/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters @@ -0,0 +1,38 @@ + + + + + {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 + + + + + Resource Files + + + Resource Files + + + Resource Files + + + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/RenX.IRCJoin/RenX_IRCJoin.cpp b/RenX.IRCJoin/RenX_IRCJoin.cpp new file mode 100644 index 0000000..237d05a --- /dev/null +++ b/RenX.IRCJoin/RenX_IRCJoin.cpp @@ -0,0 +1,122 @@ +/** + * Copyright (C) 2014 Justin James. + * + * This license must be preserved. + * Any applications, libraries, or code which make any use of any + * component of this program must not be commercial, unless explicit + * permission is granted from the original author. The use of this + * program for non-profit purposes is permitted. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * In the event that this license restricts you from making desired use of this program, contact the original author. + * Written by Justin James + */ + +#include "Jupiter/IRC_Client.h" +#include "Jupiter/INIFile.h" +#include "Jupiter/String.h" +#include "RenX_Core.h" +#include "RenX_Server.h" +#include "RenX_IRCJoin.h" + +void RenX_IRCJoinPlugin::init() +{ + RenX_IRCJoinPlugin::publicOnly = Jupiter::IRC::Client::Config->getBool(this->getName(), STRING_LITERAL_AS_REFERENCE("PublicOnly"), true); + RenX_IRCJoinPlugin::joinMsgAlways = Jupiter::IRC::Client::Config->getBool(this->getName(), STRING_LITERAL_AS_REFERENCE("Join.MsgAlways"), false); + RenX_IRCJoinPlugin::partMsgAlways = Jupiter::IRC::Client::Config->getBool(this->getName(), STRING_LITERAL_AS_REFERENCE("Part.MsgAlways"), false); + RenX_IRCJoinPlugin::minAccessJoinMessage = Jupiter::IRC::Client::Config->getInt(this->getName(), STRING_LITERAL_AS_REFERENCE("Join.MinAccess"), 0); + RenX_IRCJoinPlugin::maxAccessJoinMessage = Jupiter::IRC::Client::Config->getInt(this->getName(), STRING_LITERAL_AS_REFERENCE("Join.MaxAccess"), -1); + RenX_IRCJoinPlugin::minAccessPartMessage = Jupiter::IRC::Client::Config->getInt(this->getName(), STRING_LITERAL_AS_REFERENCE("Part.MinAccess"), 0); + RenX_IRCJoinPlugin::maxAccessPartMessage = Jupiter::IRC::Client::Config->getInt(this->getName(), STRING_LITERAL_AS_REFERENCE("Part.MaxAccess"), -1); + RenX_IRCJoinPlugin::nameTag = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("NameTag"), STRING_LITERAL_AS_REFERENCE("{NAME}")); + RenX_IRCJoinPlugin::chanTag = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("ChannelTag"), STRING_LITERAL_AS_REFERENCE("{CHAN}")); + RenX_IRCJoinPlugin::partReasonTag = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("PartReasonTag"), STRING_LITERAL_AS_REFERENCE("{REASON}")); + RenX_IRCJoinPlugin::joinFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("Join.Format"), STRING_LITERAL_AS_REFERENCE("{NAME} has joined {CHAN}!")); + RenX_IRCJoinPlugin::partFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("Part.Format"), STRING_LITERAL_AS_REFERENCE("{NAME} has left {CHAN} ({REASON})!")); + RenX_IRCJoinPlugin::partFmtNoReason = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("Part.FormatNoReason"), STRING_LITERAL_AS_REFERENCE("{NAME} has left {CHAN}!")); +} + +void RenX_IRCJoinPlugin::OnJoin(Jupiter::IRC::Client *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick) +{ + int access = source->getAccessLevel(channel, nick); + + if (access >= RenX_IRCJoinPlugin::minAccessJoinMessage && (RenX_IRCJoinPlugin::maxAccessJoinMessage == -1 || access <= RenX_IRCJoinPlugin::maxAccessJoinMessage)) + { + RenX::Server *server; + int type = source->getChannel(channel)->getType(); + + Jupiter::String msg = RenX_IRCJoinPlugin::joinFmt; + msg.replace(RenX_IRCJoinPlugin::nameTag, nick); + msg.replace(RenX_IRCJoinPlugin::chanTag, channel); + + auto checkType = [&] + { + if (this->publicOnly) + return server->isPublicLogChanType(type); + else + return server->isLogChanType(type); + }; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + server = RenX::getCore()->getServer(i); + if (checkType() && (RenX_IRCJoinPlugin::joinMsgAlways || server->players.size() != 0)) + server->sendMessage(msg); + } + } +} + +void RenX_IRCJoinPlugin::OnPart(Jupiter::IRC::Client *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString &reason) +{ + int access = source->getAccessLevel(channel, nick); + + if (access >= RenX_IRCJoinPlugin::minAccessPartMessage && (RenX_IRCJoinPlugin::maxAccessPartMessage == -1 || access <= RenX_IRCJoinPlugin::maxAccessPartMessage)) + { + RenX::Server *server; + int type = source->getChannel(channel)->getType(); + + Jupiter::String msg; + if (reason.isEmpty()) + msg = RenX_IRCJoinPlugin::partFmtNoReason; + else + msg = RenX_IRCJoinPlugin::partFmt; + msg.replace(RenX_IRCJoinPlugin::nameTag, nick); + msg.replace(RenX_IRCJoinPlugin::chanTag, channel); + msg.replace(RenX_IRCJoinPlugin::partReasonTag, reason); + + auto checkType = [&]() + { + if (this->publicOnly) + return server->isPublicLogChanType(type); + else + return server->isLogChanType(type); + }; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + server = RenX::getCore()->getServer(i); + if (checkType() && (RenX_IRCJoinPlugin::partMsgAlways || server->players.size() != 0)) + server->sendMessage(msg); + } + } +} + +int RenX_IRCJoinPlugin::OnRehash() +{ + RenX_IRCJoinPlugin::init(); + return 0; +} + +RenX_IRCJoinPlugin::RenX_IRCJoinPlugin() +{ + RenX_IRCJoinPlugin::init(); +} + +// Plugin instantiation and entry point. +RenX_IRCJoinPlugin pluginInstance; + +extern "C" __declspec(dllexport) Jupiter::Plugin *getPlugin() +{ + return &pluginInstance; +} diff --git a/RenX.IRCJoin/RenX_IRCJoin.h b/RenX.IRCJoin/RenX_IRCJoin.h new file mode 100644 index 0000000..4528ec5 --- /dev/null +++ b/RenX.IRCJoin/RenX_IRCJoin.h @@ -0,0 +1,52 @@ +/** + * Copyright (C) 2014 Justin James. + * + * This license must be preserved. + * Any applications, libraries, or code which make any use of any + * component of this program must not be commercial, unless explicit + * permission is granted from the original author. The use of this + * program for non-profit purposes is permitted. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * In the event that this license restricts you from making desired use of this program, contact the original author. + * Written by Justin James + */ + +#if !defined _EXAMPLE_H_HEADER +#define _EXAMPLE_H_HEADER + +#include "Jupiter/Plugin.h" +#include "Jupiter/Reference_String.h" +#include "RenX_Plugin.h" + +class RenX_IRCJoinPlugin : public RenX::Plugin +{ +public: // Jupiter::Plugin + void OnJoin(Jupiter::IRC::Client *source, const Jupiter::ReadableString &chan, const Jupiter::ReadableString &nick) override; + void OnPart(Jupiter::IRC::Client *source, const Jupiter::ReadableString &chan, const Jupiter::ReadableString &nick, const Jupiter::ReadableString &reason) override; + int OnRehash(); + RenX_IRCJoinPlugin(); + const Jupiter::ReadableString &getName() override { return name; } + +private: + void init(); + bool publicOnly; + bool joinMsgAlways; + bool partMsgAlways; + int minAccessJoinMessage; + int maxAccessJoinMessage; + int minAccessPartMessage; + int maxAccessPartMessage; + Jupiter::StringS nameTag; + Jupiter::StringS chanTag; + Jupiter::StringS partReasonTag; + Jupiter::StringS joinFmt; + Jupiter::StringS partFmt; + Jupiter::StringS partFmtNoReason; + STRING_LITERAL_AS_NAMED_REFERENCE(name, "RenX.IRCJoin"); +}; + +#endif // _EXAMPLE_H_HEADER \ No newline at end of file