]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree.cpp
I hate typos
[user/henk/code/inspircd.git] / src / modules / m_spanningtree.cpp
index 313a5d93cd61016a54ef2b8c5df3911691171266..e3aea5f0480d13fe5d3b255f620ed156b8fb69d5 100644 (file)
@@ -37,6 +37,7 @@ using namespace std;
 #include "inspstring.h"
 #include "hashcomp.h"
 #include "message.h"
+#include "xline.h"
 
 #ifdef GCC3
 #define nspace __gnu_cxx
@@ -73,6 +74,12 @@ bool DoOneToMany(std::string prefix, std::string command, std::deque<std::string
 bool DoOneToAllButSenderRaw(std::string data,std::string omit, std::string prefix,std::string command,std::deque<std::string> params);
 void ReadConfiguration(bool rebind);
 
+extern std::vector<KLine> klines;
+extern std::vector<GLine> glines;
+extern std::vector<ZLine> zlines;
+extern std::vector<QLine> qlines;
+extern std::vector<ELine> elines;
+
 class TreeServer
 {
        TreeServer* Parent;
@@ -790,6 +797,32 @@ class TreeSocket : public InspSocket
                }
        }
 
+       void SendXLines(TreeServer* Current)
+       {
+               char data[MAXBUF];
+               // for zlines and qlines, we should first check if theyre global...
+               for (std::vector<ZLine>::iterator i = zlines.begin(); i != zlines.end(); i++)
+               {
+                       snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason);
+                       this->WriteLine(data);
+               }
+               for (std::vector<QLine>::iterator i = qlines.begin(); i != qlines.end(); i++)
+               {
+                       snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason);
+                       this->WriteLine(data);
+               }
+               for (std::vector<GLine>::iterator i = glines.begin(); i != glines.end(); i++)
+               {
+                       snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason);
+                       this->WriteLine(data);
+               }
+               for (std::vector<ELine>::iterator i = elines.begin(); i != elines.end(); i++)
+               {
+                       snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason);
+                       this->WriteLine(data);
+               }
+       }
+
        void SendChannelModes(TreeServer* Current)
        {
                char data[MAXBUF];
@@ -848,6 +881,7 @@ class TreeSocket : public InspSocket
                this->SendUsers(s);
                // Send everything else (channel modes etc)
                this->SendChannelModes(s);
+               this->SendXLines(s);
                this->WriteLine("ENDBURST");
        }
 
@@ -992,6 +1026,45 @@ class TreeSocket : public InspSocket
                return true;
        }
 
+       bool AddLine(std::string prefix, std::deque<std::string> params)
+       {
+               if (params.size() < 6)
+                       return true;
+               std::string linetype = params[0]; /* Z, Q, E, G, K */
+               std::string mask = params[1]; /* Line type dependent */
+               std::string source = params[2]; /* may not be online or may be a server */
+               std::string settime = params[3]; /* EPOCH time set */
+               std::string duration = params[4]; /* Duration secs */
+               std::string reason = params[5];
+
+               switch (*(linetype.c_str()))
+               {
+                       case 'Z':
+                               add_zline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str());
+                       break;
+                       case 'Q':
+                               add_qline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str());
+                       break;
+                       case 'E':
+                               add_eline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str());
+                       break;
+                       case 'G':
+                               add_gline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str());
+                       break;
+                       case 'K':
+                               add_kline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str());
+                       break;
+                       default:
+                               /* Just in case... */
+                               Srv->SendOpers("*** \2WARNING\2: Invalid xline type '"+linetype+"' sent by server "+prefix+", ignored!");
+                       break;
+               }
+               /* Send it on its way */
+               params[5] = ":" + params[5];
+               DoOneToAllButSender(prefix,"ADDLINE",params,prefix);
+               return true;
+       }
+
        bool ChangeName(std::string prefix, std::deque<std::string> params)
        {
                if (params.size() < 1)
@@ -1330,6 +1403,10 @@ class TreeSocket : public InspSocket
                                {
                                        return this->ChangeName(prefix,params);
                                }
+                               else if (command == "ADDLINE")
+                               {
+                                       return this->AddLine(prefix,params);
+                               }
                                else if (command == "SQUIT")
                                {
                                        if (params.size() == 2)
@@ -2211,6 +2288,72 @@ class ModuleSpanningTree : public Module
                }
        }
 
+       void OnLine(userrec* source, std::string host, bool adding, char linetype, long duration, std::string reason)
+       {
+               if (std::string(source->server) == Srv->GetServerName())
+               {
+                       char type[8];
+                       snprintf(type,8,"%cLINE",linetype);
+                       std::string stype = type;
+                       if (adding)
+                       {
+                               char sduration[MAXBUF];
+                               snprintf(sduration,MAXBUF,"%ld",duration);
+                               std::deque<std::string> params;
+                               params.push_back(host);
+                               params.push_back(sduration);
+                               params.push_back(":"+reason);
+                               DoOneToMany(source->nick,stype,params);
+                       }
+                       else
+                       {
+                               std::deque<std::string> params;
+                               params.push_back(host);
+                               DoOneToMany(source->nick,stype,params);
+                       }
+               }
+       }
+
+       virtual void OnAddGLine(long duration, userrec* source, std::string reason, std::string hostmask)
+       {
+               OnLine(source,hostmask,true,'G',duration,reason);
+       }
+       
+       virtual void OnAddZLine(long duration, userrec* source, std::string reason, std::string ipmask)
+       {
+               OnLine(source,ipmask,true,'Z',duration,reason);
+       }
+
+       virtual void OnAddQLine(long duration, userrec* source, std::string reason, std::string nickmask)
+       {
+               OnLine(source,nickmask,true,'Q',duration,reason);
+       }
+
+       virtual void OnAddELine(long duration, userrec* source, std::string reason, std::string hostmask)
+       {
+               OnLine(source,hostmask,true,'E',duration,reason);
+       }
+
+       virtual void OnDelGLine(userrec* source, std::string hostmask)
+       {
+               OnLine(source,hostmask,false,'G',0,"");
+       }
+
+       virtual void OnDelZLine(userrec* source, std::string ipmask)
+       {
+               OnLine(source,ipmask,false,'Z',0,"");
+       }
+
+       virtual void OnDelQLine(userrec* source, std::string nickmask)
+       {
+               OnLine(source,nickmask,false,'Q',0,"");
+       }
+
+       virtual void OnDelELine(userrec* source, std::string hostmask)
+       {
+               OnLine(source,hostmask,false,'E',0,"");
+       }
+
        virtual void OnMode(userrec* user, void* dest, int target_type, std::string text)
        {
                if (std::string(user->server) == Srv->GetServerName())