virtually join or part a user when he gets +-ov on a +u channel
authorpk910 <philipp@zoelle1.de>
Tue, 28 Jun 2011 20:55:04 +0000 (22:55 +0200)
committerpk910 <philipp@zoelle1.de>
Tue, 28 Jun 2011 20:55:04 +0000 (22:55 +0200)
ircd/channel.c

index 3f563c326168645878d85aee5c29070dfae8deb4..f8f5239c59e7e4976eb929ce88646e7bfc85b418 100644 (file)
@@ -3496,7 +3496,9 @@ mode_process_clients(struct ParseState *state)
       else
         SetOpLevel(member, OpLevel(state->member) + 1);
     }
-
+       
+       ulong64 old_status = member->status;
+       
     /* actually effect the change */
     if (state->flags & MODE_PARSE_SET) {
       if (state->cli_change[i].flag & MODE_ADD) {
@@ -3516,8 +3518,16 @@ mode_process_clients(struct ParseState *state)
                        state->cli_change[i].client,
                         state->cli_change[i].oplevel);
        
-       if(MyUser(member->user) && (member->channel->mode.mode & MODE_AUDITORIUM) && (state->cli_change[i].flag & MODE_CHANOP)) {
-               do_names(member->user, member->channel, NAMES_ALL|NAMES_EON|((member->status & MODE_CHANOP) ? 0 : NAMES_OPS));
+       if((member->channel->mode.mode & MODE_AUDITORIUM)) {
+               //join or part the user
+               if((member->status & CHFL_VOICED_OR_OPPED) & !(old_status & CHFL_VOICED_OR_OPPED)) {
+                       sendcmdto_channel_butserv_butone(member->user, CMD_JOIN, member->channel, member->user, SKIP_OPS, ":%H", member->channel);
+               } else if(!(member->status & CHFL_VOICED_OR_OPPED) & (old_status & CHFL_VOICED_OR_OPPED)) {
+                       sendcmdto_channel_butserv_butone(member->user, CMD_PART, member->channel, member->user, SKIP_OPS, "%H :%s", member->channel, "user deoped/devoiced on a +u channel.");
+               }
+               if(MyUser(member->user) && (state->cli_change[i].flag & MODE_CHANOP)) {
+                       do_names(member->user, member->channel, NAMES_ALL|NAMES_EON|((member->status & MODE_CHANOP) ? 0 : NAMES_OPS));
+               }
        }
   } /* for (i = 0; state->cli_change[i].flags; i++) */
 }