+ }
+};
+
+class CommandFilter : public Command
+{
+ public:
+ CommandFilter(Module* f)
+ : Command(f, "FILTER", 1, 5)
+ {
+ flags_needed = 'o';
+ this->syntax = "<filter-definition> <action> <flags> [<gline-duration>] :<reason>";
+ }
+ CmdResult Handle(const std::vector<std::string>&, User*);
+
+ RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
+ {
+ return ROUTE_BROADCAST;
+ }
+};
+
+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
+{
+ public:
+ CommandFilter filtcommand;
+ dynamic_reference<RegexFactory> RegexEngine;
+
+ std::vector<ImplFilter> filters;
+ const char *error;
+ int erroffset;
+ int flags;
+
+ std::set<std::string> exemptfromfilter; // List of channel names excluded from filtering.
+
+ ModuleFilter();
+ void init();
+ ModResult OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list);
+ 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);
+ ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list);
+ void OnRehash(User* user);
+ Version GetVersion();
+ std::string EncodeFilter(FilterResult* filter);
+ FilterResult DecodeFilter(const std::string &data);
+ void OnSyncNetwork(Module* proto, void* opaque);
+ void OnDecodeMetaData(Extensible* target, const std::string &extname, const std::string &extdata);
+ ModResult OnStats(char symbol, User* user, string_list &results);
+ ModResult OnPreCommand(std::string &command, std::vector<std::string> ¶meters, LocalUser *user, bool validated, const std::string &original_line);
+ 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->WriteServ("NOTICE %s :*** Removed filter '%s'", user->nick.c_str(), parameters[0].c_str());
+ ServerInstance->SNO->WriteToSnoMask(IS_LOCAL(user) ? 'a' : 'A', "FILTER: "+user->nick+" removed filter '"+parameters[0]+"'");
+ return CMD_SUCCESS;
+ }
+ else