/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2011 InspIRCd Development Team
* See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
/* $ModDesc: Provides channel modes +a and +q */
#define PROTECT_VALUE 40000
#define FOUNDER_VALUE 50000
/** Abstraction of FounderProtectBase for channel mode +q
*/
class ChanFounder : public PrefixModeHandler
{
public:
ChanFounder(Module* Creator) : PrefixModeHandler(Creator, "founder", 'q')
{
levelrequired = FOUNDER_VALUE;
fixed_letter = false;
}
void setPrefix(int pfx)
{
prefix = pfx;
}
void setLevel(bool selfmanip)
{
levelrequired = selfmanip ? FOUNDER_VALUE : FOUNDER_VALUE + 1;
}
unsigned int GetPrefixRank()
{
return FOUNDER_VALUE;
}
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding)
{
return MODEACTION_ALLOW;
}
void DisplayList(User* user, Channel* channel)
{
const UserMembList* cl = channel->GetUsers();
for (UserMembCIter i = cl->begin(); i != cl->end(); ++i)
{
if (i->second->hasMode(mode))
{
user->WriteServ("386 %s %s %s", user->nick.c_str(), channel->name.c_str(), i->first->nick.c_str());
}
}
user->WriteServ("387 %s %s :End of channel founder list", user->nick.c_str(), channel->name.c_str());
}
};
/** Abstraction of FounderProtectBase for channel mode +a
*/
class ChanProtect : public PrefixModeHandler
{
public:
ChanProtect(Module* Creator) : PrefixModeHandler(Creator, "admin", 'a')
{
levelrequired = PROTECT_VALUE;
fixed_letter = false;
}
void setPrefix(int pfx)
{
prefix = pfx;
}
unsigned int GetPrefixRank()
{
return PROTECT_VALUE;
}
void setLevel(bool selfmanip)
{
levelrequired = selfmanip ? PROTECT_VALUE : PROTECT_VALUE + 1;
}
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding)
{
return MODEACTION_ALLOW;
}
void DisplayList(User* user, Channel* channel)
{
const UserMembList* cl = channel->GetUsers();
for (UserMembCIter i = cl->begin(); i != cl->end(); ++i)
{
if (i->second->hasMode(mode))
{
user->WriteServ("388 %s %s %s", user->nick.c_str(), channel->name.c_str(), i->first->nick.c_str());
}
}
user->WriteServ("389 %s %s :End of channel protected user list", user->nick.c_str(), channel->name.c_str());
}
};
class ModuleChanProtect : public Module
{
ChanProtect cp;
ChanFounder cf;
public:
ModuleChanProtect() : cp(this), cf(this)
{
}
void init()
{
ConfigTag* tag = ServerInstance->Config->GetTag("chanprotect");
std::string qpre = tag->getString("qprefix");
std::string apre = tag->getString("aprefix");
cf.setPrefix(qpre.empty() ? 0 : qpre[0]);
cp.setPrefix(apre.empty() ? 0 : apre[0]);
ServerInstance->Modules->AddService(cf);
ServerInstance->Modules->AddService(cp);
}
void ReadConfig(ConfigReadStatus&)
{
ConfigTag* tag = ServerInstance->Config->GetTag("chanprotect");
cp.setLevel(tag->getBool("grantadmin", false));
cf.setLevel(tag->getBool("grantfounder", true));
}
Version GetVersion()
{
return Version("Founder and Protect modes (+qa)", VF_VENDOR);
}
};
MODULE_INIT(ModuleChanProtect)