]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Added operchans module for +O mode support
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 2 May 2004 16:05:38 +0000 (16:05 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 2 May 2004 16:05:38 +0000 (16:05 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@784 e03df62e-2008-0410-955e-edbf42e46eb7

src/modules/m_operchans.cpp [new file with mode: 0644]
src/modules/m_override.cpp

diff --git a/src/modules/m_operchans.cpp b/src/modules/m_operchans.cpp
new file mode 100644 (file)
index 0000000..461b7be
--- /dev/null
@@ -0,0 +1,103 @@
+#include <stdio.h>
+
+#include "users.h"
+#include "channels.h"
+#include "modules.h"
+
+/* $ModDesc: Provides support for oper-only chans via the +O channel mode */
+
+Server *Srv;
+        
+
+class ModuleOperChans : public Module
+{
+ public:
+       ModuleOperChans()
+       {
+               Srv = new Server;
+
+               // Add a mode +O for channels with no parameters                
+               Srv->AddExtendedMode('Z',MT_CHANNEL,false,0,0);
+       }
+       
+       virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params)
+       {
+               if ((modechar == 'O') && (type == MT_CHANNEL))
+               {
+                       chanrec* chan = (chanrec*)target;
+                       
+                       if ((Srv->IsUlined(source->nick)) || (Srv->IsUlined(source->server)) || (!strcmp(source->server,"")) || (strchr(source->modes,'o')))
+                       {
+                               return 1;
+                       }
+                       else
+                       {
+                               // eat the mode change, return an error
+                               WriteServ(user->fd,"468 %s %s :Only servers and opers may set channel mode +O",user->nick, chan->name);
+                               return -1;
+                       }
+       
+                       // must return 1 to handle the mode!
+                       return 1;
+               }
+               
+               return 0;
+       }
+       
+       virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname)
+       {
+               if (!strchr(user->modes,'o'))
+               {
+                       if (chan)
+                       {
+                               if (chan->IsCustomModeSet('O'))
+                               {
+                                       WriteServ(user->fd,"520 %s %s :Only IRC operators may join the channel %s (+O is set)",user->nick, chan->name,chan->name);
+                                       return 1;
+                               }
+                       }
+               }
+               return 0;
+       }
+       
+       virtual ~ModuleOperChans()
+       {
+               delete Srv;
+       }
+       
+       virtual Version GetVersion()
+       {
+               return Version(1,0,0,0);
+       }
+       
+       virtual void OnUserConnect(userrec* user)
+       {
+       }
+
+};
+
+
+class ModuleOperChansFactory : public ModuleFactory
+{
+ public:
+       ModuleOperChansFactory()
+       {
+       }
+       
+       ~ModuleOperChansFactory()
+       {
+       }
+       
+       virtual Module * CreateModule()
+       {
+               return new ModuleOperChans;
+       }
+       
+};
+
+
+extern "C" void * init_module( void )
+{
+       return new ModuleOperChansFactory;
+}
+
index ae90a76a7d04bf17080c474dd6ceaea44cc3a43e..e06ffff27f4fef18108298487b598370e317195f 100644 (file)
@@ -4,7 +4,7 @@
 #include "channels.h"
 #include "modules.h"
 
-/* $ModDesc: Provides channel modes +a and +q */
+/* $ModDesc: Provides support for unreal-style oper-override */
 
 char dummyvalue[] = "on";