#include "users.h"
#include "channels.h"
#include "modules.h"
-#include "helperfuncs.h"
+
+#include "wildcard.h"
+#include "inspircd.h"
/* $ModDesc: Provides support for easily creating listmodes, stores the time set, the user, and a parameter. */
return TIME.str();
}
-class ListItem
+class ListItem : public classbase
{
public:
std::string nick;
std::string time;
};
-class ListLimit
+class ListLimit : public classbase
{
public:
std::string mask;
class ListModeBase : public ModeHandler
{
protected:
- Server* Srv;
std::string infokey;
std::string listnumeric;
std::string endoflistnumeric;
limitlist chanlimits;
public:
- ListModeBase(Server* serv, char modechar, const std::string &eolstr, const std::string &lnum, const std::string &eolnum, bool autotidy, const std::string &ctag = "banlist")
- : ModeHandler(modechar, 1, 1, true, MODETYPE_CHANNEL, false), Srv(serv), listnumeric(lnum), endoflistnumeric(eolnum), endofliststring(eolstr), tidy(autotidy), configtag(ctag)
+ ListModeBase(InspIRCd* Instance, char modechar, const std::string &eolstr, const std::string &lnum, const std::string &eolnum, bool autotidy, const std::string &ctag = "banlist")
+ : ModeHandler(Instance, modechar, 1, 1, true, MODETYPE_CHANNEL, false), listnumeric(lnum), endoflistnumeric(eolnum), endofliststring(eolstr), tidy(autotidy), configtag(ctag)
{
this->DoRehash();
infokey = "exceptionbase_mode_" + std::string(1, mode) + "_list";
}
+ std::pair<bool,std::string> ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
+ {
+ modelist* el;
+ channel->GetExt(infokey, el);
+ if (el)
+ {
+ for (modelist::iterator it = el->begin(); it != el->end(); it++)
+ {
+ if(parameter == it->mask)
+ {
+ return std::make_pair(true, parameter);
+ }
+ }
+ }
+ return std::make_pair(false, parameter);
+ }
+
virtual void DisplayList(userrec* user, chanrec* channel)
{
- modelist* el = (modelist*)channel->GetExt(infokey);
+ modelist* el;
+ channel->GetExt(infokey, el);
if (el)
{
for(modelist::iterator it = el->begin(); it != el->end(); it++)
{
- WriteServ(user->fd, "%s %s %s %s %s %s", listnumeric.c_str(), user->nick, channel->name, it->mask.c_str(), it->nick.c_str(), it->time.c_str());
+ user->WriteServ( "%s %s %s %s %s %s", listnumeric.c_str(), user->nick, channel->name, it->mask.c_str(), it->nick.c_str(), it->time.c_str());
}
}
- WriteServ(user->fd, "%s %s %s %s", endoflistnumeric.c_str(), user->nick, channel->name, endofliststring.c_str());
+ user->WriteServ( "%s %s %s %s", endoflistnumeric.c_str(), user->nick, channel->name, endofliststring.c_str());
}
virtual void DoRehash()
{
- ConfigReader Conf;
+ ConfigReader Conf(ServerInstance);
chanlimits.clear();
limit.limit = Conf.ReadInteger(configtag, "limit", i, true);
if(limit.mask.size() && limit.limit > 0)
- {
chanlimits.push_back(limit);
- log(DEBUG, "Read channel listmode limit of %u for mask '%s'", limit.limit, limit.mask.c_str());
- }
- else
- {
- log(DEBUG, "Invalid tag");
- }
}
if(chanlimits.size() == 0)
{
virtual ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
// Try and grab the list
- modelist* el = (modelist*)channel->GetExt(infokey);
+ modelist* el;
+ channel->GetExt(infokey, el);
if (adding)
{
for (limitlist::iterator it = chanlimits.begin(); it != chanlimits.end(); it++)
{
- if (Srv->MatchText(channel->name, it->mask))
+ if (match(channel->name, it->mask.c_str()))
{
// We have a pattern matching the channel...
maxsize = el->size();
/* List is full, give subclass a chance to send a custom message */
if(!TellListTooLong(source, channel, parameter))
{
- WriteServ(source->fd, "478 %s %s %s :Channel ban/ignore list is full", source->nick, channel->name, parameter.c_str());
+ source->WriteServ("478 %s %s %s :Channel ban/ignore list is full", source->nick, channel->name, parameter.c_str());
}
parameter = "";
virtual void DoChannelDelete(chanrec* chan)
{
- modelist* list = (modelist*)chan->GetExt(infokey);
+ modelist* list;
+ chan->GetExt(infokey, list);
if (list)
{
virtual void DoSyncChannel(chanrec* chan, Module* proto, void* opaque)
{
- modelist* list = (modelist*)chan->GetExt(infokey);
+ modelist* list;
+ chan->GetExt(infokey, list);
if (list)
{
for (modelist::iterator it = list->begin(); it != list->end(); it++)
{
chanrec* chan = (chanrec*)item;
- modelist* list = (modelist*)chan->GetExt(infokey);
+ modelist* list;
+ chan->GetExt(infokey, list);
if (list)
{