]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/extra/m_filter_pcre.cpp
Whoops, make /stats s work
[user/henk/code/inspircd.git] / src / modules / extra / m_filter_pcre.cpp
index 14b4d6d4a9c9fb94db9234f1fa09d6637daca413..80f5b31014b85813446dee2451765c5ea4d0623e 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)
         {
         }
 };
@@ -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);
@@ -144,6 +149,19 @@ class ModuleFilterPCRE : public FilterBase
                        }
                }
        }
+
+       virtual int OnStats(char symbol, userrec* user, string_list &results)
+       {
+               if (symbol == 's')
+               {
+                       std::string sn = ServerInstance->Config->ServerName;
+                       for (std::vector<PCREFilter>::iterator i = filters.begin(); i != filters.end(); i++)
+                       {
+                               results.push_back(sn+" 223 "+user->nick+" :"+i->freeform+" "+i->action+" "+ConvToStr(i->gline_time)+" :"+i->reason);
+                       }
+               }
+               return 0;
+       }
 };