]> jfr.im git - solanum.git/blobdiff - modules/core/m_kick.c
ircd/dns: same
[solanum.git] / modules / core / m_kick.c
index e2189de68a750874799ddec15cd7688de1d24795..387534612a55a0800d06fd86722c109cc259fbfb 100644 (file)
  */
 
 #include "stdinc.h"
-#include "tools.h"
 #include "channel.h"
 #include "client.h"
-#include "irc_string.h"
+#include "match.h"
 #include "ircd.h"
 #include "numeric.h"
 #include "send.h"
@@ -38,6 +37,7 @@
 #include "hash.h"
 #include "packet.h"
 #include "s_serv.h"
+#include "hook.h"
 
 static int m_kick(struct Client *, struct Client *, int, const char **);
 #define mg_kick { m_kick, 3 }
@@ -53,7 +53,6 @@ DECLARE_MODULE_AV1(kick, NULL, NULL, kick_clist, NULL, NULL, "$Revision: 3317 $"
 
 /*
 ** m_kick
-**      parv[0] = sender prefix
 **      parv[1] = channel
 **      parv[2] = client to kick
 **      parv[3] = kick comment
@@ -98,7 +97,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        return 0;
                }
 
-               if(!is_chanop(msptr))
+               if(get_channel_access(source_p, msptr, MODE_ADD) < CHFL_CHANOP)
                {
                        if(MyConnect(source_p))
                        {
@@ -121,12 +120,12 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                 * There are two cases we can get to this point then...
                 *
                 *     1) connect burst is happening, and for some reason a legit
-                *        op has sent a KICK, but the SJOIN hasn't happened yet or 
+                *        op has sent a KICK, but the SJOIN hasn't happened yet or
                 *        been seen. (who knows.. due to lag...)
                 *
                 *     2) The channel is desynced. That can STILL happen with TS
-                *        
-                *     Now, the old code roger wrote, would allow the KICK to 
+                *
+                *     Now, the old code roger wrote, would allow the KICK to
                 *     go through. Thats quite legit, but lets weird things like
                 *     KICKS by users who appear not to be chanopped happen,
                 *     or even neater, they appear not to be on the channel.
@@ -159,6 +158,23 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        return 0;
                }
 
+               if(MyClient(source_p))
+               {
+                       hook_data_channel_approval hookdata;
+
+                       hookdata.client = source_p;
+                       hookdata.chptr = chptr;
+                       hookdata.msptr = msptr;
+                       hookdata.target = who;
+                       hookdata.approved = 1;
+                       hookdata.dir = MODE_ADD;        /* ensure modules like override speak up */
+
+                       call_hook(h_can_kick, &hookdata);
+
+                       if (!hookdata.approved)
+                               return 0;
+               }
+
                comment = LOCAL_COPY((EmptyString(parv[3])) ? who->name : parv[3]);
                if(strlen(comment) > (size_t) REASONLEN)
                        comment[REASONLEN] = '\0';
@@ -182,9 +198,6 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
                              ":%s KICK %s %s :%s",
                              use_id(source_p), chptr->chname, use_id(who), comment);
-               sendto_server(client_p, chptr, NOCAPS, CAP_TS6,
-                             ":%s KICK %s %s :%s",
-                             source_p->name, chptr->chname, who->name, comment);
                remove_user_from_channel(msptr);
        }
        else if (MyClient(source_p))