diff --git a/RenX.DNS/RenX.DNS.vcxproj b/RenX.DNS/RenX.DNS.vcxproj
new file mode 100644
index 0000000..62dd4ea
--- /dev/null
+++ b/RenX.DNS/RenX.DNS.vcxproj
@@ -0,0 +1,85 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+
+ {812E9781-A9CB-43C6-8C40-87908D50B363}
+ 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.DNS/RenX.DNS.vcxproj.filters b/RenX.DNS/RenX.DNS.vcxproj.filters
new file mode 100644
index 0000000..f7a2e07
--- /dev/null
+++ b/RenX.DNS/RenX.DNS.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.DNS/RenX_DNS.cpp b/RenX.DNS/RenX_DNS.cpp
new file mode 100644
index 0000000..0200506
--- /dev/null
+++ b/RenX.DNS/RenX_DNS.cpp
@@ -0,0 +1,52 @@
+/**
+ * This file is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ * Written by Justin James
+ */
+
+#include
+#include "Jupiter/Socket.h"
+#include "Jupiter/CString.h"
+#include "Jupiter/IRC_Client.h"
+#include "RenX_PlayerInfo.h"
+#include "RenX_Server.h"
+#include "RenX_Functions.h"
+#include "RenX_DNS.h"
+
+typedef void(RenX::Server::*logFuncType)(const char *fmt, ...) const;
+
+void RenX_DNSPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player)
+{
+ Jupiter::ReferenceString host = Jupiter::ReferenceString(Jupiter::Socket::resolveHostname(Jupiter::CStringS(player->ip).c_str(), 0));
+ const_cast(player)->varData.set(RenX_DNSPlugin::name, STRING_LITERAL_AS_REFERENCE("Host"), host);
+
+ logFuncType func;
+ if (RenX_DNSPlugin::resolveAdmin)
+ {
+ if (RenX_DNSPlugin::resolvePublic)
+ func = &RenX::Server::sendLogChan;
+ else func = &RenX::Server::sendAdmChan;
+ }
+ else if (RenX_DNSPlugin::resolvePublic)
+ func = &RenX::Server::sendPubChan;
+ else return;
+
+ Jupiter::ReadableString &name = RenX::getFormattedPlayerName(player);
+ (server->*func)(IRCCOLOR "03[DNS] " IRCBOLD "%.*s" IRCBOLD IRCCOLOR "'s hostname resolved to: " IRCBOLD IRCCOLOR "10%.*s" IRCBOLD, name.size(), name.ptr(), host.size(), host.ptr());
+}
+
+RenX_DNSPlugin::RenX_DNSPlugin()
+{
+ RenX_DNSPlugin::resolveAdmin = Jupiter::IRC::Client::Config->getBool(RenX_DNSPlugin::name, STRING_LITERAL_AS_REFERENCE("ResolveAdmin"), true);
+ RenX_DNSPlugin::resolvePublic = Jupiter::IRC::Client::Config->getBool(RenX_DNSPlugin::name, STRING_LITERAL_AS_REFERENCE("ResolvePublic"), false);
+}
+
+// Plugin instantiation and entry point.
+RenX_DNSPlugin pluginInstance;
+
+extern "C" __declspec(dllexport) Jupiter::Plugin *getPlugin()
+{
+ return &pluginInstance;
+}
diff --git a/RenX.DNS/RenX_DNS.h b/RenX.DNS/RenX_DNS.h
new file mode 100644
index 0000000..a6b4642
--- /dev/null
+++ b/RenX.DNS/RenX_DNS.h
@@ -0,0 +1,30 @@
+/**
+ * This file is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ * Written by Justin James
+ */
+
+#if !defined _RENX_DNS_H_HEADER
+#define _RENX_DNS_H_HEADER
+
+#include "Jupiter/Plugin.h"
+#include "Jupiter/Reference_String.h"
+#include "RenX_Plugin.h"
+
+class RenX_DNSPlugin : public RenX::Plugin
+{
+public: // RenX::Plugin
+ void RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player);
+
+public: // Jupiter::Plugin
+ const Jupiter::ReadableString &getName() override { return name; }
+ RenX_DNSPlugin();
+private:
+ STRING_LITERAL_AS_NAMED_REFERENCE(name, "RenX.DNS");
+ bool resolveAdmin;
+ bool resolvePublic;
+};
+
+#endif // _RENX_DNS_H_HEADER
\ No newline at end of file