-/* +------------------------------------+
- * | Inspire Internet Relay Chat Daemon |
- * +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
*
- * InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
*
- * This program is free but copyrighted software; see
- * the file COPYING for details.
+ * This file is part of InspIRCd. InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
*
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
#ifndef INSPIRCD_LISTMODE_PROVIDER
#define INSPIRCD_LISTMODE_PROVIDER
/** An item in a listmode's list
*/
-class ListItem : public classbase
+class ListItem
{
public:
std::string nick;
/** The number of items a listmode's list may contain
*/
-class ListLimit : public classbase
+class ListLimit
{
public:
std::string mask;
configtag(ctag), extItem("listbase_mode_" + name + "_list", Creator)
{
list = true;
- this->DoRehash();
- ServerInstance->Extensions.Register(&extItem);
}
/** See mode.h
*/
virtual void DoRehash()
{
- ConfigReader Conf;
+ ConfigTagList tags = ServerInstance->Config->ConfTags(configtag);
chanlimits.clear();
- for (int i = 0; i < Conf.Enumerate(configtag); i++)
+ for (ConfigIter i = tags.first; i != tags.second; i++)
{
// For each <banlist> tag
+ ConfigTag* c = i->second;
ListLimit limit;
- limit.mask = Conf.ReadValue(configtag, "chan", i);
- limit.limit = Conf.ReadInteger(configtag, "limit", i, true);
+ limit.mask = c->getString("chan");
+ limit.limit = c->getInt("limit");
if (limit.mask.size() && limit.limit > 0)
chanlimits.push_back(limit);
}
- if (chanlimits.size() == 0)
- {
- ListLimit limit;
- limit.mask = "*";
- limit.limit = 64;
- chanlimits.push_back(limit);
- }
+
+ // 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.
+ ListLimit limit;
+ limit.mask = "*";
+ limit.limit = 64;
+ chanlimits.push_back(limit);
}
/** Populate the Implements list with the correct events for a List Mode
*/
virtual void DoImplements(Module* m)
{
- Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnRehash };
- ServerInstance->Modules->Attach(eventlist, m, 3);
+ ServerInstance->Modules->AddService(extItem);
+ this->DoRehash();
+ Implementation eventlist[] = { I_OnSyncChannel, I_OnRehash };
+ ServerInstance->Modules->Attach(eventlist, m, sizeof(eventlist)/sizeof(Implementation));
}
/** Handle the list mode.
if (adding)
{
+ if (tidy)
+ ModeParser::CleanMask(parameter);
+
+ if (parameter.length() > 250)
+ return MODEACTION_DENY;
+
// If there was no list
if (!el)
{
extItem.set(channel, el);
}
- // Clean the mask up
- if (this->tidy)
- ModeParser::CleanMask(parameter);
-
// Check if the item already exists in the list
for (modelist::iterator it = el->begin(); it != el->end(); it++)
{
{
// We have a pattern matching the channel...
maxsize = el->size();
- if (IS_LOCAL(source) || (maxsize < it->limit))
+ if (!IS_LOCAL(source) || (maxsize < it->limit))
{
/* Ok, it *could* be allowed, now give someone subclassing us
* a chance to validate the parameter.
return MODEACTION_DENY;
}
}
+ else
+ break;
}
}
source->WriteNumeric(478, "%s %s %s :Channel ban/ignore list is full", source->nick.c_str(), channel->name.c_str(), parameter.c_str());
}
- parameter = "";
+ parameter.clear();
return MODEACTION_DENY;
}
else
if (parameter == it->mask)
{
el->erase(it);
- if (el->size() == 0)
+ if (el->empty())
{
extItem.unset(channel);
}
}
/* Tried to remove something that wasn't set */
TellNotSet(source, channel, parameter);
- parameter = "";
+ parameter.clear();
return MODEACTION_DENY;
}
else
{
/* Hmm, taking an exception off a non-existant list, DIE */
TellNotSet(source, channel, parameter);
- parameter = "";
+ parameter.clear();
return MODEACTION_DENY;
}
}