mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Improve handling of list mode limits.
- Fix not being able to set a zero limit. - Fix MAXLIST not reflecting the true lower limit. - Fix not treating an empty <maxlist:limit> as equivalent to *.
This commit is contained in:
parent
7f979b895e
commit
0e1a076653
@ -64,6 +64,7 @@ void ListModeBase::DoRehash()
|
|||||||
{
|
{
|
||||||
ConfigTagList tags = ServerInstance->Config->ConfTags("maxlist");
|
ConfigTagList tags = ServerInstance->Config->ConfTags("maxlist");
|
||||||
limitlist newlimits;
|
limitlist newlimits;
|
||||||
|
bool seen_default = false;
|
||||||
for (ConfigIter i = tags.first; i != tags.second; i++)
|
for (ConfigIter i = tags.first; i != tags.second; i++)
|
||||||
{
|
{
|
||||||
ConfigTag* c = i->second;
|
ConfigTag* c = i->second;
|
||||||
@ -72,20 +73,24 @@ void ListModeBase::DoRehash()
|
|||||||
if (!mname.empty() && !stdalgo::string::equalsci(mname, name) && !(mname.length() == 1 && GetModeChar() == mname[0]))
|
if (!mname.empty() && !stdalgo::string::equalsci(mname, name) && !(mname.length() == 1 && GetModeChar() == mname[0]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ListLimit limit(c->getString("chan", "*"), c->getUInt("limit", 0));
|
ListLimit limit(c->getString("chan", "*", 1), c->getUInt("limit", DEFAULT_LIST_SIZE));
|
||||||
|
|
||||||
if (limit.mask.empty())
|
if (limit.mask.empty())
|
||||||
throw ModuleException(InspIRCd::Format("<maxlist:chan> is empty, at %s", c->getTagLocation().c_str()));
|
throw ModuleException(InspIRCd::Format("<maxlist:chan> is empty, at %s", c->getTagLocation().c_str()));
|
||||||
|
|
||||||
if (limit.limit <= 0)
|
if (limit.mask == "*" || limit.mask == "#*")
|
||||||
throw ModuleException(InspIRCd::Format("<maxlist:limit> must be non-zero, at %s", c->getTagLocation().c_str()));
|
seen_default = true;
|
||||||
|
|
||||||
newlimits.push_back(limit);
|
newlimits.push_back(limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the default entry. This is inserted last so if the user specifies a
|
// If no default limit has been specified then insert one.
|
||||||
// wildcard record in the config it will take precedence over this entry.
|
if (!seen_default)
|
||||||
newlimits.push_back(ListLimit("*", DEFAULT_LIST_SIZE));
|
{
|
||||||
|
ServerInstance->Logs->Log("MODE", LOG_DEBUG, "No default <maxlist> entry was found for the %s mode; defaulting to %u",
|
||||||
|
name.c_str(), DEFAULT_LIST_SIZE);
|
||||||
|
newlimits.push_back(ListLimit("*", DEFAULT_LIST_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
// Most of the time our settings are unchanged, so we can avoid iterating the chanlist
|
// Most of the time our settings are unchanged, so we can avoid iterating the chanlist
|
||||||
if (chanlimits == newlimits)
|
if (chanlimits == newlimits)
|
||||||
@ -112,7 +117,7 @@ unsigned int ListModeBase::FindLimit(const std::string& channame)
|
|||||||
return it->limit;
|
return it->limit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return DEFAULT_LIST_SIZE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int ListModeBase::GetLimitInternal(const std::string& channame, ChanData* cd)
|
unsigned int ListModeBase::GetLimitInternal(const std::string& channame, ChanData* cd)
|
||||||
@ -133,13 +138,16 @@ unsigned int ListModeBase::GetLimit(Channel* channel)
|
|||||||
|
|
||||||
unsigned int ListModeBase::GetLowerLimit()
|
unsigned int ListModeBase::GetLowerLimit()
|
||||||
{
|
{
|
||||||
|
if (chanlimits.empty())
|
||||||
|
return DEFAULT_LIST_SIZE;
|
||||||
|
|
||||||
unsigned int limit = UINT_MAX;
|
unsigned int limit = UINT_MAX;
|
||||||
for (limitlist::iterator iter = chanlimits.begin(); iter != chanlimits.end(); ++iter)
|
for (limitlist::iterator iter = chanlimits.begin(); iter != chanlimits.end(); ++iter)
|
||||||
{
|
{
|
||||||
if (iter->limit < limit)
|
if (iter->limit < limit)
|
||||||
limit = iter->limit;
|
limit = iter->limit;
|
||||||
}
|
}
|
||||||
return limit == UINT_MAX ? DEFAULT_LIST_SIZE : limit;
|
return limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ModeAction ListModeBase::OnModeChange(User* source, User*, Channel* channel, std::string ¶meter, bool adding)
|
ModeAction ListModeBase::OnModeChange(User* source, User*, Channel* channel, std::string ¶meter, bool adding)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user