#include "users.h"
#include "channels.h"
#include "modules.h"
-#include "helperfuncs.h"
+
#include "wildcard.h"
#include "inspircd.h"
infokey = "exceptionbase_mode_" + std::string(1, mode) + "_list";
}
- std::pair<bool,std::string> ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
- {
- log(DEBUG,"ListMode: ModeSet()");
+ 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)
- {
- log(DEBUG,"Found item %s",parameter.c_str());
+ for (modelist::iterator it = el->begin(); it != el->end(); it++)
+ {
+ if(parameter == it->mask)
+ {
return std::make_pair(true, parameter);
}
- }
+ }
}
- log(DEBUG,"Didnt find item %s",parameter.c_str());
return std::make_pair(false, parameter);
- }
+ }
virtual void DisplayList(userrec* user, chanrec* channel)
{
{
for(modelist::iterator it = el->begin(); it != el->end(); it++)
{
- 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());
+ 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());
}
}
- user->WriteServ( "%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 RemoveMode(chanrec* channel)
+ {
+ ServerInstance->Log(DEBUG,"Removing listmode base from %s %s",channel->name,infokey.c_str());
+ modelist* el;
+ channel->GetExt(infokey, el);
+ if (el)
+ {
+ ServerInstance->Log(DEBUG,"Channel is extended with a list");
+ char moderemove[MAXBUF];
+ userrec* n = new userrec(ServerInstance);
+ n->SetFd(FD_MAGIC_NUMBER);
+ modelist copy;
+ /* Make a copy of it, because we cant change the list whilst iterating over it */
+ for(modelist::iterator it = el->begin(); it != el->end(); it++)
+ {
+ copy.push_back(*it);
+ }
+ for(modelist::iterator it = copy.begin(); it != copy.end(); it++)
+ {
+ ServerInstance->Log(DEBUG,"Remove item %s",it->mask.c_str());
+ sprintf(moderemove,"-%c",this->GetModeChar());
+ const char* parameters[] = { channel->name, moderemove, it->mask.c_str() };
+ ServerInstance->SendMode(parameters, 3, n);
+ }
+ delete n;
+ }
+ }
+
+ virtual void RemoveMode(userrec* user)
+ {
+ /* Listmodes dont get set on users */
}
virtual void DoRehash()
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)
{
}
return MODEACTION_ALLOW;
}
- else
- {
- /* Tried to remove something that wasn't set */
- TellNotSet(source, channel, parameter);
- }
}
+ /* Tried to remove something that wasn't set */
+ TellNotSet(source, channel, parameter);
parameter = "";
return MODEACTION_DENY;
}
else
{
- // Hmm, taking an exception off a non-existant list, DIE
+ /* Hmm, taking an exception off a non-existant list, DIE */
+ TellNotSet(source, channel, parameter);
parameter = "";
return MODEACTION_DENY;
}
virtual void DoCleanup(int target_type, void* item)
{
- if (target_type == TYPE_CHANNEL)
- {
- chanrec* chan = (chanrec*)item;
-
- modelist* list;
- chan->GetExt(infokey, list);
-
- if (list)
- {
- chan->Shrink(infokey);
- delete list;
- }
- }
}
virtual bool ValidateParam(userrec* source, chanrec* channel, std::string ¶meter)