- /* Check if user has operator status */
- if (!strchr(Channel_UserModes(chan, Origin), 'o')) {
- IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG,
- Client_ID(Origin), Name);
+ if(Client_Type(Peer) == CLIENT_USER) {
+ /* Check if client has the rights to kick target */
+ ptr = Channel_UserModes(chan, Peer);
+ target_modes = Channel_UserModes(chan, Target);
+ while(*ptr) {
+ /* Owner can kick everyone */
+ if ( *ptr == 'q') {
+ can_kick = true;
+ break;
+ }
+ /* Admin can't kick owner */
+ if ( *ptr == 'a' ) {
+ if (!strchr(target_modes, 'q')) {
+ can_kick = true;
+ break;
+ }
+ }
+ /* Op can't kick owner | admin */
+ if ( *ptr == 'o' ) {
+ if (!strchr(target_modes, 'q') &&
+ !strchr(target_modes, 'a')) {
+ can_kick = true;
+ break;
+ }
+ }
+ /* Half Op can't kick owner | admin | op */
+ if ( *ptr == 'h' ) {
+ if (!strchr(target_modes, 'q') &&
+ !strchr(target_modes, 'a') &&
+ !strchr(target_modes, 'o')) {
+ can_kick = true;
+ break;
+ }
+ }
+ ptr++;
+ }
+
+ if(!can_kick) {
+ IRC_WriteStrClient(Origin, ERR_CHANOPPRIVTOLOW_MSG,
+ Client_ID(Origin), Name);