- switch (access_type)
- {
- // a user has been deopped. Do we let them? hmmm...
- case AC_DEOP:
- ServerInstance->Log(DEBUG,"OnAccessCheck AC_DEOP");
- if (dest->GetExt(founder,dummyptr))
- {
- ServerInstance->Log(DEBUG,"Has %s",founder.c_str());
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't deop "+std::string(dest->nick)+" as they're a channel founder");
- return ACR_DENY;
- }
- else
- {
- ServerInstance->Log(DEBUG,"Doesnt have %s",founder.c_str());
- }
- if ((dest->GetExt(protect,dummyptr)) && (!source->GetExt(protect,dummyptr)))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't deop "+std::string(dest->nick)+" as they're protected (+a)");
- return ACR_DENY;
- }
- break;
-
- // a user is being kicked. do we chop off the end of the army boot?
- case AC_KICK:
- ServerInstance->Log(DEBUG,"OnAccessCheck AC_KICK");
- if (dest->GetExt(founder,dummyptr))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't kick "+std::string(dest->nick)+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect,dummyptr)) && (!source->GetExt(protect,dummyptr)))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't kick "+std::string(dest->nick)+" as they're protected (+a)");
- return ACR_DENY;
- }
- break;
-
- // a user is being dehalfopped. Yes, we do disallow -h of a +ha user
- case AC_DEHALFOP:
- if (dest->GetExt(founder,dummyptr))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't de-halfop "+std::string(dest->nick)+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect,dummyptr)) && (!source->GetExt(protect,dummyptr)))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't de-halfop "+std::string(dest->nick)+" as they're protected (+a)");
- return ACR_DENY;
- }
- break;
-
- // same with devoice.
- case AC_DEVOICE:
- if (dest->GetExt(founder,dummyptr))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't devoice "+std::string(dest->nick)+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect,dummyptr)) && (!source->GetExt(protect,dummyptr)))
- {
- source->WriteServ("484 "+std::string(source->nick)+" "+std::string(channel->name)+" :Can't devoice "+std::string(dest->nick)+" as they're protected (+a)");
- return ACR_DENY;
- }
- break;
- }
-
- // we dont know what this access check is, or dont care. just carry on, nothing to see here.
- ServerInstance->Log(DEBUG,"chanprotect OnAccessCheck returns DEFAULT");
- return ACR_DEFAULT;
- }
-
- virtual ~ModuleChanProtect()
- {
- ServerInstance->Modes->DelMode(cp);
- ServerInstance->Modes->DelMode(cf);
- DELETE(cp);
- DELETE(cf);
- }
-
- virtual Version GetVersion()
- {
- return Version(1, 1, 0, 0, VF_COMMON | VF_VENDOR, API_VERSION);
- }
-
- virtual void OnSyncChannel(chanrec* chan, Module* proto, void* opaque)
- {
- /* NOTE: If +qa prefix is on, this is propogated by the channel join,
- * so we dont need to propogate it manually
- */
- if (!QAPrefixes)
- {
- // this is called when the server is linking into a net and wants to sync channel data.
- // we should send our mode changes for the channel here to ensure that other servers
- // know whos +q/+a on the channel.
- CUList* cl = chan->GetUsers();
- string_list commands;
- std::string founder = "cm_founder_"+std::string(chan->name);
- std::string protect = "cm_protect_"+std::string(chan->name);
- irc::modestacker modestack(true);
- std::deque<std::string> stackresult;
- for (CUList::iterator i = cl->begin(); i != cl->end(); i++)
- {
- if (i->second->GetExt(founder,dummyptr))
- {
- modestack.Push('q',i->second->nick);
- }
- if (i->second->GetExt(protect,dummyptr))
- {
- modestack.Push('a',i->second->nick);
- }
- }
- while (modestack.GetStackedLine(stackresult))
- {
- irc::stringjoiner mode_join(" ", stackresult, 0, stackresult.size() - 1);
- std::string line = mode_join.GetJoined();
- proto->ProtoSendMode(opaque,TYPE_CHANNEL,chan, line);
- }
- }