]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Added support for 472 numeric (Unknown mode char) - typobox43
[user/henk/code/inspircd.git] / src / mode.cpp
index 4a7c56bd3733a7a889b641f93dc35bc2f317ae54..604111e6f8c179ffeb8a7d9254383871f91ef88a 100644 (file)
@@ -1,3 +1,19 @@
+/*       +------------------------------------+
+ *       | Inspire Internet Relay Chat Daemon |
+ *       +------------------------------------+
+ *
+ *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ *                       E-mail:
+ *                <brain@chatspike.net>
+ *               <Craig@chatspike.net>
+ *     
+ * Written by Craig Edwards, Craig McLure, and others.
+ * This program is free but copyrighted software; see
+ *            the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
 #include "inspircd.h"
 #include "inspircd_io.h"
 #include "inspircd_util.h"
@@ -40,6 +56,8 @@ using namespace std;
 extern int MODCOUNT;
 extern vector<Module*> modules;
 extern vector<ircd_module*> factory;
+extern std::vector<std::string> module_names;
+
 
 extern int LogLevel;
 extern char ServerName[MAXBUF];
@@ -797,7 +815,7 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
                                break;
                                
                                default:
-                                       log(DEBUG,"Preprocessing custom mode %c",modechar);
+                                       log(DEBUG,"Preprocessing custom mode %c: modelist: %s",modechar,chan->custom_modes);
                                        string_list p;
                                        p.clear();
                                        if (((!strchr(chan->custom_modes,modechar)) && (!mdir)) || ((strchr(chan->custom_modes,modechar)) && (mdir)))
@@ -825,10 +843,10 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
                                                bool handled = false;
                                                if (param>=pcnt)
                                                {
-                                                       log(DEBUG,"Not enough parameters for module-mode %c",modechar);
                                                        // we're supposed to have a parameter, but none was given... so dont handle the mode.
                                                        if (((ModeDefinedOn(modechar,MT_CHANNEL)>0) && (mdir)) || ((ModeDefinedOff(modechar,MT_CHANNEL)>0) && (!mdir))) 
                                                        {
+                                                               log(DEBUG,"Not enough parameters for module-mode %c",modechar);
                                                                handled = true;
                                                                param++;
                                                        }
@@ -884,6 +902,10 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
                                                        }
                                                }
                                        }
+                                       else
+                                       {
+                                               WriteServ(user->fd,"472 %s %c :is unknown mode char to me",user->nick,modechar);
+                                       }
                                break;
                                
                        }
@@ -1006,7 +1028,7 @@ bool process_module_umode(char umode, userrec* source, void* dest, bool adding)
                {
                        if (modules[i]->OnExtendedMode(source,(void*)dest,umode,MT_CLIENT,adding,p))
                        {
-                               log(DEBUG,"Module claims umode %c",umode);
+                               log(DEBUG,"Module %s claims umode %c",module_names[i].c_str(),umode);
                                return true;
                        }
                }
@@ -1046,7 +1068,7 @@ void handle_mode(char **parameters, int pcnt, userrec *user)
 
        if ((dest) && (pcnt == 1))
        {
-               WriteServ(user->fd,"221 %s :+%s",user->nick,user->modes);
+               WriteServ(user->fd,"221 %s :+%s",dest->nick,dest->modes);
                return;
        }
 
@@ -1254,10 +1276,18 @@ void handle_mode(char **parameters, int pcnt, userrec *user)
                        }
                }
 
-               if ((cstatus(user,Ptr) < STATUS_HOP) && (Ptr))
-               {
-                       WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, Ptr->name);
+               int MOD_RESULT = 0;
+               FOREACH_RESULT(OnAccessCheck(user,NULL,Ptr,AC_GENERAL_MODE));
+               
+               if (MOD_RESULT == ACR_DENY)
                        return;
+               if (MOD_RESULT == ACR_DEFAULT)
+               {
+                       if ((cstatus(user,Ptr) < STATUS_HOP) && (Ptr))
+                       {
+                               WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, Ptr->name);
+                               return;
+                       }
                }
 
                process_modes(parameters,user,Ptr,cstatus(user,Ptr),pcnt,false,false,false);