]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Fixed bug #85
[user/henk/code/inspircd.git] / src / mode.cpp
index 011fe513d99abbb5baa81cfc8356a483f5602424..e9b6861c0dcf250786eb975d3eca9a6d78311649 100644 (file)
@@ -35,7 +35,6 @@ using namespace std;
 #include <deque>
 #include "connection.h"
 #include "users.h"
-#include "servers.h"
 #include "ctables.h"
 #include "globals.h"
 #include "modules.h"
@@ -1141,6 +1140,7 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
                {
                        log(DEBUG,"Local mode change");
                        WriteChannelLocal(chan, user, "MODE %s %s",chan->name,outstr);
+                       FOREACH_MOD OnMode(user, chan, TYPE_CHANNEL, outstr);
                }
                else
                {
@@ -1149,10 +1149,6 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
                                if (!silent)
                                {
                                        WriteChannelWithServ(ServerName,chan,"MODE %s %s",chan->name,outstr);
-                                       // M token for a usermode must go to all servers
-                                       char buffer[MAXBUF];
-                                       snprintf(buffer,MAXBUF,"M %s %s",chan->name, outstr);
-                                       NetSendToAll(buffer);
                                }
                                        
                        }
@@ -1161,10 +1157,7 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
                                if (!silent)
                                {
                                        WriteChannel(chan,user,"MODE %s %s",chan->name,outstr);
-                                       // M token for a usermode must go to all servers
-                                       char buffer[MAXBUF];
-                                       snprintf(buffer,MAXBUF,"m %s %s %s",user->nick,chan->name, outstr);
-                                       NetSendToAll(buffer);
+                                       FOREACH_MOD OnMode(user, chan, TYPE_CHANNEL, outstr);
                                }
                        }
                }
@@ -1301,7 +1294,7 @@ void handle_mode(char **parameters, int pcnt, userrec *user)
                can_change = 0;
                if (user != dest)
                {
-                       if (strchr(user->modes,'o'))
+                       if ((strchr(user->modes,'o')) || (is_uline(user->server)))
                        {
                                can_change = 1;
                        }
@@ -1468,10 +1461,7 @@ void handle_mode(char **parameters, int pcnt, userrec *user)
                        if (strcmp(b,""))
                        {
                                WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
-                               // M token for a usermode must go to all servers
-                               char buffer[MAXBUF];
-                               snprintf(buffer,MAXBUF,"m %s %s %s",user->nick, dest->nick, b);
-                               NetSendToAll(buffer);
+                               FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
                        }
 
                        if (strlen(dmodes)>MAXMODES)
@@ -1527,7 +1517,7 @@ void handle_mode(char **parameters, int pcnt, userrec *user)
                        }
                }
 
-                if ((Ptr) && (!has_channel(user,Ptr)))
+                if (((Ptr) && (!has_channel(user,Ptr))) && (!is_uline(user->server)))
                 {
                         WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
                         return;
@@ -1725,10 +1715,7 @@ void server_mode(char **parameters, int pcnt, userrec *user)
                        if (strcmp(b,""))
                        {
                                WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
-                               // M token for a usermode must go to all servers
-                               char buffer[MAXBUF];
-                               snprintf(buffer,MAXBUF,"m %s %s %s",user->nick, dest->nick, b);
-                               NetSendToAll(buffer);
+                               FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
                        }
                        
                        if (strlen(dmodes)>MAXMODES)
@@ -2115,7 +2102,7 @@ void merge_mode2(char **parameters, int pcnt, userrec* user)
                         if (strcmp(b,""))
                         {
                                WriteTo(user,dest,"MODE %s :%s",dest->nick,b);
-                               log(DEBUG,"Sent: :%s MODE %s",user->nick,b);
+                               FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
                        }
 
                        if (strlen(dmodes)>MAXMODES)