+class ImplFilter : public FilterResult
+{
+ public:
+ Regex* regex;
+
+ ImplFilter(ModuleFilter* mymodule, const std::string &rea, FilterAction act, long glinetime, const std::string &pat, const std::string &flgs);
+};
+
+
+class ModuleFilter : public Module
+{
+ bool initing;
+ RegexFactory* factory;
+ void FreeFilters();
+
+ public:
+ CommandFilter filtcommand;
+ dynamic_reference<RegexFactory> RegexEngine;
+
+ std::vector<ImplFilter> filters;
+ int flags;
+
+ std::set<std::string> exemptfromfilter; // List of channel names excluded from filtering.
+
+ ModuleFilter();
+ void init() CXX11_OVERRIDE;
+ CullResult cull();
+ ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE;
+ FilterResult* FilterMatch(User* user, const std::string &text, int flags);
+ bool DeleteFilter(const std::string &freeform);
+ std::pair<bool, std::string> AddFilter(const std::string &freeform, FilterAction type, const std::string &reason, long duration, const std::string &flags);
+ void OnRehash(User* user) CXX11_OVERRIDE;
+ Version GetVersion() CXX11_OVERRIDE;
+ std::string EncodeFilter(FilterResult* filter);
+ FilterResult DecodeFilter(const std::string &data);
+ void OnSyncNetwork(Module* proto, void* opaque) CXX11_OVERRIDE;
+ void OnDecodeMetaData(Extensible* target, const std::string &extname, const std::string &extdata) CXX11_OVERRIDE;
+ ModResult OnStats(char symbol, User* user, string_list &results) CXX11_OVERRIDE;
+ ModResult OnPreCommand(std::string &command, std::vector<std::string> ¶meters, LocalUser *user, bool validated, const std::string &original_line) CXX11_OVERRIDE;
+ void OnUnloadModule(Module* mod) CXX11_OVERRIDE;
+ bool AppliesToMe(User* user, FilterResult* filter, int flags);
+ void ReadFilters();
+ static bool StringToFilterAction(const std::string& str, FilterAction& fa);
+ static std::string FilterActionToString(FilterAction fa);
+};
+
+CmdResult CommandFilter::Handle(const std::vector<std::string> ¶meters, User *user)
+{
+ if (parameters.size() == 1)
+ {
+ /* Deleting a filter */
+ Module *me = creator;
+ if (static_cast<ModuleFilter *>(me)->DeleteFilter(parameters[0]))
+ {
+ user->WriteNotice("*** Removed filter '" + parameters[0] + "'");
+ ServerInstance->SNO->WriteToSnoMask(IS_LOCAL(user) ? 'a' : 'A', "FILTER: "+user->nick+" removed filter '"+parameters[0]+"'");
+ return CMD_SUCCESS;
+ }
+ else
+ {
+ user->WriteNotice("*** Filter '" + parameters[0] + "' not found in list, try /stats s.");
+ return CMD_FAILURE;
+ }
+ }
+ else