summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/m_hostchange.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/modules/m_hostchange.cpp b/src/modules/m_hostchange.cpp
new file mode 100644
index 000000000..b892da8b1
--- /dev/null
+++ b/src/modules/m_hostchange.cpp
@@ -0,0 +1,135 @@
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ * E-mail:
+ * <brain@chatspike.net>
+ * <Craig@chatspike.net>
+ *
+ * Written by Craig Edwards, Craig McLure, and others.
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include <stdio.h>
+#include "users.h"
+#include "channels.h"
+#include "modules.h"
+
+/* $ModDesc: Provides masking of user hostnames */
+
+class ModuleHostChange : public Module
+{
+ private:
+
+ Server *Srv;
+ ConfigReader *Conf;
+ std::string MySuffix;
+
+ public:
+ ModuleHostChange()
+ {
+ // We must create an instance of the Server class to work with
+ Srv = new Server;
+ Conf = new ConfigReader;
+ MySuffix = Conf->ReadValue("host","suffix",0);
+ }
+
+ virtual ~ModuleHostChange()
+ {
+ // not really neccessary, but free it anyway
+ delete Srv;
+ delete Conf;
+ }
+
+ virtual void OnRehash()
+ {
+ delete Conf;
+ Conf = new ConfigReader;
+ MySuffix = Conf->ReadValue("host","suffix",0);
+ }
+
+ virtual Version GetVersion()
+ {
+ // returns the version number of the module to be
+ // listed in /MODULES
+ return Version(1,0,0,1);
+ }
+
+ virtual void OnUserConnect(userrec* user)
+ {
+ for (int index = 0; index < Conf->Enumerate("hostchange"); index++)
+ {
+ std::string mask = Conf->ReadValue("hostchange","mask",index);
+ if (Srv->MatchText(std::string(user->ident)+"@"+std::string(user->host),mask))
+ {
+ std::string newhost = "";
+ // host of new user matches a hostchange tag's mask
+ std::string action = Conf->ReadValue("hostchange","action",index);
+ if (action == "set")
+ {
+ newhost = Conf->ReadValue("hostchange","value",index);
+ }
+ else if (action == "suffix")
+ {
+ newhost = MySuffix;
+ }
+ else if (action == "addnick")
+ {
+ // first take their nick and strip out non-dns, leaving just [A-Z0-9\-]
+ std::string complete = "";
+ std::string old = user->nick;
+ for (int j = 0; j < old.length(); j++)
+ {
+ if (((old[j] >= 'A') && (old[j] <= 'Z')) ||
+ ((old[j] >= 'a') && (old[j] <= 'z')) ||
+ ((old[j] >= '0') && (old[j] <= '9')) ||
+ (old[j] == '-'))
+ {
+ complete = complete + old[j];
+ }
+ }
+ if (complete == "")
+ complete = "i-have-a-lame-nick";
+ newhost = complete + "." + MySuffix;
+ }
+ if (newhost != "")
+ {
+ Srv->SendServ(user->fd,"NOTICE "+std::string(user->nick)+" :Setting your VHost: " + newhost);
+ Srv->ChangeHost(user,newhost);
+ return;
+ }
+ }
+ }
+ }
+};
+
+// stuff down here is the module-factory stuff. For basic modules you can ignore this.
+
+class ModuleHostChangeFactory : public ModuleFactory
+{
+ public:
+ ModuleHostChangeFactory()
+ {
+ }
+
+ ~ModuleHostChangeFactory()
+ {
+ }
+
+ virtual Module * CreateModule()
+ {
+ return new ModuleHostChange;
+ }
+
+};
+
+
+extern "C" void * init_module( void )
+{
+ return new ModuleHostChangeFactory;
+}
+