#include "inspstring.h"
#include "hashcomp.h"
#include "message.h"
+#include "xline.h"
#ifdef GCC3
#define nspace __gnu_cxx
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;
}
}
+ 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];
this->SendUsers(s);
// Send everything else (channel modes etc)
this->SendChannelModes(s);
+ this->SendXLines(s);
this->WriteLine("ENDBURST");
}
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)
{
return this->ChangeName(prefix,params);
}
+ else if (command == "ADDLINE")
+ {
+ return this->AddLine(prefix,params);
+ }
else if (command == "SQUIT")
{
if (params.size() == 2)
}
}
+ 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())