X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_override.cpp;h=859b7e7b7c78713ddae4ec666ab903f99b5e4124;hb=be609949e3ec2543d6cb16d23240870028732f36;hp=dc9e9ab374533eb77d812cf38c909068b52163d6;hpb=4c286655e1b930908fd02681ac00e172156e737c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_override.cpp b/src/modules/m_override.cpp index dc9e9ab37..859b7e7b7 100644 --- a/src/modules/m_override.cpp +++ b/src/modules/m_override.cpp @@ -12,7 +12,6 @@ */ #include "inspircd.h" -#include "wildcard.h" /* $ModDesc: Provides support for unreal-style oper-override */ @@ -20,7 +19,6 @@ typedef std::map override_t; class ModuleOverride : public Module { - override_t overrides; bool RequireKey; bool NoisyOverride; @@ -37,8 +35,8 @@ class ModuleOverride : public Module ServerInstance->SNO->EnableSnomask('O', "OVERRIDE"); OverriddenMode = false; OverOps = OverDeops = OverVoices = OverDevoices = OverHalfops = OverDehalfops = 0; - Implementation eventlist[] = { I_OnRehash, I_OnAccessCheck, I_On005Numeric, I_OnUserPreJoin, I_OnUserPreKick, I_OnPostCommand }; - ServerInstance->Modules->Attach(eventlist, this, 6); + Implementation eventlist[] = { I_OnRehash, I_OnAccessCheck, I_On005Numeric, I_OnUserPreJoin, I_OnUserPreKick, I_OnPostCommand, I_OnLocalTopicChange }; + ServerInstance->Modules->Attach(eventlist, this, 7); } virtual void OnRehash(User* user, const std::string ¶meter) @@ -103,13 +101,31 @@ class ModuleOverride : public Module return false; } + + virtual int OnLocalTopicChange(User *source, Channel *channel, const std::string &topic) + { + if (IS_OPER(source) && CanOverride(source, "TOPIC")) + { + if (!channel->HasUser(source) || (channel->IsModeSet('t') && channel->GetStatus(source) < STATUS_HOP)) + { + ServerInstance->SNO->WriteToSnoMask('O',std::string(source->nick)+" used oper override to change a topic on "+std::string(channel->name)); + } + + // Explicit allow + return -1; + } + + return 0; + } + virtual int OnUserPreKick(User* source, User* user, Channel* chan, const std::string &reason) { if (IS_OPER(source) && CanOverride(source,"KICK")) { - if (((chan->GetStatus(source) == STATUS_HOP) && (chan->GetStatus(user) == STATUS_OP)) || (chan->GetStatus(source) < STATUS_VOICE)) - { - ServerInstance->SNO->WriteToSnoMask('O',std::string(source->nick)+" Override-Kicked "+std::string(user->nick)+" on "+std::string(chan->name)+" ("+reason+")"); + // If the kicker's status is less than the target's, or the kicker's status is less than or equal to voice + if ((chan->GetStatus(source) < chan->GetStatus(user)) || (chan->GetStatus(source) <= STATUS_VOICE)) + { + ServerInstance->SNO->WriteToSnoMask('O',std::string(source->nick)+" used oper override to kick "+std::string(user->nick)+" on "+std::string(chan->name)+" ("+reason+")"); } /* Returning -1 explicitly allows the kick */ return -1; @@ -312,7 +328,7 @@ class ModuleOverride : public Module virtual Version GetVersion() { - return Version(1,2,0,1,VF_VENDOR,API_VERSION); + return Version("$Id$",VF_VENDOR,API_VERSION); } };