+ switch (fa)
+ {
+ case FA_GLINE: return "gline";
+ case FA_BLOCK: return "block";
+ case FA_SILENT: return "silent";
+ case FA_KILL: return "kill";
+ default: return "none";
+ }
+}
+
+void ModuleFilter::ReadFilters()
+{
+ ConfigTagList tags = ServerInstance->Config->ConfTags("keyword");
+ for (ConfigIter i = tags.first; i != tags.second; ++i)
+ {
+ std::string pattern = i->second->getString("pattern");
+ this->DeleteFilter(pattern);
+
+ std::string reason = i->second->getString("reason");
+ std::string action = i->second->getString("action");
+ std::string flgs = i->second->getString("flags");
+ long gline_time = ServerInstance->Duration(i->second->getString("duration"));
+ if (flgs.empty())
+ flgs = "*";
+
+ FilterAction fa;
+ if (!StringToFilterAction(action, fa))
+ fa = FA_NONE;
+
+ try
+ {
+ filters.push_back(ImplFilter(this, reason, fa, gline_time, pattern, flgs));
+ ServerInstance->Logs->Log("m_filter", DEFAULT, "Regular expression %s loaded.", pattern.c_str());
+ }
+ catch (ModuleException &e)
+ {
+ ServerInstance->Logs->Log("m_filter", DEFAULT, "Error in regular expression '%s': %s", pattern.c_str(), e.GetReason());
+ }
+ }
+}
+
+ModResult ModuleFilter::OnStats(char symbol, User* user, string_list &results)
+{
+ if (symbol == 's')
+ {
+ for (std::vector<ImplFilter>::iterator i = filters.begin(); i != filters.end(); i++)
+ {
+ results.push_back(ServerInstance->Config->ServerName+" 223 "+user->nick+" :"+RegexEngine.GetProvider()+":"+i->freeform+" "+i->GetFlags()+" "+FilterActionToString(i->action)+" "+ConvToStr(i->gline_time)+" :"+i->reason);
+ }
+ for (std::set<std::string>::iterator i = exemptfromfilter.begin(); i != exemptfromfilter.end(); ++i)
+ {
+ results.push_back(ServerInstance->Config->ServerName+" 223 "+user->nick+" :EXEMPT "+(*i));
+ }
+ }
+ return MOD_RES_PASSTHRU;
+}
+
+void ModuleFilter::OnUnloadModule(Module* mod)
+{
+ // If the regex engine became unavailable or has changed, remove all filters
+ if (!RegexEngine)
+ {
+ FreeFilters();
+ }
+ else if (RegexEngine.operator->() != factory)
+ {
+ factory = RegexEngine.operator->();
+ FreeFilters();
+ }