X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_chanprotect.cpp;h=82c4e6940c330e6f8022d2c06cf763a811825c56;hb=ce168051e23bf7a33410ad17a4b78f5da478dbbe;hp=768c7eb8c254c287f5d3bd9d6c9eddcf52627eaf;hpb=28dea7fd09112224a79dfe6b141497ed46b44988;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp index 768c7eb8c..82c4e6940 100644 --- a/src/modules/m_chanprotect.cpp +++ b/src/modules/m_chanprotect.cpp @@ -66,8 +66,8 @@ class FounderProtectBase { CUList* cl = channel->GetUsers(); std::string item = extend + std::string(channel->name); - const char* mode_junk[MAXMODES+2]; - mode_junk[0] = channel->name; + std::vector mode_junk; + mode_junk.push_back(channel->name); irc::modestacker modestack(false); std::deque stackresult; @@ -89,9 +89,9 @@ class FounderProtectBase { for (size_t j = 0; j < stackresult.size(); j++) { - mode_junk[j+1] = stackresult[j].c_str(); + mode_junk.push_back(stackresult[j]); } - MyInstance->SendMode(mode_junk, stackresult.size() + 1, MyInstance->FakeClient); + MyInstance->SendMode(mode_junk, MyInstance->FakeClient); } } @@ -300,10 +300,10 @@ class ModuleChanProtect : public Module public: ModuleChanProtect(InspIRCd* Me) - : Module(Me), FirstInGetsFounder(false), QPrefix(0), APrefix(0), DeprivSelf(false), DeprivOthers(false), booting(true) - { + : Module(Me), FirstInGetsFounder(false), QPrefix(0), APrefix(0), DeprivSelf(false), DeprivOthers(false), booting(true), cp(NULL), cf(NULL) + { /* Load config stuff */ - OnRehash(NULL,""); + LoadSettings(); booting = false; /* Initialise module variables */ @@ -318,8 +318,8 @@ class ModuleChanProtect : public Module throw ModuleException("Could not add new modes!"); } - Implementation eventlist[] = { I_OnUserKick, I_OnUserPart, I_OnRehash, I_OnUserPreJoin, I_OnPostJoin, I_OnAccessCheck }; - ServerInstance->Modules->Attach(eventlist, this, 6); + Implementation eventlist[] = { I_OnUserKick, I_OnUserPart, I_OnUserPreJoin, I_OnPostJoin, I_OnAccessCheck }; + ServerInstance->Modules->Attach(eventlist, this, 5); } virtual void OnUserKick(User* source, User* user, Channel* chan, const std::string &reason, bool &silent) @@ -336,7 +336,7 @@ class ModuleChanProtect : public Module user->Shrink("cm_protect_"+std::string(channel->name)); } - virtual void OnRehash(User* user, const std::string ¶meter) + void LoadSettings() { /* Create a configreader class and read our flag, * in old versions this was heap-allocated and the @@ -345,9 +345,6 @@ class ModuleChanProtect : public Module */ ConfigReader Conf(ServerInstance); - char old_q = QPrefix; - char old_a = APrefix; - FirstInGetsFounder = Conf.ReadFlag("options", "noservices", 0); std::string qpre = Conf.ReadValue("options", "qprefix", 0); @@ -357,38 +354,19 @@ class ModuleChanProtect : public Module APrefix = apre.empty() ? 0 : apre[0]; if ((APrefix && QPrefix) && APrefix == QPrefix) - throw CoreException("What the smeg, why are both your +q and +a prefixes the same character?"); + throw ModuleException("What the smeg, why are both your +q and +a prefixes the same character?"); - DeprivSelf = Conf.ReadFlag("options","deprotectself",0); - DeprivOthers = Conf.ReadFlag("options","deprotectothers",0); + if (cp && ServerInstance->Modes->FindPrefix(APrefix) == cp) + throw ModuleException("Looks like the +a prefix you picked for m_chanprotect is already in use. Pick another."); - ServerInstance->Logs->Log("chanprotect", DEBUG, "qprefix is %c and aprefix is %c", QPrefix, APrefix); - - /* Did the user change the QA prefixes on the fly? - * If so, remove all instances of the mode, and reinit - * the module with prefixes enabled. - */ - if ((old_q != QPrefix) && (!booting)) - { - ServerInstance->Modes->DelMode(cf); - delete cf; - cf = new ChanFounder(ServerInstance, QPrefix, DeprivSelf, DeprivOthers); - /* These wont fail, we already owned the mode characters before */ - ServerInstance->Modes->AddMode(cf); - ServerInstance->SNO->WriteToSnoMask('A', "WARNING: +qa prefixes were enabled or disabled via a REHASH. Clients will probably need to reconnect to pick up this change."); - } + 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."); - if ((old_a != APrefix) && (!booting)) - { - ServerInstance->Modes->DelMode(cp); - delete cp; - cp = new ChanProtect(ServerInstance, APrefix, DeprivSelf, DeprivOthers); - ServerInstance->Modes->AddMode(cp); - ServerInstance->SNO->WriteToSnoMask('A', "WARNING: +qa prefixes were enabled or disabled via a REHASH. Clients will probably need to reconnect to pick up this change."); - } + DeprivSelf = Conf.ReadFlag("options","deprotectself",0); + DeprivOthers = Conf.ReadFlag("options","deprotectothers",0); } - virtual int OnUserPreJoin(User *user, Channel *chan, const char *cname, std::string &privs) + virtual int OnUserPreJoin(User *user, Channel *chan, const char *cname, std::string &privs, const std::string &keygiven) { // if the user is the first user into the channel, mark them as the founder, but only if // the config option for it is set