From fe23c1d1817b207e7ce311e11ecab18471ed20b9 Mon Sep 17 00:00:00 2001 From: brain Date: Sun, 2 May 2004 16:05:38 +0000 Subject: Added operchans module for +O mode support git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@784 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_operchans.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/modules/m_operchans.cpp (limited to 'src/modules/m_operchans.cpp') diff --git a/src/modules/m_operchans.cpp b/src/modules/m_operchans.cpp new file mode 100644 index 000000000..461b7bece --- /dev/null +++ b/src/modules/m_operchans.cpp @@ -0,0 +1,103 @@ +#include + +#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 ¶ms) + { + 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; +} + -- cgit v1.2.3