- if (FirstInGetsFounder && !chan)
- privs = QPrefix + "@";
-
- return 0;
- }
-
- virtual void OnPostJoin(User *user, Channel *channel)
- {
- // This *must* be in PostJoin, not UserJoin - the former will make it appear to happen
- // before the client is in the channel
-
- // This notice was here originally because it was all done prior to the creation of
- // privs in OnUserPreJoin. I've left it because it might still be wanted, but i'm
- // not sure it really should be here - ops don't get shown, obviously, and the prefix
- // will appear in the names list for the user.. remove if desired -Special
-
- if (FirstInGetsFounder && channel->GetUserCounter() == 1)
- user->WriteServ("MODE %s +q %s", channel->name.c_str(), user->nick.c_str());
- }
-
- virtual int OnAccessCheck(User* source,User* dest,Channel* channel,int access_type)
- {
- // here we perform access checks, this is the important bit that actually stops kicking/deopping
- // etc of protected users. There are many types of access check, we're going to handle
- // a relatively small number of them relevent to our module using a switch statement.
- // don't allow action if:
- // (A) Theyre founder (no matter what)
- // (B) Theyre protected, and you're not
- // always allow the action if:
- // (A) The source is ulined
-
-
- // firstly, if a ulined nick, or a server, is setting the mode, then allow them to set the mode
- // without any access checks, we're not worthy :p
- if ((ServerInstance->ULine(source->nick.c_str())) || (ServerInstance->ULine(source->server)) || (!*source->server))
- return ACR_ALLOW;
-
- std::string founder("cm_founder_"+channel->name);
- std::string protect("cm_protect_"+channel->name);
-
- switch (access_type)
- {
- // a user has been deopped. Do we let them? hmmm...
- case AC_DEOP:
- if (dest->GetExt(founder))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't deop "+dest->nick+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect)) && (!source->GetExt(protect)))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't deop "+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:
- if (dest->GetExt(founder))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't kick "+dest->nick+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect)) && (!source->GetExt(protect)))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't kick "+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))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't de-halfop "+dest->nick+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect)) && (!source->GetExt(protect)))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't de-halfop "+dest->nick+" as they're protected (+a)");
- return ACR_DENY;
- }
- break;
-
- // same with devoice.
- case AC_DEVOICE:
- if (dest->GetExt(founder))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't devoice "+dest->nick+" as they're a channel founder");
- return ACR_DENY;
- }
- if ((dest->GetExt(protect)) && (!source->GetExt(protect)))
- {
- source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't devoice "+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.
- return ACR_DEFAULT;
- }
-
- virtual ~ModuleChanProtect()
- {
- ServerInstance->Modes->DelMode(cp);
- ServerInstance->Modes->DelMode(cf);
- delete cp;
- delete cf;