]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add m_commonchans.so (documented in example conf, no wiki yet) resolves bug #342...
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 26 Aug 2007 20:01:15 +0000 (20:01 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 26 Aug 2007 20:01:15 +0000 (20:01 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7832 e03df62e-2008-0410-955e-edbf42e46eb7

docs/inspircd.conf.example
src/modules/m_commonchans.cpp [new file with mode: 0644]

index 31d69d84c451d6de6d3693244fff2ac2803b1554..33840ac287db21e87a6ab2f9fa9ad527139a42e5 100644 (file)
 # command is issued, use with care.
 #<module name="m_clones.so">
 
+#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
+# Common channels module: Adds user mode +c, which, when set, requires
+# that users must share a common channel with you to PRIVMSG or NOTICE
+# you.
+#<module name="m_commonchans.so">
+
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Conn-Join: Allows you to force users to join one or more channels
 # automatically upon connecting to the server.
diff --git a/src/modules/m_commonchans.cpp b/src/modules/m_commonchans.cpp
new file mode 100644 (file)
index 0000000..b4e274f
--- /dev/null
@@ -0,0 +1,102 @@
+/*       +------------------------------------+
+ *       | Inspire Internet Relay Chat Daemon |
+ *       +------------------------------------+
+ *
+ *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ *            the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include <stdio.h>
+#include <string>
+#include "users.h"
+#include "channels.h"
+#include "modules.h"
+#include "configreader.h"
+
+/* $ModDesc: Adds user mode +c, which if set, users must be on a common channel with you to private message you */
+
+/** Handles user mode +c
+ */
+class PrivacyMode : public ModeHandler
+{
+ public:
+       PrivacyMode(InspIRCd* Instance) : ModeHandler(Instance, 'c', 0, 0, false, MODETYPE_USER, false) { }
+
+       ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
+       {
+               if (adding)
+               {
+                       if (!dest->IsModeSet('c'))
+                       {
+                               dest->SetMode('c',true);
+                               return MODEACTION_ALLOW;
+                       }
+               }
+               else
+               {
+                       if (dest->IsModeSet('c'))
+                       {
+                               dest->SetMode('c',false);
+                               return MODEACTION_ALLOW;
+                       }
+               }
+               
+               return MODEACTION_DENY;
+       }
+};
+
+class ModulePrivacyMode : public Module
+{
+       PrivacyMode* pm;
+ public:
+       ModulePrivacyMode(InspIRCd* Me) : Module(Me)
+       {
+               pm = new PrivacyMode(ServerInstance);
+               if (!ServerInstance->AddMode(pm, 'c'))
+                       throw ModuleException("Could not add new modes!");
+       }
+
+       void Implements(char* List)
+       {
+               List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1;
+       }
+       
+       virtual ~ModulePrivacyMode()
+       {
+               ServerInstance->Modes->DelMode(pm);
+               DELETE(pm);
+       }
+       
+       virtual Version GetVersion()
+       {
+               return Version(1,1,0,0, VF_COMMON|VF_VENDOR, API_VERSION);
+       }
+
+       virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+       {
+               if (target_type == TYPE_USER)
+               {
+                       userrec* t = (userrec*)dest;
+                       if (!IS_OPER(user) && (t->IsModeSet('c')) && (!ServerInstance->ULine(user->server)) && !user->SharesChannelWith(t))
+                       {
+                               user->WriteServ("531 %s %s :You are not permitted to send private messages to this user (+c set)", user->nick, t->nick);
+                               return 1;
+                       }
+               }
+               return 0;
+       }
+
+       virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+       {
+               return OnUserPreMessage(user, dest, target_type, text, status, exempt_list);
+       }
+};
+
+
+MODULE_INIT(ModulePrivacyMode)