+ if(Client_Type(Peer) == CLIENT_USER) {
+ /* Channel mode 'Q' and user mode 'q' on target: nobody but
+ * IRC Operators and servers can kick the target user */
+ if ((Channel_HasMode(chan, 'Q')
+ || Client_HasMode(Target, 'q')
+ || Client_Type(Target) == CLIENT_SERVICE)
+ && !Client_HasMode(Origin, 'o')) {
+ IRC_WriteErrClient(Origin, ERR_KICKDENY_MSG,
+ Client_ID(Origin), Name,
+ Client_ID(Target));
+ return;
+ }
+
+ /* Check if client has the rights to kick target */
+
+ /* Owner can kick everyone */
+ if (Channel_UserHasMode(chan, Peer, 'q'))
+ can_kick = true;
+
+ /* Admin can't kick owner */
+ else if (Channel_UserHasMode(chan, Peer, 'a') &&
+ !Channel_UserHasMode(chan, Target, 'q'))
+ can_kick = true;
+
+ /* Op can't kick owner | admin */
+ else if (Channel_UserHasMode(chan, Peer, 'o') &&
+ !Channel_UserHasMode(chan, Target, 'q') &&
+ !Channel_UserHasMode(chan, Target, 'a'))
+ can_kick = true;
+
+ /* Half Op can't kick owner | admin | op */
+ else if (Channel_UserHasMode(chan, Peer, 'h') &&
+ !Channel_UserHasMode(chan, Target, 'q') &&
+ !Channel_UserHasMode(chan, Target, 'a') &&
+ !Channel_UserHasMode(chan, Target, 'o'))
+ can_kick = true;
+
+ /* IRC operators & IRCd with OperCanMode enabled
+ * can kick anyways regardless of privilege */
+ else if(Client_HasMode(Origin, 'o') && Conf_OperCanMode)
+ can_kick = true;
+
+ if(!can_kick) {
+ IRC_WriteErrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG,
+ Client_ID(Origin), Name);
+ return;
+ }
+ }
+