#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
+#ifdef THREADED_DNS
+#include <pthread.h>
+#endif
#ifndef RUSAGE_SELF
#define RUSAGE_SELF 0
#define RUSAGE_CHILDREN -1
#include "dynamic.h"
#include "wildcard.h"
#include "message.h"
+#include "commands.h"
#include "mode.h"
#include "xline.h"
#include "inspstring.h"
#include "dnsqueue.h"
#include "helperfuncs.h"
#include "hashcomp.h"
+#include "socketengine.h"
-#ifdef USE_KQUEUE
-extern int kq;
-#endif
-
-#ifdef USE_EPOLL
-int ep;
-#endif
+extern SocketEngine* SE;
extern int MODCOUNT;
extern std::vector<Module*> modules;
return;
}
- if (!has_channel(user,Ptr))
+ if ((!has_channel(user,Ptr)) && (!is_uline(user->server)))
{
WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, parameters[0]);
return;
WriteOpers("*** Remote kill by %s: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
snprintf(killreason,MAXBUF,"[%s] Killed (%s (%s))",ServerName,user->nick,parameters[1]);
WriteCommonExcept(u,"QUIT :%s",killreason);
+
+ FOREACH_MOD OnRemoteKill(user,u,killreason);
user_hash::iterator iter = clientlist.find(u->nick);
if (iter != clientlist.end())
u->InviteTo(c->name);
WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name);
WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name);
-
+ FOREACH_MOD OnUserInvite(user,u,c);
}
else
{
{
if (((Ptr) && (!has_channel(user,Ptr))) && (Ptr->binarymodes & CM_SECRET))
{
- WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
+ WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, Ptr->name);
return;
}
if (Ptr->topicset)
return;
}
- strlcpy(Ptr->topic,topic,MAXBUF);
+ strlcpy(Ptr->topic,topic,MAXTOPIC);
strlcpy(Ptr->setby,user->nick,NICKMAX);
Ptr->topicset = TIME;
WriteChannel(Ptr,user,"TOPIC %s :%s",Ptr->name, Ptr->topic);
-
+ if (!strcasecmp(user->server,ServerName))
+ {
+ FOREACH_MOD OnPostLocalTopicChange(user,Ptr,topic);
+ }
}
else
{
{
if (((c) && (!has_channel(user,c))) && (c->binarymodes & CM_SECRET))
{
- WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name);
+ WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, c->name);
return;
}
userlist(user,c);
if (loop_call(handle_privmsg,parameters,pcnt,user,0,pcnt-2,0))
return;
- if (parameters[0][0] == '#')
+ if (parameters[0][0] == '$')
+ {
+ // notice to server mask
+ char* servermask = parameters[0];
+ servermask++;
+ if (match(ServerName,servermask))
+ {
+ ServerPrivmsgAll("%s",parameters[1]);
+ }
+ return;
+ }
+ else if (parameters[0][0] == '#')
{
chan = FindChan(parameters[0]);
if (chan)
}
ChanExceptSender(chan, user, "PRIVMSG %s :%s", chan->name, parameters[1]);
-
+ FOREACH_MOD OnUserMessage(user,chan,TYPE_CHANNEL,parameters[1]);
}
else
{
return;
}
+ log(DEBUG,"*** PRIVMSG HANDLER");
dest = Find(parameters[0]);
if (dest)
{
+ log(DEBUG,"*** FOUND NICK %s",dest->nick);
if (strcmp(dest->awaymsg,""))
{
/* auto respond with aweh msg */
}
parameters[1] = (char*)temp.c_str();
-
-
- if (!strcmp(dest->server,user->server))
+ if (!strcmp(dest->server,ServerName))
{
// direct write, same server
+ log(DEBUG,"*** CALL WRITETO");
WriteTo(user, dest, "PRIVMSG %s :%s", dest->nick, parameters[1]);
}
+
+ FOREACH_MOD OnUserMessage(user,dest,TYPE_USER,parameters[1]);
}
else
{
if (loop_call(handle_notice,parameters,pcnt,user,0,pcnt-2,0))
return;
- if (parameters[0][0] == '#')
+ if (parameters[0][0] == '$')
+ {
+ // notice to server mask
+ char* servermask = parameters[0];
+ servermask++;
+ if (match(ServerName,servermask))
+ {
+ NoticeAll(user, true, "%s",parameters[1]);
+ }
+ return;
+ }
+ else if (parameters[0][0] == '#')
{
chan = FindChan(parameters[0]);
if (chan)
ChanExceptSender(chan, user, "NOTICE %s :%s", chan->name, parameters[1]);
+ FOREACH_MOD OnUserNotice(user,chan,TYPE_CHANNEL,parameters[1]);
}
else
{
}
parameters[1] = (char*)temp.c_str();
- if (!strcmp(dest->server,user->server))
+ if (!strcmp(dest->server,ServerName))
{
// direct write, same server
WriteTo(user, dest, "NOTICE %s :%s", dest->nick, parameters[1]);
}
+
+ FOREACH_MOD OnUserNotice(user,dest,TYPE_USER,parameters[1]);
}
else
{
WriteServ(user->fd,"371 %s : Jazza",user->nick);
WriteServ(user->fd,"371 %s : ",user->nick);
WriteServ(user->fd,"371 %s :Testers: CC",user->nick);
+ WriteServ(user->fd,"371 %s : Om",user->nick);
WriteServ(user->fd,"371 %s : Piggles",user->nick);
WriteServ(user->fd,"371 %s : Foamy",user->nick);
WriteServ(user->fd,"371 %s : Hart",user->nick);
WriteServ(user->fd,"371 %s : Rob",user->nick);
WriteServ(user->fd,"371 %s : angelic",user->nick);
WriteServ(user->fd,"371 %s : Jason",user->nick);
+ WriteServ(user->fd,"371 %s : ThaPrince",user->nick);
WriteServ(user->fd,"371 %s : ",user->nick);
WriteServ(user->fd,"371 %s :Thanks to irc-junkie and searchirc",user->nick);
WriteServ(user->fd,"371 %s :for the nice comments and the help",user->nick);
void handle_whois(char **parameters, int pcnt, userrec *user)
{
userrec *dest;
-
- if (loop_call(handle_whois,parameters,pcnt,user,0,pcnt-1,0))
- return;
+ if (loop_call(handle_whois,parameters,pcnt,user,0,pcnt-1,0))
+ return;
dest = Find(parameters[0]);
if (dest)
{
- // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER
- if (dest->registered == 7)
+ do_whois(user,dest,0,0,parameters[0]);
+ }
+ else
+ {
+ /* no such nick/channel */
+ WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
+ WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
+ }
+}
+
+void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick)
+{
+ // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER
+ if (dest->registered == 7)
+ {
+ WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname);
+ if ((user == dest) || (strchr(user->modes,'o')))
{
- WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname);
- if ((user == dest) || (strchr(user->modes,'o')))
- {
- WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, dest->ip);
- }
- char* cl = chlist(dest,user);
- if (strcmp(cl,""))
- {
- WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl);
- }
- WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str());
- if (strcmp(dest->awaymsg,""))
+ WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, dest->ip);
+ }
+ char* cl = chlist(dest,user);
+ if (*cl)
+ {
+ WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl);
+ }
+ WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str());
+ if (*dest->awaymsg)
+ {
+ WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg);
+ }
+ if (strchr(dest->modes,'o'))
+ {
+ if (*dest->oper)
{
- WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg);
+ WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick, (strchr("aeiou",dest->oper[0]) ? "an" : "a"),dest->oper, Network);
}
- if ((strchr(dest->modes,'o')) && (strcmp(dest->oper,"")))
+ else
{
- WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick,
- (strchr("aeiou",dest->oper[0]) ? "an" : "a"),dest->oper, Network);
+ WriteServ(user->fd,"313 %s %s :is opered but has an unknown type",user->nick, dest->nick);
}
+ }
+ if ((!signon) && (!idle))
+ {
FOREACH_MOD OnWhois(user,dest);
- if (!strcasecmp(user->server,dest->server))
- {
- // idle time and signon line can only be sent if youre on the same server (according to RFC)
- WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon);
- }
-
- WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick);
+ }
+ if (!strcasecmp(user->server,dest->server))
+ {
+ // idle time and signon line can only be sent if youre on the same server (according to RFC)
+ WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon);
}
else
{
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
+ if ((idle) || (signon))
+ WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, idle, signon);
}
+ WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick);
}
else
{
- /* no such nick/channel */
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
+ WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, nick);
+ WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, nick);
}
}
reason[MAXQUIT-1] = '\0';
}
- Write(user->fd,"ERROR :Closing link (%s@%s) [%s%s]",user->ident,user->host,PrefixQuit,parameters[0]);
- WriteOpers("*** Client exiting: %s!%s@%s [%s%s]",user->nick,user->ident,user->host,PrefixQuit,parameters[0]);
- WriteCommonExcept(user,"QUIT :%s%s",PrefixQuit,parameters[0]);
+ /* We should only prefix the quit for a local user. Remote users have
+ * already been prefixed, where neccessary, by the upstream server.
+ */
+ if (!strcasecmp(user->server,ServerName))
+ {
+ Write(user->fd,"ERROR :Closing link (%s@%s) [%s%s]",user->ident,user->host,PrefixQuit,parameters[0]);
+ WriteOpers("*** Client exiting: %s!%s@%s [%s%s]",user->nick,user->ident,user->host,PrefixQuit,parameters[0]);
+ WriteCommonExcept(user,"QUIT :%s%s",PrefixQuit,parameters[0]);
+ }
+ else
+ {
+ WriteOpers("*** Client exiting at %s: %s!%s@%s [%s]",user->server,user->nick,user->ident,user->host,parameters[0]);
+ WriteCommonExcept(user,"QUIT :%s",parameters[0]);
+ }
+ FOREACH_MOD OnUserQuit(user,std::string(PrefixQuit)+std::string(parameters[0]));
}
else
Write(user->fd,"ERROR :Closing link (%s@%s) [QUIT]",user->ident,user->host);
WriteOpers("*** Client exiting: %s!%s@%s [Client exited]",user->nick,user->ident,user->host);
WriteCommonExcept(user,"QUIT :Client exited");
+ FOREACH_MOD OnUserQuit(user,"Client exited");
}
- FOREACH_MOD OnUserQuit(user);
AddWhoWas(user);
}
/* push the socket on a stack of sockets due to be closed at the next opportunity */
if (user->fd > -1)
{
-#ifdef USE_KQUEUE
- struct kevent ke;
- EV_SET(&ke, user->fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
- int i = kevent(kq, &ke, 1, 0, 0, NULL);
- if (i == -1)
- {
- log(DEBUG,"kqueue: Failed to remove user from queue!");
- }
-#endif
-#ifdef USE_EPOLL
- struct epoll_event ev;
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = user->fd;
- int i = epoll_ctl(ep, EPOLL_CTL_DEL, user->fd, &ev);
- if (i < 0)
- {
- log(DEBUG,"epoll: List deletion failure!");
- }
-#endif
+ SE->DelFd(user->fd);
user->CloseSocket();
}
void handle_wallops(char **parameters, int pcnt, userrec *user)
{
WriteWallOps(user,false,"%s",parameters[0]);
+ FOREACH_MOD OnWallops(user,parameters[0]);
}
void handle_list(char **parameters, int pcnt, userrec *user)
void handle_rehash(char **parameters, int pcnt, userrec *user)
{
WriteServ(user->fd,"382 %s %s :Rehashing",user->nick,CleanFilename(CONFIG_FILE));
- ReadConfig(false,user);
- FOREACH_MOD OnRehash();
- WriteOpers("%s is rehashing config file %s",user->nick,CleanFilename(CONFIG_FILE));
+ std::string parameter = "";
+ if (pcnt)
+ {
+ parameter = parameters[0];
+ }
+ else
+ {
+ WriteOpers("%s is rehashing config file %s",user->nick,CleanFilename(CONFIG_FILE));
+ ReadConfig(false,user);
+ }
+ FOREACH_MOD OnRehash(parameter);
}
void handle_lusers(char **parameters, int pcnt, userrec *user)
{
- WriteServ(user->fd,"251 %s :There are %d users and %d invisible on %d servers",user->nick,usercnt()-usercount_invisible(),usercount_invisible(),servercount());
+ // this lusers command shows one server at all times because
+ // a protocol module must override it to show those stats.
+ WriteServ(user->fd,"251 %s :There are %d users and %d invisible on 1 server",user->nick,usercnt()-usercount_invisible(),usercount_invisible());
WriteServ(user->fd,"252 %s %d :operator(s) online",user->nick,usercount_opers());
WriteServ(user->fd,"253 %s %d :unknown connections",user->nick,usercount_unknown());
WriteServ(user->fd,"254 %s %d :channels formed",user->nick,chancount());
- WriteServ(user->fd,"254 %s :I have %d clients and %d servers",user->nick,local_count(),count_servs());
+ WriteServ(user->fd,"254 %s :I have %d clients and 0 servers",user->nick,local_count());
}
void handle_admin(char **parameters, int pcnt, userrec *user)
WriteServ(user->fd,"461 %s USER :Not enough parameters",user->nick);
}
else {
- strcpy(user->ident,"~"); /* we arent checking ident... but these days why bother anyway? */
- strlcat(user->ident,parameters[0],IDENTMAX+1);
+ /* We're not checking ident, but I'm not sure I like the idea of '~' prefixing.. */
+ /* XXX - Should this IDENTMAX + 1 be IDENTMAX - 1? Ok, users.h has it defined as
+ * char ident[IDENTMAX+2]; - WTF?
+ */
+ snprintf(user->ident, IDENTMAX+1, "~%s", parameters[0]);
strlcpy(user->fullname,parameters[3],MAXGECOS);
user->registered = (user->registered | 1);
}
void handle_stats(char **parameters, int pcnt, userrec *user)
{
- char Link_ServerName[MAXBUF],Link_IPAddr[MAXBUF],Link_Port[MAXBUF];
if (pcnt != 1)
{
return;
if (*parameters[0] == 'c')
{
- for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
- {
- ConfValue("link","name",i,Link_ServerName,&config_f);
- ConfValue("link","ipaddr",i,Link_IPAddr,&config_f);
- ConfValue("link","port",i,Link_Port,&config_f);
- WriteServ(user->fd,"213 %s C *@%s * %s %s 0 M",user->nick,Link_IPAddr,Link_ServerName,Link_Port);
- WriteServ(user->fd,"244 %s H * * %s",user->nick,Link_ServerName);
- }
+ /* This stats symbol must be handled by a linking module */
}
if (*parameters[0] == 'i')
if (*parameters[0] == 'U')
{
+ char ulined[MAXBUF];
for (int i = 0; i < ConfValueEnum("uline",&config_f); i++)
{
- ConfValue("uline","server",i,Link_ServerName,&config_f);
- WriteServ(user->fd,"248 %s U %s",user->nick,Link_ServerName);
+ ConfValue("uline","server",i,ulined,&config_f);
+ WriteServ(user->fd,"248 %s U %s",user->nick,ulined);
}
}
void handle_map(char **parameters, int pcnt, userrec *user)
{
- char line[MAXBUF];
- snprintf(line,MAXBUF,"006 %s :%s",user->nick,ServerName);
+ // as with /LUSERS this does nothing without a linking
+ // module to override its behaviour and display something
+ // better.
+ WriteServ(user->fd,"006 %s :%s",user->nick,ServerName);
WriteServ(user->fd,"007 %s :End of /MAP",user->nick);
}
bool is_uline(const char* server)
{
+ char ServName[MAXBUF];
+
if (!server)
return false;
if (!(*server))
return true;
- char ServName[MAXBUF];
+
for (int i = 0; i < ConfValueEnum("uline",&config_f); i++)
{
ConfValue("uline","server",i,ServName,&config_f);
int j;
bool found = false;
bool fail2 = false;
- char global[MAXBUF];
snprintf(TheHost,MAXBUF,"%s@%s",user->ident,user->host);
{
strcat(user->modes,"o");
WriteServ(user->fd,"MODE %s :+o",user->nick);
- FOREACH_MOD OnOper(user);
+ FOREACH_MOD OnOper(user,OperType);
log(DEFAULT,"OPER: %s!%s@%s opered as type: %s",user->nick,user->ident,user->host,OperType);
AddOper(user);
}
user->registered = (user->registered | 2);
// dont attempt to look up the dns until they pick a nick... because otherwise their pointer WILL change
// and unless we're lucky we'll get a duff one later on.
+ //user->dns_done = (!lookup_dns(user->nick));
+ //if (user->dns_done)
+ // log(DEBUG,"Aborting dns lookup of %s because dns server experienced a failure.",user->nick);
+
+#ifdef THREADED_DNS
+ // initialize their dns lookup thread
+ if (pthread_create(&user->dnsthread, NULL, dns_task, (void *)user) != 0)
+ {
+ log(DEBUG,"Failed to create DNS lookup thread for user %s",user->nick);
+ }
+#else
user->dns_done = (!lookup_dns(user->nick));
if (user->dns_done)
log(DEBUG,"Aborting dns lookup of %s because dns server experienced a failure.",user->nick);
+#endif
+
}
if (user->registered == 3)
{
long total = 0;
const char* str_end = str + strlen(str);
n_field[0] = 0;
+
+ if ((!strchr(str,'s')) && (!strchr(str,'m')) && (!strchr(str,'h')) && (!strchr(str,'d')) && (!strchr(str,'w')) && (!strchr(str,'y')))
+ {
+ std::string n = str;
+ n = n + "s";
+ return duration(n.c_str());
+ }
for (char* i = (char*)str; i < str_end; i++)
{
return total;
}
+/* All other ircds when doing this check usually just look for a string of *@* or *. We're smarter than that, though. */
+
+bool host_matches_everyone(std::string mask, userrec* user)
+{
+ char insanemasks[MAXBUF];
+ char buffer[MAXBUF];
+ char itrigger[MAXBUF];
+ ConfValue("insane","hostmasks",0,insanemasks,&config_f);
+ ConfValue("insane","trigger",0,itrigger,&config_f);
+ if (*itrigger == 0)
+ strlcpy(itrigger,"95.5",MAXBUF);
+ if ((*insanemasks == 'y') || (*insanemasks == 't') || (*insanemasks == '1'))
+ return false;
+ long matches = 0;
+ for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++)
+ {
+ strlcpy(buffer,u->second->ident,MAXBUF);
+ strlcat(buffer,"@",MAXBUF);
+ strlcat(buffer,u->second->host,MAXBUF);
+ if (match(buffer,mask.c_str()))
+ matches++;
+ }
+ float percent = ((float)matches / (float)clientlist.size()) * 100;
+ if (percent > (float)atof(itrigger))
+ {
+ WriteOpers("*** \2WARNING\2: %s tried to set a G/K/E line mask of %s, which covers %.2f%% of the network!",user->nick,mask.c_str(),percent);
+ return true;
+ }
+ return false;
+}
+
+bool ip_matches_everyone(std::string ip, userrec* user)
+{
+ char insanemasks[MAXBUF];
+ char itrigger[MAXBUF];
+ ConfValue("insane","ipmasks",0,insanemasks,&config_f);
+ ConfValue("insane","trigger",0,itrigger,&config_f);
+ if (*itrigger == 0)
+ strlcpy(itrigger,"95.5",MAXBUF);
+ if ((*insanemasks == 'y') || (*insanemasks == 't') || (*insanemasks == '1'))
+ return false;
+ long matches = 0;
+ for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++)
+ {
+ if (match(u->second->ip,ip.c_str()))
+ matches++;
+ }
+ float percent = ((float)matches / (float)clientlist.size()) * 100;
+ if (percent > (float)atof(itrigger))
+ {
+ WriteOpers("*** \2WARNING\2: %s tried to set a Z line mask of %s, which covers %.2f%% of the network!",user->nick,ip.c_str(),percent);
+ return true;
+ }
+ return false;
+}
+
+bool nick_matches_everyone(std::string nick, userrec* user)
+{
+ char insanemasks[MAXBUF];
+ char itrigger[MAXBUF];
+ ConfValue("insane","nickmasks",0,insanemasks,&config_f);
+ ConfValue("insane","trigger",0,itrigger,&config_f);
+ if (*itrigger == 0)
+ strlcpy(itrigger,"95.5",MAXBUF);
+ if ((*insanemasks == 'y') || (*insanemasks == 't') || (*insanemasks == '1'))
+ return false;
+ long matches = 0;
+ for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++)
+ {
+ if (match(u->second->nick,nick.c_str()))
+ matches++;
+ }
+ float percent = ((float)matches / (float)clientlist.size()) * 100;
+ if (percent > (float)atof(itrigger))
+ {
+ WriteOpers("*** \2WARNING\2: %s tried to set a Q line mask of %s, which covers %.2f%% of the network!",user->nick,nick.c_str(),percent);
+ return true;
+ }
+ return false;
+}
void handle_kline(char **parameters, int pcnt, userrec *user)
{
if (pcnt >= 3)
{
+ if (host_matches_everyone(parameters[0],user))
+ return;
add_kline(duration(parameters[1]),user->nick,parameters[2],parameters[0]);
+ FOREACH_MOD OnAddKLine(duration(parameters[1]), user, parameters[2], parameters[0]);
if (!duration(parameters[1]))
{
WriteOpers("*** %s added permenant K-line for %s.",user->nick,parameters[0]);
{
if (del_kline(parameters[0]))
{
+ FOREACH_MOD OnDelKLine(user, parameters[0]);
WriteOpers("*** %s Removed K-line on %s.",user->nick,parameters[0]);
}
else
{
if (pcnt >= 3)
{
+ if (host_matches_everyone(parameters[0],user))
+ return;
add_eline(duration(parameters[1]),user->nick,parameters[2],parameters[0]);
+ FOREACH_MOD OnAddELine(duration(parameters[1]), user, parameters[2], parameters[0]);
if (!duration(parameters[1]))
{
WriteOpers("*** %s added permenant E-line for %s.",user->nick,parameters[0]);
{
if (del_eline(parameters[0]))
{
+ FOREACH_MOD OnDelELine(user, parameters[0]);
WriteOpers("*** %s Removed E-line on %s.",user->nick,parameters[0]);
}
else
void handle_gline(char **parameters, int pcnt, userrec *user)
{
- char netdata[MAXBUF];
if (pcnt >= 3)
{
+ if (host_matches_everyone(parameters[0],user))
+ return;
add_gline(duration(parameters[1]),user->nick,parameters[2],parameters[0]);
+ FOREACH_MOD OnAddGLine(duration(parameters[1]), user, parameters[2], parameters[0]);
if (!duration(parameters[1]))
{
WriteOpers("*** %s added permenant G-line for %s.",user->nick,parameters[0]);
{
if (del_gline(parameters[0]))
{
- // . <mask> <who-removed-it>
- snprintf(netdata,MAXBUF,". %s %s",parameters[0],user->nick);
+ FOREACH_MOD OnDelGLine(user, parameters[0]);
WriteOpers("*** %s Removed G-line on %s.",user->nick,parameters[0]);
}
else
{
if (pcnt >= 3)
{
+ if (ip_matches_everyone(parameters[0],user))
+ return;
add_zline(duration(parameters[1]),user->nick,parameters[2],parameters[0]);
+ FOREACH_MOD OnAddZLine(duration(parameters[1]), user, parameters[2], parameters[0]);
if (!duration(parameters[1]))
{
WriteOpers("*** %s added permenant Z-line for %s.",user->nick,parameters[0]);
{
if (del_zline(parameters[0]))
{
+ FOREACH_MOD OnDelZLine(user, parameters[0]);
WriteOpers("*** %s Removed Z-line on %s.",user->nick,parameters[0]);
}
else
{
if (pcnt >= 3)
{
+ if (nick_matches_everyone(parameters[0],user))
+ return;
add_qline(duration(parameters[1]),user->nick,parameters[2],parameters[0]);
+ FOREACH_MOD OnAddQLine(duration(parameters[1]), user, parameters[2], parameters[0]);
if (!duration(parameters[1]))
{
WriteOpers("*** %s added permenant Q-line for %s.",user->nick,parameters[0]);
{
if (del_qline(parameters[0]))
{
+ FOREACH_MOD OnDelQLine(user, parameters[0]);
WriteOpers("*** %s Removed Q-line on %s.",user->nick,parameters[0]);
}
else