]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/extra/m_filter_pcre.cpp
Whoops, properly handle rehash now that new filters might be added by /FILTER
[user/henk/code/inspircd.git] / src / modules / extra / m_filter_pcre.cpp
index 8d50193af2c5184863d2364141e79f99aa277b87..a7829871f18569416a587c36cb733dce6de2d1ae 100644 (file)
@@ -36,10 +36,9 @@ class PCREFilter : public FilterResult
 {
  public:
         pcre* regexp;
-        std::string pattern;
 
         PCREFilter(pcre* r, const std::string &rea, const std::string &act, long gline_time, const std::string &pat)
-                : FilterResult::FilterResult(rea, act, gline_time), regexp(r), pattern(pat)
+                : FilterResult::FilterResult(pat, rea, act, gline_time), regexp(r)
         {
         }
 };
@@ -53,7 +52,7 @@ class ModuleFilterPCRE : public FilterBase
 
  public:
        ModuleFilterPCRE(InspIRCd* Me)
-       : FilterBase::FilterBase(Me)
+       : FilterBase::FilterBase(Me, "m_filter_pcre.so")
        {
                OnRehash("");
        }
@@ -80,8 +79,9 @@ class ModuleFilterPCRE : public FilterBase
        {
                for (std::vector<PCREFilter>::iterator i = filters.begin(); i != filters.end(); i++)
                {
-                       if (i->pattern == freeform)
+                       if (i->freeform == freeform)
                        {
+                               pcre_free((*i).regexp);
                                filters.erase(i);
                                return true;
                        }
@@ -89,11 +89,19 @@ class ModuleFilterPCRE : public FilterBase
                return false;
        }
 
+       virtual void SyncFilters(Module* proto, void* opaque)
+       {
+               for (std::vector<PCREFilter>::iterator i = filters.begin(); i != filters.end(); i++)
+               {
+                       this->SendFilter(proto, opaque, &(*i));
+               }
+       }
+
        virtual std::pair<bool, std::string> AddFilter(const std::string &freeform, const std::string &type, const std::string &reason, long duration)
        {
                for (std::vector<PCREFilter>::iterator i = filters.begin(); i != filters.end(); i++)
                {
-                       if (i->pattern == freeform)
+                       if (i->freeform == freeform)
                        {
                                return std::make_pair(false, "Filter already exists");
                        }
@@ -118,13 +126,10 @@ class ModuleFilterPCRE : public FilterBase
        {               
                ConfigReader MyConf(ServerInstance);
 
-               for (std::vector<PCREFilter>::iterator i = filters.begin(); i != filters.end(); i++)
-                       pcre_free((*i).regexp);
-
-               filters.clear();
-
                for (int index = 0; index < MyConf.Enumerate("keyword"); index++)
                {
+                       this->DeleteFilter(MyConf.ReadValue("keyword", "pattern", index));
+
                        std::string pattern = MyConf.ReadValue("keyword", "pattern", index);
                        std::string reason = MyConf.ReadValue("keyword", "reason", index);
                        std::string action = MyConf.ReadValue("keyword", "action", index);