]> jfr.im git - solanum.git/blobdiff - modules/core/m_kick.c
m_quit: add desc string
[solanum.git] / modules / core / m_kick.c
index ecf1d218fa284af8b4347a2d910f447c04ebadbc..a8964edc25c3b5900f3fbf98031c8e8072bae7df 100644 (file)
@@ -20,8 +20,6 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
- *
- *  $Id: m_kick.c 3317 2007-03-28 23:17:06Z jilles $
  */
 
 #include "stdinc.h"
 #include "hash.h"
 #include "packet.h"
 #include "s_serv.h"
+#include "hook.h"
 
-static int m_kick(struct Client *, struct Client *, int, const char **);
+static int m_kick(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
 #define mg_kick { m_kick, 3 }
+static const char kick_desc[] = "Provides the KICK command to remove a user from a channel";
 
 struct Message kick_msgtab = {
-       "KICK", 0, 0, 0, MFLG_SLOW,
+       "KICK", 0, 0, 0, 0,
        {mg_unreg, mg_kick, mg_kick, mg_kick, mg_ignore, mg_kick}
 };
 
 mapi_clist_av1 kick_clist[] = { &kick_msgtab, NULL };
 
-DECLARE_MODULE_AV1(kick, NULL, NULL, kick_clist, NULL, NULL, "$Revision: 3317 $");
+DECLARE_MODULE_AV2(kick, NULL, NULL, kick_clist, NULL, NULL, NULL, NULL, kick_desc);
 
 /*
 ** m_kick
-**      parv[0] = sender prefix
 **      parv[1] = channel
 **      parv[2] = client to kick
 **      parv[3] = kick comment
 */
 static int
-m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+m_kick(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        struct membership *msptr;
        struct Client *who;
@@ -97,7 +96,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, chptr, msptr, MODE_ADD, NULL) < CHFL_CHANOP)
                {
                        if(MyConnect(source_p))
                        {
@@ -120,12 +119,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.
@@ -158,6 +157,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';