added MODE_HALFOP (+h, %)
[ircu2.10.12-pk.git] / ircd / m_kick.c
index f2a67d58754030540dc8b7edba39e5243c28cdbd..447329a90bf94a11b68a86d87df0be2b550856cf 100644 (file)
@@ -124,7 +124,7 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     return send_reply(sptr, ERR_NOSUCHCHANNEL, name);
 
   if (!(member2 = find_member_link(chptr, sptr)) || IsZombie(member2)
-      || (!IsChanOp(member2) && !(IsNetServ(sptr) && IsSecurityServ(sptr) && IsChannelService(sptr))))
+      || (!IsChanOpOrHalfOp(member2) && !(IsNetServ(sptr) && IsSecurityServ(sptr) && IsChannelService(sptr))))
     return send_reply(sptr, ERR_CHANOPRIVSNEEDED, name);
 
   if (!(who = find_chasing(sptr, parv[2], 0)))
@@ -141,6 +141,10 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
   /* check if kicked user is actually on the channel */
   if (!(member = find_member_link(chptr, who)) || IsZombie(member) || (IsInvisibleJoin(member) && IsDelayedJoin(member)))
     return send_reply(sptr, ERR_USERNOTINCHANNEL, cli_name(who), chptr->chname);
+    
+  /* Don't allow oped users to be kicked by halfops */
+  if (IsChanOp(member) && !IsChanOp(member2) && who != sptr)
+    return send_reply(sptr, ERR_CHANOPRIVSNEEDED, name);
 
   /* Don't allow to kick member with a higher op-level,
    * or members with the same op-level unless both are MAXOPLEVEL.