]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
Decide that it wasn't quite appropriate :(
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index a69ab9bb2cfead38f019dbd4873833d73a516fdd..8dfc5dd6f724b8825ce4ee53899dd2ae72df2840 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
  *                       E-mail:
  *                <brain@chatspike.net>
  *               <Craig@chatspike.net>
@@ -55,6 +55,11 @@ class ModuleOverride : public Module
                NoisyOverride = Conf->ReadFlag("override","noisy",0);
        }
 
+       void Implements(char* List)
+       {
+               List[I_OnRehash] = List[I_OnAccessCheck] = List[I_On005Numeric] = List[I_OnUserPreJoin] = List[I_OnUserPreKick] = 1;
+       }
+
         virtual void On005Numeric(std::string &output)
         {
                output = output + std::string(" OVERRIDE");
@@ -76,10 +81,24 @@ class ModuleOverride : public Module
                // its not defined at all, count as false
                return false;
        }
+
+       virtual int OnUserPreKick(userrec* source, userrec* user, chanrec* chan, std::string reason)
+       {
+               if ((*source->oper) && (CanOverride(source,"KICK")))
+               {
+                       if (((Srv->ChanMode(source,chan) == "%") && (Srv->ChanMode(user,chan) == "@")) || (Srv->ChanMode(source,chan) == ""))
+                       {
+                               Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(user->nick)+" on "+std::string(chan->name)+" ("+reason+")");
+                       }
+                       /* Returning -1 explicitly allows the kick */
+                       return -1;
+               }
+               return 0;
+       }
        
        virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type)
        {
-               if (strchr(source->modes,'o'))
+               if (*source->oper)
                {
                        if ((Srv) && (source) && (channel))
                        {
@@ -89,16 +108,8 @@ class ModuleOverride : public Module
                                {
                                        switch (access_type)
                                        {
-                                               case AC_KICK:
-                                                       if (CanOverride(source,"KICK"))
-                                                       {
-                                                               Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(dest->nick)+" on "+std::string(channel->name));
-                                                               return ACR_ALLOW;
-                                                       }
-                                                       else return ACR_DEFAULT;
-                                               break;
                                                case AC_DEOP:
-                                                       if (CanOverride(source,"MODEOP"))
+                                                       if (CanOverride(source,"MODEDEOP"))
                                                        {
                                                                Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Deopped "+std::string(dest->nick)+" on "+std::string(channel->name));
                                                                 return ACR_ALLOW;
@@ -106,7 +117,7 @@ class ModuleOverride : public Module
                                                         else return ACR_DEFAULT;
                                                break;
                                                case AC_OP:
-                                                       if (CanOverride(source,"MODEDEOP"))
+                                                       if (CanOverride(source,"MODEOP"))
                                                        {
                                                                Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Opped "+std::string(dest->nick)+" on "+std::string(channel->name));
                                                                 return ACR_ALLOW;
@@ -163,7 +174,7 @@ class ModuleOverride : public Module
        
        virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname)
        {
-               if (strchr(user->modes,'o'))
+               if (*user->oper)
                {
                        if (chan)
                        {
@@ -171,7 +182,7 @@ class ModuleOverride : public Module
                                {
                                        if (NoisyOverride)
                                        {
-                                               std::string x = chan->name;
+                                               irc::string x = chan->name;
                                                if (!user->IsInvited(x))
                                                {
                                                        WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s invited himself into the channel",cname,user->nick);