diff options
Diffstat (limited to 'src/modules/m_override.cpp')
-rw-r--r-- | src/modules/m_override.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/modules/m_override.cpp b/src/modules/m_override.cpp new file mode 100644 index 000000000..ae90a76a7 --- /dev/null +++ b/src/modules/m_override.cpp @@ -0,0 +1,137 @@ +#include <stdio.h> + +#include "users.h" +#include "channels.h" +#include "modules.h" + +/* $ModDesc: Provides channel modes +a and +q */ + +char dummyvalue[] = "on"; + +class ModuleOverride : public Module +{ + Server *Srv; + bool NoisyOverride; + ConfigReader *Conf; + + public: + + ModuleOverride() + { + + // here we initialise our module. Use new to create new instances of the required + // classes. + + Srv = new Server; + Conf = new ConfigReader; + + // read our config options (main config file) + NoisyOverride = Conf->ReadFlag("override","noisy",0); + } + + virtual void OnRehash() + { + // on a rehash we delete our classes for good measure and create them again. + delete Conf; + Conf = new ConfigReader; + // re-read our config options on a rehash + NoisyOverride = Conf->ReadFlag("override","noisy",0); + } + + virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type) + { + if (strchr(source->modes,'o')) + { + if ((Srv->ChanMode(source,channel) != "%") && (Srv->ChanMode(source,channel) != "@")) + { + switch (access_type) + { + case AC_KICK: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + case AC_DEOP: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Deopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + case AC_OP: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Opped "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + case AC_VOICE: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Voiced "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + case AC_DEVOICE: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Devoiced "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + case AC_HALFOP: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Halfopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + case AC_DEHALFOP: + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Dehalfopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + break; + } + } + return ACR_ALLOW; + } + + return ACR_DEFAULT; + } + + virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname) + { + if (strchr(user->modes,'o')) + { + if (chan) + { + if ((chan->inviteonly) || (chan->key[0]) || (chan->limit >= Srv->CountUsers(chan))) + { + if (NoisyOverride) + { + if (!user->IsInvited(chan->name)) + { + WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,user,"NOTICE %s :%s invited himself into the channel",cname,user->nick); + } + } + Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +i, +k or +l on "+std::string(cname)); + } + return -1; + } + } + return 0; + } + + virtual ~ModuleOverride() + { + delete Conf; + delete Srv; + } + + virtual Version GetVersion() + { + return Version(1,0,0,0); + } +}; + + +class ModuleOverrideFactory : public ModuleFactory +{ + public: + ModuleOverrideFactory() + { + } + + ~ModuleOverrideFactory() + { + } + + virtual Module * CreateModule() + { + return new ModuleOverride; + } + +}; + + +extern "C" void * init_module( void ) +{ + return new ModuleOverrideFactory; +} + |