X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_chanprotect.cpp;h=ca331b0cf9170bab9a9ef2fe521a687e70ac6468;hb=495ea4be05859f46cbf99c10541210fa3590f01a;hp=95641891fa6858c1716635056791b59b8c777469;hpb=6f3fcc5f21331a4d93ff73d2ab7f374aeb17305c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp index 95641891f..ca331b0cf 100644 --- a/src/modules/m_chanprotect.cpp +++ b/src/modules/m_chanprotect.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -12,6 +12,7 @@ */ #include "inspircd.h" +#include "m_override.h" /* $ModDesc: Provides channel modes +a and +q */ @@ -158,7 +159,7 @@ class ChanFounder : public ModeHandler, public FounderProtectBase { public: ChanFounder(InspIRCd* Instance, char my_prefix, bool &depriv_self, bool &depriv_others) - : ModeHandler(Instance, 'q', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0), + : ModeHandler(Instance, 'q', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0, TR_NICK), FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387, depriv_self, depriv_others) { } unsigned int GetPrefixRank() @@ -193,13 +194,23 @@ class ChanFounder : public ModeHandler, public FounderProtectBase { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } + + char isoverride=0; + Module *Override = ServerInstance->Modules->FindFeature("Override"); + if (Override) + { + OVRrequest ovr(NULL,Override,source,"OTHERMODE"); + const char * tmp = ovr.Send(); + isoverride = tmp[0]; + } // source is a server, or ulined, we'll let them +-q the user. if (source == ServerInstance->FakeClient || ((source == theuser) && (!adding) && (FounderProtectBase::remove_own_privs)) || (ServerInstance->ULine(source->nick.c_str())) || (ServerInstance->ULine(source->server)) || (!*source->server) || - (!IS_LOCAL(source))) + (!IS_LOCAL(source)) || + isoverride) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } @@ -224,7 +235,7 @@ class ChanProtect : public ModeHandler, public FounderProtectBase { public: ChanProtect(InspIRCd* Instance, char my_prefix, bool &depriv_self, bool &depriv_others) - : ModeHandler(Instance, 'a', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0), + : ModeHandler(Instance, 'a', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0, TR_NICK), FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389, depriv_self, depriv_others) { } unsigned int GetPrefixRank() @@ -259,6 +270,15 @@ class ChanProtect : public ModeHandler, public FounderProtectBase { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } + + char isoverride=0; + Module *Override = ServerInstance->Modules->FindFeature("Override"); + if (Override) + { + OVRrequest ovr(NULL,Override,source,"OTHERMODE"); + const char * tmp = ovr.Send(); + isoverride = tmp[0]; + } // source has +q, is a server, or ulined, we'll let them +-a the user. if (source == ServerInstance->FakeClient || ((source == theuser) && (!adding) && (FounderProtectBase::remove_own_privs)) || @@ -266,7 +286,9 @@ class ChanProtect : public ModeHandler, public FounderProtectBase (ServerInstance->ULine(source->server)) || (!*source->server) || (source->GetExt(founder)) || - (!IS_LOCAL(source))) + (!IS_LOCAL(source)) || + isoverride + ) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } @@ -338,19 +360,14 @@ class ModuleChanProtect : public Module void LoadSettings() { - /* Create a configreader class and read our flag, - * in old versions this was heap-allocated and the - * object was kept between rehashes...now we just - * stack-allocate it locally. - */ ConfigReader Conf(ServerInstance); - FirstInGetsFounder = Conf.ReadFlag("options", "noservices", 0); + FirstInGetsFounder = Conf.ReadFlag("chanprotect", "noservices", 0); - std::string qpre = Conf.ReadValue("options", "qprefix", 0); + std::string qpre = Conf.ReadValue("chanprotect", "qprefix", 0); QPrefix = qpre.empty() ? 0 : qpre[0]; - std::string apre = Conf.ReadValue("options", "aprefix", 0); + std::string apre = Conf.ReadValue("chanprotect", "aprefix", 0); APrefix = apre.empty() ? 0 : apre[0]; if ((APrefix && QPrefix) && APrefix == QPrefix) @@ -362,8 +379,8 @@ class ModuleChanProtect : public Module if (cf && ServerInstance->Modes->FindPrefix(QPrefix) == cf) throw ModuleException("Looks like the +q prefix you picked for m_chanprotect is already in use. Pick another."); - DeprivSelf = Conf.ReadFlag("options","deprotectself",0); - DeprivOthers = Conf.ReadFlag("options","deprotectothers",0); + DeprivSelf = Conf.ReadFlag("chanprotect","deprotectself", "yes", 0); + DeprivOthers = Conf.ReadFlag("chanprotect","deprotectothers", "yes", 0); } virtual int OnUserPreJoin(User *user, Channel *chan, const char *cname, std::string &privs, const std::string &keygiven) @@ -372,7 +389,7 @@ class ModuleChanProtect : public Module // the config option for it is set if (FirstInGetsFounder && !chan) - privs = QPrefix + "@"; + privs = std::string(1, QPrefix) + "@"; return 0; } @@ -490,7 +507,7 @@ class ModuleChanProtect : public Module virtual Version GetVersion() { - return Version(1, 2, 0, 0, VF_COMMON | VF_VENDOR, API_VERSION); + return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION); } };