Tidyup of m_filter

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3446 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2006-03-04 17:29:05 +00:00
parent 63f5e1e205
commit d1fad914b1
3 changed files with 43 additions and 26 deletions

View File

@ -859,6 +859,7 @@ ConfigReader::ConfigReader()
this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out); this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out);
this->errorlog = new std::stringstream(std::stringstream::in | std::stringstream::out); this->errorlog = new std::stringstream(std::stringstream::in | std::stringstream::out);
this->readerror = Config->LoadConf(CONFIG_FILE,this->cache,this->errorlog); this->readerror = Config->LoadConf(CONFIG_FILE,this->cache,this->errorlog);
tags.clear();
if (!this->readerror) if (!this->readerror)
this->error = CONF_FILE_NOT_FOUND; this->error = CONF_FILE_NOT_FOUND;
} }
@ -879,6 +880,7 @@ ConfigReader::ConfigReader(std::string filename)
this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out); this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out);
this->errorlog = new std::stringstream(std::stringstream::in | std::stringstream::out); this->errorlog = new std::stringstream(std::stringstream::in | std::stringstream::out);
this->readerror = Config->LoadConf(filename.c_str(),this->cache,this->errorlog); this->readerror = Config->LoadConf(filename.c_str(),this->cache,this->errorlog);
tags.clear();
if (!this->readerror) if (!this->readerror)
this->error = CONF_FILE_NOT_FOUND; this->error = CONF_FILE_NOT_FOUND;
}; };

View File

@ -29,6 +29,14 @@ using namespace std;
/* $ModDesc: An enhanced version of the unreal m_filter.so used by chatspike.net */ /* $ModDesc: An enhanced version of the unreal m_filter.so used by chatspike.net */
class Filter
{
std::string reason;
std::string action;
};
typedef std::map<std::string,Filter*> filter_t;
class FilterException : public ModuleException class FilterException : public ModuleException
{ {
public: public:
@ -42,6 +50,7 @@ class ModuleFilter : public Module
{ {
Server *Srv; Server *Srv;
ConfigReader *Conf, *MyConf; ConfigReader *Conf, *MyConf;
filter_t* filters;
public: public:
ModuleFilter(Server* Me) ModuleFilter(Server* Me)
@ -53,14 +62,7 @@ class ModuleFilter : public Module
// of the main config... but rather messy. That's why the capability // of the main config... but rather messy. That's why the capability
// of using a seperate config file is provided. // of using a seperate config file is provided.
Srv = Me; Srv = Me;
Conf = new ConfigReader; OnRehash("");
std::string filterfile = Conf->ReadValue("filter","file",0);
MyConf = new ConfigReader(filterfile);
if ((filterfile == "") || (!MyConf->Verify()))
{
FilterException e;
throw(e);
}
Srv->Log(DEFAULT,std::string("m_filter: read configuration from ")+filterfile); Srv->Log(DEFAULT,std::string("m_filter: read configuration from ")+filterfile);
} }
@ -85,17 +87,12 @@ class ModuleFilter : public Module
virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status) virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status)
{ {
std::string text2 = text+" "; std::string text2 = text+" ";
for (int index = 0; index < MyConf->Enumerate("keyword"); index++) for (filter_t::iterator index = filters.begin(); index != filters.end(); index++)
{ {
std::string pattern = MyConf->ReadValue("keyword","pattern",index); if ((Srv->MatchText(text2,index->first)) || (Srv->MatchText(text,index->first)))
if ((Srv->MatchText(text2,pattern)) || (Srv->MatchText(text,pattern)))
{ {
Filter* f = (Filter*)*x->second;
std::string target = ""; std::string target = "";
std::string reason = MyConf->ReadValue("keyword","reason",index);
std::string do_action = MyConf->ReadValue("keyword","action",index);
if (do_action == "")
do_action = "none";
if (target_type == TYPE_USER) if (target_type == TYPE_USER)
{ {
@ -107,21 +104,22 @@ class ModuleFilter : public Module
chanrec* t = (chanrec*)dest; chanrec* t = (chanrec*)dest;
target = std::string(t->name); target = std::string(t->name);
} }
if (do_action == "block")
if (f->action == "block")
{ {
Srv->SendOpers(std::string("FILTER: ")+std::string(user->nick)+ Srv->SendOpers(std::string("FILTER: ")+std::string(user->nick)+
std::string(" had their notice filtered, target was ")+ std::string(" had their notice filtered, target was ")+
target+": "+reason); target+": "+f->reason);
Srv->SendTo(NULL,user,"NOTICE "+std::string(user->nick)+ Srv->SendTo(NULL,user,"NOTICE "+std::string(user->nick)+
" :Your notice has been filtered and opers notified: "+reason); " :Your notice has been filtered and opers notified: "+f->reason);
} }
Srv->Log(DEFAULT,std::string("FILTER: ")+std::string(user->nick)+ Srv->Log(DEFAULT,std::string("FILTER: ")+std::string(user->nick)+
std::string(" had their notice filtered, target was ")+ std::string(" had their notice filtered, target was ")+
target+": "+reason+" Action: "+do_action); target+": "+f->reason+" Action: "+f->action);
if (do_action == "kill") if (f->action == "kill")
{ {
Srv->QuitUser(user,reason); Srv->QuitUser(user,f->reason);
} }
return 1; return 1;
} }
@ -133,8 +131,6 @@ class ModuleFilter : public Module
{ {
// reload our config file on rehash - we must destroy and re-allocate the classes // reload our config file on rehash - we must destroy and re-allocate the classes
// to call the constructor again and re-read our data. // to call the constructor again and re-read our data.
delete Conf;
delete MyConf;
Conf = new ConfigReader; Conf = new ConfigReader;
std::string filterfile = Conf->ReadValue("filter","file",0); std::string filterfile = Conf->ReadValue("filter","file",0);
// this automatically re-reads the configuration file into the class // this automatically re-reads the configuration file into the class
@ -145,13 +141,32 @@ class ModuleFilter : public Module
FilterException e; FilterException e;
throw(e); throw(e);
} }
for (filter_t::iterator n = filters.begin(); n != filters.end(); n++)
{
delete n->second;
}
filters.clear();
for (int index = 0; index < MyConf->Enumerate("keyword"); index++)
{
std::string pattern = MyConf->ReadValue("keyword","pattern",index);
std::string reason = MyConf->ReadValue("keyword","reason",index);
std::string do_action = MyConf->ReadValue("keyword","action",index);
if (do_action == "")
do_action = "none";
Filter* x = new Filter;
x->reason = reason;
x->action = do_action;
filters[pattern] = x;
}
Srv->Log(DEFAULT,std::string("m_filter: read configuration from ")+filterfile); Srv->Log(DEFAULT,std::string("m_filter: read configuration from ")+filterfile);
delete Conf;
delete MyConf;
} }
virtual Version GetVersion() virtual Version GetVersion()
{ {
// This is version 2 because version 1.x is the unreleased unrealircd module // This is version 2 because version 1.x is the unreleased unrealircd module
return Version(2,0,0,1,VF_VENDOR); return Version(2,0,0,2,VF_VENDOR);
} }
}; };

View File

@ -1 +1 @@
echo 3443 echo 3445