mirror of
https://github.com/anope/anope.git
synced 2026-06-30 12:26:38 +02:00
Add support for per-mode list limits.
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
#include "service.h"
|
||||
#include "modes.h"
|
||||
|
||||
/* Encapsultes the IRCd protocol we are speaking. */
|
||||
class CoreExport IRCDProto : public Service
|
||||
@@ -241,6 +242,7 @@ class CoreExport IRCDProto : public Service
|
||||
* Defaults to Config->ListSize
|
||||
*/
|
||||
virtual unsigned GetMaxListFor(Channel *c);
|
||||
virtual unsigned GetMaxListFor(Channel *c, ChannelMode *cm);
|
||||
|
||||
virtual Anope::string NormalizeMask(const Anope::string &mask);
|
||||
};
|
||||
|
||||
@@ -42,10 +42,13 @@ class CommandCSBan : public Command
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &chan = params[0];
|
||||
Configuration::Block *block = Config->GetCommand(source);
|
||||
const Anope::string &mode = block->Get<Anope::string>("mode", "BAN");
|
||||
ChannelMode *cm = ModeManager::FindChannelModeByName(mode);
|
||||
if (cm == NULL)
|
||||
return;
|
||||
|
||||
const Anope::string &chan = params[0];
|
||||
ChannelInfo *ci = ChannelInfo::Find(chan);
|
||||
if (ci == NULL)
|
||||
{
|
||||
@@ -59,7 +62,7 @@ class CommandCSBan : public Command
|
||||
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
|
||||
return;
|
||||
}
|
||||
else if (IRCD->GetMaxListFor(c) && c->HasMode(mode) >= IRCD->GetMaxListFor(c))
|
||||
else if (IRCD->GetMaxListFor(c, cm) && c->HasMode(mode) >= IRCD->GetMaxListFor(c, cm))
|
||||
{
|
||||
source.Reply(_("The %s list for %s is full."), mode.lower().c_str(), c->name.c_str());
|
||||
return;
|
||||
|
||||
@@ -336,7 +336,7 @@ class CommandCSMode : public Command
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cm->type == MODE_LIST && ci->c && IRCD->GetMaxListFor(ci->c) && ci->c->HasMode(cm->name) >= IRCD->GetMaxListFor(ci->c))
|
||||
if (cm->type == MODE_LIST && ci->c && IRCD->GetMaxListFor(ci->c, cm) && ci->c->HasMode(cm->name) >= IRCD->GetMaxListFor(ci->c, cm))
|
||||
{
|
||||
source.Reply(_("List for mode %c is full."), cm->mchar);
|
||||
continue;
|
||||
@@ -660,7 +660,7 @@ class CommandCSMode : public Command
|
||||
|
||||
if (adding)
|
||||
{
|
||||
if (IRCD->GetMaxListFor(ci->c) && ci->c->HasMode(cm->name) < IRCD->GetMaxListFor(ci->c))
|
||||
if (IRCD->GetMaxListFor(ci->c, cm) && ci->c->HasMode(cm->name) < IRCD->GetMaxListFor(ci->c, cm))
|
||||
ci->c->SetMode(NULL, cm, param);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -438,6 +438,11 @@ unsigned IRCDProto::GetMaxListFor(Channel *c)
|
||||
return c->HasMode("LBAN") ? 0 : Config->GetBlock("networkinfo")->Get<int>("modelistsize");
|
||||
}
|
||||
|
||||
unsigned IRCDProto::GetMaxListFor(Channel *c, ChannelMode *cm)
|
||||
{
|
||||
return GetMaxListFor(c);
|
||||
}
|
||||
|
||||
Anope::string IRCDProto::NormalizeMask(const Anope::string &mask)
|
||||
{
|
||||
if (IsExtbanValid(mask))
|
||||
|
||||
Reference in New Issue
Block a user