summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/inspircd.conf.example7
-rw-r--r--src/modules/m_cloaking.cpp17
-rw-r--r--src/modules/m_conn_umodes.cpp137
3 files changed, 145 insertions, 16 deletions
diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example
index 2b577ee5c..2e204b653 100644
--- a/docs/inspircd.conf.example
+++ b/docs/inspircd.conf.example
@@ -874,6 +874,13 @@
#<module name="m_conn_lusers.so">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
+# Conn-Usermodes: Set modes on users when they connect
+# When this module is loaded <connect:allow> tags may have an optional
+# modes="" value, which contains modes to add or remove from users
+# when they connect to the server.
+#<module name="m_conn_umodes.so">
+
+#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Conn-Wait-for-Pong: Don't let a user connect until they PONG
#<module name="m_conn_waitpong.so">
#
diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp
index f26e16e0e..60f62b099 100644
--- a/src/modules/m_cloaking.cpp
+++ b/src/modules/m_cloaking.cpp
@@ -434,23 +434,8 @@ class ModuleCloaking : public Module
void Implements(char* List)
{
- List[I_OnRehash] = List[I_OnUserConnect] = 1;
+ List[I_OnRehash] = 1;
}
-
- virtual void OnUserConnect(userrec* user)
- {
- // Heres the weird bit. When a user connects we must set +x on them, so
- // we're going to use the SendMode method of the Server class to send
- // the mode to the client. This is basically the same as sending an
- // SAMODE in unreal. Note that to the user it will appear as if they set
- // the mode on themselves.
-
- const char* modes[2]; // only two parameters
- modes[0] = user->nick; // first parameter is the nick
- modes[1] = "+x"; // second parameter is the mode
- ServerInstance->SendMode(modes,2,user); // send these, forming the command "MODE <nick> +x"
- }
-
};
// stuff down here is the module-factory stuff. For basic modules you can ignore this.
diff --git a/src/modules/m_conn_umodes.cpp b/src/modules/m_conn_umodes.cpp
new file mode 100644
index 000000000..8c962ae57
--- /dev/null
+++ b/src/modules/m_conn_umodes.cpp
@@ -0,0 +1,137 @@
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd is copyright (C) 2002-2006 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.
+ *
+ * ---------------------------------------------------
+ */
+
+using namespace std;
+
+#include <stdio.h>
+#include <vector>
+#include "users.h"
+#include "channels.h"
+#include "inspircd.h"
+#include "modules.h"
+#include "wildcard.h"
+
+/* $ModDesc: Sets (and unsets) modes on users when they connect */
+
+class ModuleModesOnConnect : public Module
+{
+ private:
+
+ ConfigReader *Conf;
+
+ public:
+ ModuleModesOnConnect(InspIRCd* Me)
+ : Module::Module(Me)
+ {
+
+ Conf = new ConfigReader(ServerInstance);
+ }
+
+ void Implements(char* List)
+ {
+ List[I_OnPostConnect] = List[I_OnRehash] = 1;
+ }
+
+ virtual void OnRehash(const std::string &parameter)
+ {
+ DELETE(Conf);
+ Conf = new ConfigReader(ServerInstance);
+ }
+
+ virtual ~ModuleModesOnConnect()
+ {
+ DELETE(Conf);
+ }
+
+ virtual Version GetVersion()
+ {
+ return Version(1,0,0,1,VF_VENDOR);
+ }
+
+ virtual void OnPostConnect(userrec* user)
+ {
+ if (!IS_LOCAL(user))
+ return;
+
+ ServerInstance->Log(DEBUG,"Post connect for mode setting");
+ for (int j = 0; j < Conf->Enumerate("connect"); j++)
+ {
+ std::string hostn = Conf->ReadValue("connect","allow",j);
+ if ((match(user->GetIPString(),hostn.c_str(),true)) || (match(user->host,hostn.c_str())))
+ {
+ ServerInstance->Log(DEBUG,"Found matching connect block '%s'",hostn.c_str());
+ std::string ThisModes = Conf->ReadValue("connect","modes",j);
+ if (ThisModes != "")
+ {
+ std::string buf;
+ stringstream ss(ThisModes);
+
+ vector<string> tokens;
+
+ // split ThisOperModes into modes and mode params
+ while (ss >> buf)
+ tokens.push_back(buf);
+
+ int size = tokens.size() + 1;
+ const char* modes[size];
+ modes[0] = user->nick;
+ modes[1] = tokens[0].c_str();
+
+ if (tokens.size() > 1)
+ {
+ // process mode params
+ int i = 2;
+ for (unsigned int k = 1; k < tokens.size(); k++)
+ {
+ modes[i] = tokens[k].c_str();
+ i++;
+ }
+ }
+
+ ServerInstance->SendMode(modes, size, user);
+ }
+ break;
+ }
+ }
+ }
+};
+
+// stuff down here is the module-factory stuff. For basic modules you can ignore this.
+
+class ModuleModesOnConnectFactory : public ModuleFactory
+{
+ public:
+ ModuleModesOnConnectFactory()
+ {
+ }
+
+ ~ModuleModesOnConnectFactory()
+ {
+ }
+
+ virtual Module * CreateModule(InspIRCd* Me)
+ {
+ return new ModuleModesOnConnect(Me);
+ }
+
+};
+
+
+extern "C" void * init_module( void )
+{
+ return new ModuleModesOnConnectFactory;
+}
+