* ---------------------------------------------------
*/
+#include "inspircd.h"
#include "users.h"
#include "channels.h"
#include "modules.h"
-#include "inspircd.h"
/* $ModDesc: Provides channel modes +a and +q */
/* $ModDep: ../../include/u_listmode.h */
char* dummyptr;
protected:
bool& remove_own_privs;
+ bool& remove_other_privs;
public:
- FounderProtectBase(InspIRCd* Instance, const std::string &ext, const std::string &mtype, int l, int e, bool &remove_own) :
- MyInstance(Instance), extend(ext), type(mtype), list(l), end(e), remove_own_privs(remove_own)
+ FounderProtectBase(InspIRCd* Instance, const std::string &ext, const std::string &mtype, int l, int e, bool &remove_own, bool &remove_others) :
+ MyInstance(Instance), extend(ext), type(mtype), list(l), end(e), remove_own_privs(remove_own), remove_other_privs(remove_others)
{
}
unload_kludge = true;
CUList* cl = channel->GetUsers();
std::string item = extend + std::string(channel->name);
- const char* mode_junk[MAXMODES+1];
+ const char* mode_junk[MAXMODES+2];
userrec* n = new userrec(MyInstance);
n->SetFd(FD_MAGIC_NUMBER);
mode_junk[0] = channel->name;
std::deque<std::string> stackresult;
for (CUList::iterator i = cl->begin(); i != cl->end(); i++)
{
- if (i->second->GetExt(item, dummyptr))
+ if (i->first->GetExt(item, dummyptr))
{
- modestack.Push(mc, i->second->nick);
+ modestack.Push(mc, i->first->nick);
}
}
unload_kludge = false;
}
- void DisplayList(userrec* user, chanrec* channel)
+ void DisplayList(userrec* user, chanrec* channel)
{
CUList* cl = channel->GetUsers();
std::string item = extend+std::string(channel->name);
- for (CUList::iterator i = cl->begin(); i != cl->end(); i++)
+ for (CUList::reverse_iterator i = cl->rbegin(); i != cl->rend(); ++i)
{
- if (i->second->GetExt(item, dummyptr))
+ if (i->first->GetExt(item, dummyptr))
{
- user->WriteServ("%d %s %s %s", list, user->nick, channel->name,i->second->nick);
+ user->WriteServ("%d %s %s %s", list, user->nick, channel->name,i->first->nick);
}
}
user->WriteServ("%d %s %s :End of channel %s list", end, user->nick, channel->name, type.c_str());
userrec* theuser = MyInstance->FindNick(parameter);
if ((!theuser) || (!channel->HasUser(theuser)))
{
- parameter = "";
+ parameter.clear();
return NULL;
}
return theuser;
}
+ bool CanRemoveOthers(userrec* u1, userrec* u2, chanrec* c)
+ {
+ std::string item = extend+std::string(c->name);
+ return (u1->GetExt(item, dummyptr) && u2->GetExt(item, dummyptr));
+ }
+
ModeAction HandleChange(userrec* source, userrec* theuser, bool adding, chanrec* channel, std::string ¶meter)
{
std::string item = extend+std::string(channel->name);
{
char* dummyptr;
public:
- ChanFounder(InspIRCd* Instance, bool using_prefixes, bool &depriv_self)
+ ChanFounder(InspIRCd* Instance, bool using_prefixes, bool &depriv_self, bool &depriv_others)
: ModeHandler(Instance, 'q', 1, 1, true, MODETYPE_CHANNEL, false, using_prefixes ? '~' : 0),
- FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387, depriv_self) { }
+ FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387, depriv_self, depriv_others) { }
unsigned int GetPrefixRank()
{
return MODEACTION_DENY;
}
+ if ((!adding) && FounderProtectBase::CanRemoveOthers(source, theuser, channel))
+ {
+ return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter);
+ }
// source is a server, or ulined, we'll let them +-q the user.
if ((unload_kludge) || ((source == theuser) && (!adding) && (FounderProtectBase::remove_own_privs)) || (ServerInstance->ULine(source->nick)) || (ServerInstance->ULine(source->server)) || (!*source->server) || (!IS_LOCAL(source)))
{
{
// whoops, someones being naughty!
source->WriteServ("468 %s %s :Only servers may set channel mode +q",source->nick, channel->name);
- parameter = "";
+ parameter.clear();
return MODEACTION_DENY;
}
}
{
char* dummyptr;
public:
- ChanProtect(InspIRCd* Instance, bool using_prefixes, bool &depriv_self)
+ ChanProtect(InspIRCd* Instance, bool using_prefixes, bool &depriv_self, bool &depriv_others)
: ModeHandler(Instance, 'a', 1, 1, true, MODETYPE_CHANNEL, false, using_prefixes ? '&' : 0),
- FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389, depriv_self) { }
+ FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389, depriv_self, depriv_others) { }
unsigned int GetPrefixRank()
{
std::string founder = "cm_founder_"+std::string(channel->name);
+ if ((!adding) && FounderProtectBase::CanRemoveOthers(source, theuser, channel))
+ {
+ return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter);
+ }
// source has +q, is a server, or ulined, we'll let them +-a the user.
if ((unload_kludge) || ((source == theuser) && (!adding) && (FounderProtectBase::remove_own_privs)) || (ServerInstance->ULine(source->nick)) || (ServerInstance->ULine(source->server)) || (!*source->server) || (source->GetExt(founder,dummyptr)) || (!IS_LOCAL(source)))
{
bool FirstInGetsFounder;
bool QAPrefixes;
bool DeprivSelf;
+ bool DeprivOthers;
bool booting;
ChanProtect* cp;
ChanFounder* cf;
public:
ModuleChanProtect(InspIRCd* Me)
- : Module::Module(Me), FirstInGetsFounder(false), QAPrefixes(false), DeprivSelf(false), booting(true)
+ : Module(Me), FirstInGetsFounder(false), QAPrefixes(false), DeprivSelf(false), DeprivOthers(false), booting(true)
{
/* Load config stuff */
OnRehash(NULL,"");
/* Initialise module variables */
- cp = new ChanProtect(ServerInstance,QAPrefixes,DeprivSelf);
- cf = new ChanFounder(ServerInstance,QAPrefixes,DeprivSelf);
+ cp = new ChanProtect(ServerInstance,QAPrefixes,DeprivSelf,DeprivOthers);
+ cf = new ChanFounder(ServerInstance,QAPrefixes,DeprivSelf,DeprivOthers);
if (!ServerInstance->AddMode(cp, 'a') || !ServerInstance->AddMode(cf, 'q'))
throw ModuleException("Could not add new modes!");
List[I_OnUserKick] = List[I_OnUserPart] = List[I_OnRehash] = List[I_OnUserJoin] = List[I_OnAccessCheck] = List[I_OnSyncChannel] = 1;
}
- virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason)
+ virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason, bool &silent)
{
// FIX: when someone gets kicked from a channel we must remove their Extensibles!
user->Shrink("cm_founder_"+std::string(chan->name));
user->Shrink("cm_protect_"+std::string(chan->name));
}
- virtual void OnUserPart(userrec* user, chanrec* channel, const std::string &partreason)
+ virtual void OnUserPart(userrec* user, chanrec* channel, const std::string &partreason, bool &silent)
{
// FIX: when someone parts a channel we must remove their Extensibles!
user->Shrink("cm_founder_"+std::string(channel->name));
FirstInGetsFounder = Conf.ReadFlag("options","noservices",0);
QAPrefixes = Conf.ReadFlag("options","qaprefixes",0);
DeprivSelf = Conf.ReadFlag("options","deprotectself",0);
+ DeprivOthers = Conf.ReadFlag("options","deprotectothers",0);
/* Did the user change the QA prefixes on the fly?
* If so, remove all instances of the mode, and reinit
ServerInstance->Modes->DelMode(cf);
DELETE(cp);
DELETE(cf);
- cp = new ChanProtect(ServerInstance,QAPrefixes,DeprivSelf);
- cf = new ChanFounder(ServerInstance,QAPrefixes,DeprivSelf);
+ cp = new ChanProtect(ServerInstance,QAPrefixes,DeprivSelf,DeprivOthers);
+ cf = new ChanFounder(ServerInstance,QAPrefixes,DeprivSelf,DeprivOthers);
/* These wont fail, we already owned the mode characters before */
ServerInstance->AddMode(cp, 'a');
ServerInstance->AddMode(cf, 'q');
}
}
- virtual void OnUserJoin(userrec* user, chanrec* channel)
+ virtual void OnUserJoin(userrec* user, chanrec* channel, bool &silent)
{
// 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
std::deque<std::string> stackresult;
for (CUList::iterator i = cl->begin(); i != cl->end(); i++)
{
- if (i->second->GetExt(founder,dummyptr))
+ if (i->first->GetExt(founder,dummyptr))
{
- modestack.Push('q',i->second->nick);
+ modestack.Push('q',i->first->nick);
}
- if (i->second->GetExt(protect,dummyptr))
+ if (i->first->GetExt(protect,dummyptr))
{
- modestack.Push('a',i->second->nick);
+ modestack.Push('a',i->first->nick);
}
}
while (modestack.GetStackedLine(stackresult))
};
-extern "C" void * init_module( void )
+extern "C" DllExport void * init_module( void )
{
return new ModuleChanProtectFactory;
}