X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Flistmode.cpp;h=74977b866da91be530fe4332d57140359adad7a9;hb=33180223e318c304892b3fa8640f90f1ddf6f4b4;hp=19f2d6061dd00220fd8809a075da364661d86470;hpb=3a3ff949670c61a4a8856e1391222e156eb1cd17;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/listmode.cpp b/src/listmode.cpp index 19f2d6061..74977b866 100644 --- a/src/listmode.cpp +++ b/src/listmode.cpp @@ -22,7 +22,8 @@ ListModeBase::ListModeBase(Module* Creator, const std::string& Name, char modechar, const std::string &eolstr, unsigned int lnum, unsigned int eolnum, bool autotidy, const std::string &ctag) : ModeHandler(Creator, Name, modechar, PARAM_ALWAYS, MODETYPE_CHANNEL, MC_LIST), listnumeric(lnum), endoflistnumeric(eolnum), endofliststring(eolstr), tidy(autotidy), - configtag(ctag), extItem("listbase_mode_" + name + "_list", Creator) + configtag(ctag) + , extItem("listbase_mode_" + name + "_list", ExtensionItem::EXT_CHANNEL, Creator) { list = true; } @@ -32,17 +33,17 @@ void ListModeBase::DisplayList(User* user, Channel* channel) ChanData* cd = extItem.get(channel); if (cd) { - for (ModeList::reverse_iterator it = cd->list.rbegin(); it != cd->list.rend(); ++it) + for (ModeList::const_iterator it = cd->list.begin(); it != cd->list.end(); ++it) { - user->WriteNumeric(listnumeric, "%s %s %s %lu", channel->name.c_str(), it->mask.c_str(), (!it->setter.empty() ? it->setter.c_str() : ServerInstance->Config->ServerName.c_str()), (unsigned long) it->time); + user->WriteNumeric(listnumeric, channel->name, it->mask, it->setter, (unsigned long) it->time); } } - user->WriteNumeric(endoflistnumeric, "%s :%s", channel->name.c_str(), endofliststring.c_str()); + user->WriteNumeric(endoflistnumeric, channel->name, endofliststring); } void ListModeBase::DisplayEmptyList(User* user, Channel* channel) { - user->WriteNumeric(endoflistnumeric, "%s :%s", channel->name.c_str(), endofliststring.c_str()); + user->WriteNumeric(endoflistnumeric, channel->name, endofliststring); } void ListModeBase::RemoveMode(Channel* channel, Modes::ChangeList& changelist) @@ -68,7 +69,7 @@ void ListModeBase::DoRehash() { // For each tag ConfigTag* c = i->second; - ListLimit limit(c->getString("chan"), c->getInt("limit")); + ListLimit limit(c->getString("chan"), c->getUInt("limit", 0)); if (limit.mask.size() && limit.limit > 0) chanlimits.push_back(limit); @@ -76,7 +77,7 @@ void ListModeBase::DoRehash() // Add the default entry. This is inserted last so if the user specifies a // wildcard record in the config it will take precedence over this entry. - chanlimits.push_back(ListLimit("*", 64)); + chanlimits.push_back(ListLimit("*", DEFAULT_LIST_SIZE)); // Most of the time our settings are unchanged, so we can avoid iterating the chanlist if (oldlimits == chanlimits) @@ -101,7 +102,7 @@ unsigned int ListModeBase::FindLimit(const std::string& channame) return it->limit; } } - return 64; + return DEFAULT_LIST_SIZE; } unsigned int ListModeBase::GetLimitInternal(const std::string& channame, ChanData* cd) @@ -120,6 +121,17 @@ unsigned int ListModeBase::GetLimit(Channel* channel) return GetLimitInternal(channel->name, cd); } +unsigned int ListModeBase::GetLowerLimit() +{ + unsigned int limit = UINT_MAX; + for (limitlist::iterator iter = chanlimits.begin(); iter != chanlimits.end(); ++iter) + { + if (iter->limit < limit) + limit = iter->limit; + } + return limit == UINT_MAX ? DEFAULT_LIST_SIZE : limit; +} + ModeAction ListModeBase::OnModeChange(User* source, User*, Channel* channel, std::string ¶meter, bool adding) { // Try and grab the list @@ -192,7 +204,7 @@ ModeAction ListModeBase::OnModeChange(User* source, User*, Channel* channel, std { if (parameter == it->mask) { - cd->list.erase(it); + stdalgo::vector::swaperase(cd->list, it); return MODEACTION_ALLOW; } } @@ -209,9 +221,13 @@ bool ListModeBase::ValidateParam(User*, Channel*, std::string&) return true; } +void ListModeBase::OnParameterMissing(User*, User*, Channel*) +{ +} + void ListModeBase::TellListTooLong(User* source, Channel* channel, std::string& parameter) { - source->WriteNumeric(ERR_BANLISTFULL, "%s %s :Channel ban list is full", channel->name.c_str(), parameter.c_str()); + source->WriteNumeric(ERR_BANLISTFULL, channel->name, parameter, "Channel ban list is full"); } void ListModeBase::TellAlreadyOnList(User*, Channel*, std::string&)