X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_auditorium.cpp;h=4955b7c49e08f022b3be2aa88164b6fc95806d46;hb=95c1fb9bdd5f93cf4f8306a7b8ae9ca098aade1a;hp=35903a921f6539ea8f1b26ce92097bf4623634a7;hpb=b4be0c94ab5fb7e5a7a799a195c78de072a5e315;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_auditorium.cpp b/src/modules/m_auditorium.cpp index 35903a921..4955b7c49 100644 --- a/src/modules/m_auditorium.cpp +++ b/src/modules/m_auditorium.cpp @@ -18,7 +18,10 @@ class AuditoriumMode : public ModeHandler { public: - AuditoriumMode(InspIRCd* Instance, Module* Creator) : ModeHandler(Instance, Creator, 'u', 0, 0, false, MODETYPE_CHANNEL, false, 0, '@') { } + AuditoriumMode(Module* Creator) : ModeHandler(Creator, "auditorium", 'u', PARAM_NONE, MODETYPE_CHANNEL) + { + levelrequired = OP_VALUE; + } ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) { @@ -41,34 +44,33 @@ class ModuleAuditorium : public Module bool ShowOps; bool OperOverride; public: - ModuleAuditorium(InspIRCd* Me) - : Module(Me), aum(Me, this) + ModuleAuditorium() + : aum(this) { if (!ServerInstance->Modes->AddMode(&aum)) throw ModuleException("Could not add new modes!"); OnRehash(NULL); - Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnUserQuit, I_OnNamesListItem, I_OnRehash, I_OnHostCycle }; - Me->Modules->Attach(eventlist, this, 7); + Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnBuildNeighborList, I_OnNamesListItem, I_OnRehash }; + ServerInstance->Modules->Attach(eventlist, this, 6); } ~ModuleAuditorium() { - ServerInstance->Modes->DelMode(&aum); } void OnRehash(User* user) { - ConfigReader conf(ServerInstance); + ConfigReader conf; ShowOps = conf.ReadFlag("auditorium", "showops", 0); OperOverride = conf.ReadFlag("auditorium", "operoverride", 0); } Version GetVersion() { - return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION); + return Version("Allows for auditorium channels (+u) where nobody can see others joining and parting or the nick list", VF_COMMON | VF_VENDOR); } void OnNamesListItem(User* issuer, Membership* memb, std::string &prefixes, std::string &nick) @@ -135,34 +137,14 @@ class ModuleAuditorium : public Module BuildExcept(memb, excepts); } - ModResult OnHostCycle(User* user) - { - for (UCListIter f = user->chans.begin(); f != user->chans.end(); f++) - if ((*f)->IsModeSet('u')) - return MOD_RES_DENY; - - return MOD_RES_PASSTHRU; - } - - void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message) + void OnBuildNeighborList(User* source, UserChanList &include, std::map &exception) { - Command* parthandler = ServerInstance->Parser->GetHandler("PART"); - std::vector to_leave; - if (parthandler) + UCListIter i = include.begin(); + while (i != include.end()) { - for (UCListIter f = user->chans.begin(); f != user->chans.end(); f++) - { - if ((*f)->IsModeSet('u')) - to_leave.push_back((*f)->name); - } - /* We cant do this neatly in one loop, as we are modifying the map we are iterating */ - for (std::vector::iterator n = to_leave.begin(); n != to_leave.end(); n++) - { - std::vector parameters; - parameters.push_back(*n); - /* This triggers our OnUserPart, above, making the PART silent */ - parthandler->Handle(parameters, user); - } + Channel* c = *i++; + if (c->IsModeSet('u')) + include.erase(c); } } };