mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Convert u_listmode and m_banexception to new api
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4189 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
parent
f88beda4d4
commit
793d2364d9
@ -72,6 +72,7 @@ enum ModeMasks {
|
||||
*/
|
||||
class ModeHandler
|
||||
{
|
||||
protected:
|
||||
/**
|
||||
* The mode letter you're implementing.
|
||||
*/
|
||||
@ -185,6 +186,7 @@ class ModeHandler
|
||||
|
||||
class ModeWatcher
|
||||
{
|
||||
protected:
|
||||
char mode;
|
||||
ModeType m_type;
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
/* Updated to use the <banlist> config tag if it exists */
|
||||
/* Written by Om <omster@gmail.com>, December 2005. */
|
||||
/* Based on code previously written by Om - April 2005 */
|
||||
/* Updated to new API July 8th 2006 by Brain */
|
||||
/* Originally based on m_chanprotect and m_silence */
|
||||
|
||||
inline std::string stringtime()
|
||||
@ -43,10 +44,9 @@ public:
|
||||
typedef std::vector<ListItem> modelist;
|
||||
typedef std::vector<ListLimit> limitlist;
|
||||
|
||||
class ListModeBaseModule : public Module
|
||||
class ListModeBase : public ModeHandler
|
||||
{
|
||||
protected:
|
||||
char mode;
|
||||
protected:
|
||||
std::string infokey;
|
||||
std::string listnumeric;
|
||||
std::string endoflistnumeric;
|
||||
@ -55,8 +55,8 @@ protected:
|
||||
|
||||
Server* Srv;
|
||||
ConfigReader* Conf;
|
||||
public:
|
||||
ListModeBaseModule(Server* serv, char modechar, const std::string &eolstr, const std::string &lnum, const std::string &eolnum) : Module::Module(serv)
|
||||
public:
|
||||
ListModeBase(Server* serv, char modechar, const std::string &eolstr, const std::string &lnum, const std::string &eolnum) : ModeHandler(modechar, 1, 1, true, MODETYPE_CHANNEL, false)
|
||||
{
|
||||
Srv = serv;
|
||||
Conf = new ConfigReader;
|
||||
@ -64,26 +64,37 @@ public:
|
||||
listnumeric = lnum;
|
||||
endoflistnumeric = eolnum;
|
||||
endofliststring = eolstr;
|
||||
|
||||
OnRehash("");
|
||||
this->DoRehash();
|
||||
infokey = "exceptionbase_mode_" + std::string(1, mode) + "_list";
|
||||
Srv->AddExtendedListMode(modechar);
|
||||
}
|
||||
|
||||
virtual void OnRehash(const std::string ¶m)
|
||||
|
||||
virtual void DisplayList(userrec* user, chanrec* channel)
|
||||
{
|
||||
modelist* el = (modelist*)channel->GetExt(infokey);
|
||||
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());
|
||||
}
|
||||
}
|
||||
WriteServ(user->fd, "%s %s %s %s", endoflistnumeric.c_str(), user->nick, channel->name, endofliststring.c_str());
|
||||
}
|
||||
|
||||
virtual void DoRehash()
|
||||
{
|
||||
delete Conf;
|
||||
Conf = new ConfigReader;
|
||||
|
||||
|
||||
chanlimits.clear();
|
||||
|
||||
|
||||
for(int i = 0; i < Conf->Enumerate("banlist"); i++)
|
||||
{
|
||||
// For each <banlist> tag
|
||||
ListLimit limit;
|
||||
limit.mask = Conf->ReadValue("banlist", "chan", i);
|
||||
limit.limit = Conf->ReadInteger("banlist", "limit", i, true);
|
||||
|
||||
|
||||
if(limit.mask.size() && limit.limit > 0)
|
||||
{
|
||||
chanlimits.push_back(limit);
|
||||
@ -94,7 +105,6 @@ public:
|
||||
log(DEBUG, "m_exceptionbase.so: Invalid tag");
|
||||
}
|
||||
}
|
||||
|
||||
if(chanlimits.size() == 0)
|
||||
{
|
||||
ListLimit limit;
|
||||
@ -103,164 +113,136 @@ public:
|
||||
chanlimits.push_back(limit);
|
||||
}
|
||||
}
|
||||
|
||||
void DoImplements(char* List)
|
||||
|
||||
virtual void DoImplements(char* List)
|
||||
{
|
||||
List[I_OnExtendedMode] = List[I_OnSendList] = List[I_OnChannelDelete] = List[I_OnSyncChannel] = List[I_OnCleanup] = List[I_OnRehash] = 1;
|
||||
}
|
||||
|
||||
virtual int OnExtendedMode(userrec *user, void *target, char modechar, int type, bool mode_on, string_list ¶ms)
|
||||
|
||||
virtual ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
|
||||
{
|
||||
// First, check it's our mode
|
||||
if ((modechar == mode) && (type == MT_CHANNEL))
|
||||
// Try and grab the list
|
||||
modelist* el = (modelist*)channel->GetExt(infokey);
|
||||
|
||||
if (adding)
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: General listmode handler called, handling mode '" + std::string(1, mode) + "'");
|
||||
chanrec* chan = (chanrec*)target;
|
||||
|
||||
// Try and grab the list
|
||||
modelist* el = (modelist*)chan->GetExt(infokey);
|
||||
|
||||
if(mode_on)
|
||||
// If there was no list
|
||||
if (!el)
|
||||
{
|
||||
// If there was no list
|
||||
if(!el)
|
||||
{
|
||||
// Make one
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Creating new list");
|
||||
el = new modelist;
|
||||
chan->Extend(infokey, (char*)el);
|
||||
}
|
||||
|
||||
if(!Srv->IsValidMask(params[0]))
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Banmask was invalid, returning -1");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (modelist::iterator it = el->begin(); it != el->end(); it++)
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Iterating over exception list, current mask: " + it->mask);
|
||||
if(params[0] == it->mask)
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Someone tried to set an exception which was already set, returning -1");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int maxsize = 0;
|
||||
|
||||
for(limitlist::iterator it = chanlimits.begin(); it != chanlimits.end(); it++)
|
||||
{
|
||||
if(Srv->MatchText(chan->name, it->mask))
|
||||
{
|
||||
// We have a pattern matching the channel...
|
||||
maxsize = el->size();
|
||||
if(maxsize < it->limit)
|
||||
{
|
||||
// And now add the mask onto the list...
|
||||
ListItem e;
|
||||
e.mask = params[0];
|
||||
e.nick = user->nick;
|
||||
e.time = stringtime();
|
||||
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: All checks passed, adding exception mask to list and returning 1");
|
||||
el->push_back(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Make one
|
||||
el = new modelist;
|
||||
channel->Extend(infokey, (char*)el);
|
||||
}
|
||||
|
||||
// List is full
|
||||
WriteServ(user->fd, "478 %s %s %s :Channel ban/ignore list is full", user->nick, chan->name, params[0].c_str());
|
||||
log(DEBUG, "m_exceptionbase.so: %s tried to set mask %s on %s but the list is full (max %d)", user->nick, params[0].c_str(), chan->name, maxsize);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We're taking the mode off
|
||||
if(el)
|
||||
// Clean the mask up
|
||||
ModeParser::CleanMask(parameter);
|
||||
|
||||
// Check if the item already exists in the list
|
||||
for (modelist::iterator it = el->begin(); it != el->end(); it++)
|
||||
{
|
||||
if(parameter == it->mask)
|
||||
{
|
||||
for (modelist::iterator it = el->begin(); it != el->end(); it++)
|
||||
// it does, deny the change
|
||||
parameter = "";
|
||||
return MODEACTION_DENY;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int maxsize = 0;
|
||||
|
||||
for (limitlist::iterator it = chanlimits.begin(); it != chanlimits.end(); it++)
|
||||
{
|
||||
if (Srv->MatchText(channel->name, it->mask))
|
||||
{
|
||||
// We have a pattern matching the channel...
|
||||
maxsize = el->size();
|
||||
if (maxsize < it->limit)
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Removing mode, iterating over exception list, current mask: " + it->mask);
|
||||
if(params[0] == it->mask)
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Found match for removal of exception, removing and returning 1");
|
||||
el->erase(it);
|
||||
if(el->size() == 0)
|
||||
{
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Erased the last entry on the exception list, removing the list");
|
||||
chan->Shrink(infokey);
|
||||
delete el;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
// And now add the mask onto the list...
|
||||
ListItem e;
|
||||
e.mask = parameter;
|
||||
e.nick = source->nick;
|
||||
e.time = stringtime();
|
||||
|
||||
el->push_back(e);
|
||||
return MODEACTION_ALLOW;
|
||||
}
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: No match found for attempted removing of exception, returning -1");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Hmm, taking an exception off a non-existant list, DIE
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: Attempted removal of an exception, when there was no exception list created, returning -1");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// List is full
|
||||
WriteServ(source->fd, "478 %s %s %s :Channel ban/ignore list is full", source->nick, channel->name, parameter.c_str());
|
||||
parameter = "";
|
||||
return MODEACTION_DENY;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual void OnSendList(userrec* user, chanrec* chan, char modechar)
|
||||
{
|
||||
if(modechar == mode)
|
||||
else
|
||||
{
|
||||
modelist* el = (modelist*)chan->GetExt(infokey);
|
||||
Srv->Log(DEBUG, "m_exceptionbase.so: " + std::string(user->nick)+" is listing listmodes on "+std::string(chan->name));
|
||||
// We're taking the mode off
|
||||
if (el)
|
||||
{
|
||||
for(modelist::iterator it = el->begin(); it != el->end(); it++)
|
||||
for (modelist::iterator it = el->begin(); it != el->end(); it++)
|
||||
{
|
||||
WriteServ(user->fd, "%s %s %s %s %s %s", listnumeric.c_str(), user->nick, chan->name, it->mask.c_str(), it->nick.c_str(), it->time.c_str());
|
||||
if(parameter == it->mask)
|
||||
{
|
||||
el->erase(it);
|
||||
if(el->size() == 0)
|
||||
{
|
||||
channel->Shrink(infokey);
|
||||
delete el;
|
||||
}
|
||||
return MODEACTION_ALLOW;
|
||||
}
|
||||
}
|
||||
parameter = "";
|
||||
return MODEACTION_DENY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Hmm, taking an exception off a non-existant list, DIE
|
||||
parameter = "";
|
||||
return MODEACTION_DENY;
|
||||
}
|
||||
|
||||
WriteServ(user->fd, "%s %s %s %s", endoflistnumeric.c_str(), user->nick, chan->name, endofliststring.c_str());
|
||||
}
|
||||
return MODEACTION_DENY;
|
||||
}
|
||||
|
||||
virtual void OnChannelDelete(chanrec* chan)
|
||||
virtual std::string& GetInfoKey()
|
||||
{
|
||||
return infokey;
|
||||
}
|
||||
|
||||
virtual void DoChannelDelete(chanrec* chan)
|
||||
{
|
||||
modelist* list = (modelist*)chan->GetExt(infokey);
|
||||
|
||||
if(list)
|
||||
|
||||
if (list)
|
||||
{
|
||||
chan->Shrink(infokey);
|
||||
delete list;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnSyncChannel(chanrec* chan, Module* proto, void* opaque)
|
||||
|
||||
virtual void DoSyncChannel(chanrec* chan, Module* proto, void* opaque)
|
||||
{
|
||||
modelist* list = (modelist*)chan->GetExt(infokey);
|
||||
if(list)
|
||||
modelist* list = (modelist*)chan->GetExt(infokey);
|
||||
if (list)
|
||||
{
|
||||
for(modelist::iterator it = list->begin(); it != list->end(); it++)
|
||||
for (modelist::iterator it = list->begin(); it != list->end(); it++)
|
||||
{
|
||||
proto->ProtoSendMode(opaque, TYPE_CHANNEL, chan, "+" + std::string(1, mode) + " " + it->mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnCleanup(int target_type, void* item)
|
||||
|
||||
virtual void DoCleanup(int target_type, void* item)
|
||||
{
|
||||
if (target_type == TYPE_CHANNEL)
|
||||
{
|
||||
chanrec* chan = (chanrec*)item;
|
||||
|
||||
|
||||
modelist* list = (modelist*)chan->GetExt(infokey);
|
||||
|
||||
if(list)
|
||||
|
||||
if (list)
|
||||
{
|
||||
chan->Shrink(infokey);
|
||||
delete list;
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "users.h"
|
||||
#include "channels.h"
|
||||
#include "modules.h"
|
||||
#include "mode.h"
|
||||
#include "helperfuncs.h"
|
||||
#include "u_listmode.h"
|
||||
|
||||
@ -16,17 +17,28 @@
|
||||
// The +e channel mode takes a nick!ident@host, glob patterns allowed,
|
||||
// and if a user matches an entry on the +e list then they can join the channel, overriding any (+b) bans set on them
|
||||
|
||||
|
||||
class ModuleBanException : public ListModeBaseModule
|
||||
class BanException : public ListModeBase
|
||||
{
|
||||
public:
|
||||
BanException(Server* serv) : ListModeBase(serv, 'e', "End of Channel Exception List", "348", "349") { }
|
||||
};
|
||||
|
||||
|
||||
class ModuleBanException : public Module
|
||||
{
|
||||
BanException* be;
|
||||
Server* Srv;
|
||||
|
||||
public:
|
||||
ModuleBanException(Server* serv) : ListModeBaseModule::ListModeBaseModule(serv, 'e', "End of Channel Exception List", "348", "349")
|
||||
ModuleBanException(Server* serv) : Module(serv)
|
||||
{
|
||||
be = new BanException(serv);
|
||||
Srv = serv;
|
||||
}
|
||||
|
||||
virtual void Implements(char* List)
|
||||
{
|
||||
this->DoImplements(List);
|
||||
be->DoImplements(List);
|
||||
List[I_On005Numeric] = List[I_OnCheckBan] = 1;
|
||||
}
|
||||
|
||||
@ -40,7 +52,7 @@ public:
|
||||
{
|
||||
if(chan != NULL)
|
||||
{
|
||||
modelist* list = (modelist*)chan->GetExt(infokey);
|
||||
modelist* list = (modelist*)chan->GetExt(be->GetInfoKey());
|
||||
Srv->Log(DEBUG, std::string(user->nick)+" is trying to join "+std::string(chan->name)+", checking for ban exceptions");
|
||||
|
||||
if(list)
|
||||
@ -55,6 +67,26 @@ public:
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual void OnCleanup(int target_type, void* item)
|
||||
{
|
||||
be->DoCleanup(target_type, item);
|
||||
}
|
||||
|
||||
virtual void OnSyncChannel(chanrec* chan, Module* proto, void* opaque)
|
||||
{
|
||||
be->DoSyncChannel(chan, proto, opaque);
|
||||
}
|
||||
|
||||
virtual void OnChannelDelete(chanrec* chan)
|
||||
{
|
||||
be->DoChannelDelete(chan);
|
||||
}
|
||||
|
||||
virtual void OnRehash(const std::string ¶m)
|
||||
{
|
||||
be->DoRehash();
|
||||
}
|
||||
|
||||
virtual Version GetVersion()
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user