]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_restrictbanned.cpp
OOPS! We try again, since I'm smoking craq. LF is 0x0a NOT CR.
[user/henk/code/inspircd.git] / src / modules / m_restrictbanned.cpp
index 5535ca464f6e4abeca102129d6c379e3515205ed..9315385a1aeb416bf0d2ad63a0ec5967b54404ee 100644 (file)
@@ -1 +1,98 @@
-/*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#include "inspircd.h"\r#include "users.h"\r#include "channels.h"\r#include "modules.h"\r\r/* $ModDesc: Restricts banned users in a channel. May not speak, etc. */\r\rclass ModuleRestrictBanned : public Module\r{\r private:\r public:\r    ModuleRestrictBanned(InspIRCd* Me) : Module(Me)\r        {\r      }\r      \r       virtual ~ModuleRestrictBanned()\r        {\r      }\r      \r       virtual Version GetVersion()\r   {\r              return Version(1,1,0,1,VF_VENDOR,API_VERSION);\r }\r\r     void Implements(char* List)\r    {\r              List[I_OnLocalTopicChange] = List[I_OnUserPreNick] = List[I_OnUserPreNotice] = List[I_OnUserPreMessage] = 1;\r   }\r\r     int CheckRestricted(userrec *user, chanrec *channel, const std::string &action)\r        {\r              /* aren't local? we don't care. */\r             if (!IS_LOCAL(user))\r                   return 0;\r\r             if (channel->GetStatus(user) < STATUS_VOICE && channel->IsBanned(user))\r                {\r                      /* banned, boned. drop the message. */\r                 user->WriteServ("NOTICE "+std::string(user->nick)+" :*** You may not " + action + ", as you are banned on channel " + channel->name);\r                  return 1;\r              }\r\r             return 0;\r      }\r\r     virtual int OnUserPreNick(userrec *user, const std::string &newnick)\r   {\r              /* if they aren't local, we don't care */\r              if (!IS_LOCAL(user))\r                   return 0;\r\r             /* bit of a special case. */\r           for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++)\r          {\r                      if (CheckRestricted(user, i->first, "change your nickname") == 1)\r                              return 1;\r              }\r\r             return 0;\r      }\r\r     virtual int OnLocalTopicChange(userrec *user, chanrec *channel, const std::string &topic)\r      {\r              return CheckRestricted(user, channel, "change the topic");\r     }\r      \r       virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)\r    {\r              return OnUserPreNotice(user,dest,target_type,text,status,exempt_list);\r }\r\r     virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)\r     {\r              if (target_type == TYPE_CHANNEL)\r               {\r                      chanrec *channel = (chanrec *)dest;\r\r                   return CheckRestricted(user, channel, "message the channel");\r          }\r\r             return 0;\r      }\r};\r\rMODULE_INIT(ModuleRestrictBanned)\r
\ No newline at end of file
+/*       +------------------------------------+
+ *       | 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 "users.h"
+#include "channels.h"
+#include "modules.h"
+
+/* $ModDesc: Restricts banned users in a channel. May not speak, etc. */
+
+class ModuleRestrictBanned : public Module
+{
+ private:
+ public:
+       ModuleRestrictBanned(InspIRCd* Me) : Module(Me)
+       {
+       }
+       
+       virtual ~ModuleRestrictBanned()
+       {
+       }
+       
+       virtual Version GetVersion()
+       {
+               return Version(1,1,0,1,VF_VENDOR,API_VERSION);
+       }
+
+       void Implements(char* List)
+       {
+               List[I_OnLocalTopicChange] = List[I_OnUserPreNick] = List[I_OnUserPreNotice] = List[I_OnUserPreMessage] = 1;
+       }
+
+       int CheckRestricted(userrec *user, chanrec *channel, const std::string &action)
+       {
+               /* aren't local? we don't care. */
+               if (!IS_LOCAL(user))
+                       return 0;
+
+               if (channel->GetStatus(user) < STATUS_VOICE && channel->IsBanned(user))
+               {
+                       /* banned, boned. drop the message. */
+                       user->WriteServ("NOTICE "+std::string(user->nick)+" :*** You may not " + action + ", as you are banned on channel " + channel->name);
+                       return 1;
+               }
+
+               return 0;
+       }
+
+       virtual int OnUserPreNick(userrec *user, const std::string &newnick)
+       {
+               /* if they aren't local, we don't care */
+               if (!IS_LOCAL(user))
+                       return 0;
+
+               /* bit of a special case. */
+               for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++)
+               {
+                       if (CheckRestricted(user, i->first, "change your nickname") == 1)
+                               return 1;
+               }
+
+               return 0;
+       }
+
+       virtual int OnLocalTopicChange(userrec *user, chanrec *channel, const std::string &topic)
+       {
+               return CheckRestricted(user, channel, "change the topic");
+       }
+       
+       virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+       {
+               return OnUserPreNotice(user,dest,target_type,text,status,exempt_list);
+       }
+
+       virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+       {
+               if (target_type == TYPE_CHANNEL)
+               {
+                       chanrec *channel = (chanrec *)dest;
+
+                       return CheckRestricted(user, channel, "message the channel");
+               }
+
+               return 0;
+       }
+};
+
+MODULE_INIT(ModuleRestrictBanned)