]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands.cpp
Fixed some flood checking
[user/henk/code/inspircd.git] / src / commands.cpp
index ba14a452edaf4ccdbfd20321f738b3912bc08631..610b694bc31a8d033b491d4e1c73d3d5f6029ddc 100644 (file)
@@ -1292,6 +1292,7 @@ void handle_modules(char **parameters, int pcnt, userrec *user)
                        WriteServ(user->fd,"900 %s :%s",user->nick,CleanFilename(modulename));
                }
        }
+       WriteServ(user->fd,"901 %s :End of MODULES list",user->nick);
 }
 
 void handle_stats(char **parameters, int pcnt, userrec *user)
@@ -1538,38 +1539,53 @@ void handle_squit(char **parameters, int pcnt, userrec *user)
        }
        else
        {
+               if (!strcasecmp("*",parameters[0]))
+               {
+                       WriteServ(user->fd,"NOTICE %s :*** You cannot issue an SQUIT this wide! If this is REALLY what you want, use a less wide mask.",user->nick);
+                       WriteOpers("*** WARNING! %s tried to SQUIT all servers at once!",user->nick);
+                       return;
+               }
                if (!strcasecmp(ServerName,parameters[0]))
                {
                        WriteServ(user->fd,"NOTICE %s :*** To take the local server out of the mesh, just use /SQUIT with no parameters instead.",user->nick);
                        return;
                }
-               bool have_this_server = false;
-                for (int j = 0; j < 32; j++)
-                {
-                        if (me[j] != NULL)
-                        {
-                                for (int x = 0; x < me[j]->connectors.size(); x++)
-                                {
-                                        if (!strcasecmp(me[j]->connectors[x].GetServerName().c_str(),parameters[0]))
-                                        {
-                                                // found a valid ircd_connector.
-                                               have_this_server = true;
-                                                return;
-                                        }
-                                }
-                        }
-                }
-               if (have_this_server)
-               {
-                       WriteOpers("SQUIT command issued by %s to remove %s from the mesh",user->nick,parameters[0]);
-                       char buffer[MAXBUF];
-                       snprintf(buffer,MAXBUF,"& %s",parameters[0]);
-                       NetSendToAll(buffer);
-                       DoSplit(parameters[0]);
+               bool have_this_server = true;
+               int n_count = 0;
+               std::string server_to_squit = "";
+               while (have_this_server)
+               {
+                       have_this_server = false;
+                       for (int j = 0; j < 32; j++)
+                       {
+                               if (me[j] != NULL)
+                               {
+                                       for (int x = 0; x < me[j]->connectors.size(); x++)
+                                       {
+                                               if (match(me[j]->connectors[x].GetServerName().c_str(),parameters[0]))
+                                               {
+                                                       // found a valid ircd_connector.
+                                                       have_this_server = true;
+                                                       server_to_squit = me[j]->connectors[x].GetServerName().c_str();
+                                                       break;
+                                               }
+                                       }
+                                       }
+                               }
+                       if (have_this_server)
+                       {
+                               WriteOpers("SQUIT command issued by %s to remove %s from the mesh",user->nick,server_to_squit.c_str());
+                               WriteServ(user->fd,"NOTICE %s :*** Removing remote server %s.",user->nick,server_to_squit.c_str());
+                               char buffer[MAXBUF];
+                               snprintf(buffer,MAXBUF,"& %s",server_to_squit.c_str());
+                               NetSendToAll(buffer);
+                               DoSplit(server_to_squit.c_str());
+                               n_count++;
+                       }
                }
-               else
+               if (!n_count)
                {
-                       WriteServ(user->fd,"NOTICE %s :*** No such server exists in the mesh.",user->nick);
+                       WriteServ(user->fd,"402 %s %s :Your pattern did not match any servers.",user->nick,parameters[0]);
                }
        }
 }
@@ -1829,6 +1845,13 @@ void handle_nick(char **parameters, int pcnt, userrec *user)
 }
 
 
+void handle_v(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host)
+{
+       char* servername = strtok(params," ");
+       char* versionstr = strtok(NULL,"\r\n");
+       ircd_connector* cn = reply->FindHost(servername);
+       cn->SetVersionString(versionstr);
+}
 
 void handle_V(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host)
 {
@@ -1840,18 +1863,25 @@ void handle_V(char token,char* params,serverrec* source,serverrec* reply, char*
        userrec* user = Find(src);
        if (user)
        {
-               userrec* dst = Find(dest);
-               
-               if (dst)
+               // notice all - only issuable by a server
+               if (strcmp(dest,"*"))
                {
-                       WriteTo(user, dst, "NOTICE %s :%s", dst->nick, text);
+                       NoticeAll(user,true,"%s",text);
                }
                else
                {
-                       chanrec* d = FindChan(dest);
-                       if (d)
+                       userrec* dst = Find(dest);      
+                       if (dst)
                        {
-                               ChanExceptSender(d, user, "NOTICE %s :%s", d->name, text);
+                               WriteTo(user, dst, "NOTICE %s :%s", dst->nick, text);
+                       }
+                       else
+                       {
+                               chanrec* d = FindChan(dest);
+                               if (d)
+                               {
+                                       ChanExceptSender(d, user, "NOTICE %s :%s", d->name, text);
+                               }
                        }
                }
        }
@@ -2053,7 +2083,7 @@ void handle_K(char token,char* params,serverrec* source,serverrec* reply, char*
        {
                WriteTo(user, u, "KILL %s :%s!%s!%s!%s (%s)", u->nick, source->name, ServerName, user->dhost,user->nick,reason);
                WriteOpers("*** Remote kill from %s by %s: %s!%s@%s (%s)",source->name,user->nick,u->nick,u->ident,u->host,reason);
-               snprintf(kreason,MAXBUF,"[%s] Killed (%s (%s))",source->name,user->nick,reason);
+               snprintf(kreason,MAXBUF,"[%s] Killed (From: '%s' (%s))",source->name,user->nick,reason);
                kill_link(u,kreason);
        }
 }
@@ -2721,6 +2751,10 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve
                case 'V':
                        handle_V(token,params,source,reply,tcp_host);
                break;
+               // v <servername> <arbitary version string>
+               case 'v':
+                       handle_v(token,params,source,reply,tcp_host);
+               break;
                // L <SOURCE> <CHANNEL> :<REASON>
                // User parting a channel
                case 'L':