+
+ int FillFlags(const std::string &fl)
+ {
+ flags = fl;
+ flag_no_opers = flag_part_message = flag_quit_message = flag_privmsg = flag_notice = false;
+ size_t x = 0;
+
+ for (std::string::const_iterator n = flags.begin(); n != flags.end(); ++n, ++x)
+ {
+ switch (*n)
+ {
+ case 'o':
+ flag_no_opers = true;
+ break;
+ case 'P':
+ flag_part_message = true;
+ break;
+ case 'q':
+ flag_quit_message = true;
+ break;
+ case 'p':
+ flag_privmsg = true;
+ break;
+ case 'n':
+ flag_notice = true;
+ break;
+ case '*':
+ flag_no_opers = flag_part_message = flag_quit_message =
+ flag_privmsg = flag_notice = true;
+ break;
+ default:
+ return x;
+ break;
+ }
+ }
+ return 0;
+ }
+
+ FilterResult()
+ {
+ }
+
+ virtual ~FilterResult()
+ {
+ }
+};
+
+class CommandFilter;
+
+class FilterBase : public Module
+{
+ CommandFilter* filtcommand;
+ int flags;
+protected:
+ std::vector<std::string> exemptfromfilter; // List of channel names excluded from filtering.
+ public:
+ FilterBase(InspIRCd* Me, const std::string &source);
+ virtual ~FilterBase();
+ virtual int OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list);
+ virtual FilterResult* FilterMatch(User* user, const std::string &text, int flags) = 0;
+ virtual bool DeleteFilter(const std::string &freeform) = 0;
+ virtual void SyncFilters(Module* proto, void* opaque) = 0;
+ virtual void SendFilter(Module* proto, void* opaque, FilterResult* iter);
+ virtual std::pair<bool, std::string> AddFilter(const std::string &freeform, const std::string &type, const std::string &reason, long duration, const std::string &flags) = 0;
+ virtual int OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list);
+ virtual void OnRehash(User* user, const std::string ¶meter);
+ virtual Version GetVersion();
+ std::string EncodeFilter(FilterResult* filter);
+ FilterResult DecodeFilter(const std::string &data);
+ virtual void OnSyncOtherMetaData(Module* proto, void* opaque, bool displayable = false);
+ virtual void OnDecodeMetaData(int target_type, void* target, const std::string &extname, const std::string &extdata);
+ virtual int OnStats(char symbol, User* user, string_list &results) = 0;
+ virtual int OnPreCommand(std::string &command, std::vector<std::string> ¶meters, User *user, bool validated, const std::string &original_line);
+ bool AppliesToMe(User* user, FilterResult* filter, int flags);
+ void OnLoadModule(Module* mod, const std::string& name);
+ virtual void ReadFilters(ConfigReader &MyConf) = 0;
+};
+
+class CommandFilter : public Command
+{
+ FilterBase* Base;
+ public:
+ CommandFilter(FilterBase* f, InspIRCd* Me, const std::string &ssource) : Command(Me, "FILTER", "o", 1, 5), Base(f)