fix n3 :D (fixed sendcmdto_one parameter order)
[ircu2.10.12-pk.git] / ircd / channel.c
index f8f5239c59e7e4976eb929ce88646e7bfc85b418..0ea520a3be82fa36cc088d8e2d4b6cc920bf8f40 100644 (file)
@@ -3497,7 +3497,7 @@ mode_process_clients(struct ParseState *state)
         SetOpLevel(member, OpLevel(state->member) + 1);
     }
        
-       ulong64 old_status = member->status;
+       int user_visible = (member->status & CHFL_VOICED_OR_OPPED);
        
     /* actually effect the change */
     if (state->flags & MODE_PARSE_SET) {
@@ -3520,13 +3520,30 @@ mode_process_clients(struct ParseState *state)
        
        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)) {
+               if((member->status & CHFL_VOICED_OR_OPPED) && !user_visible) {
                        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)) {
+               } else if(!(member->status & CHFL_VOICED_OR_OPPED) && user_visible) {
                        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));
+                       //do_names(member->user, member->channel, NAMES_ALL|NAMES_EON|((member->status & MODE_CHANOP) ? 0 : NAMES_OPS));
+                       //this is not woring for all users :(  so we have to send join/part events
+                       struct Membership *member2;
+                       if (state->cli_change[i].flag & MODE_ADD) {
+                               //JOIN events
+                               for(member2 = state->chptr->members; member2; member2 = member2->next_member) {
+                                       if(!IsChanOp(member2) && !HasVoice(member2)) {
+                                               sendcmdto_one(member2->user, CMD_JOIN, member->user, ":%H", member->channel);
+                                       }
+                               }
+                       } else {
+                               //PART ebents
+                               for(member2 = state->chptr->members; member2; member2 = member2->next_member) {
+                                       if(!IsChanOp(member2) && !HasVoice(member2) && member != member2) {
+                                               sendcmdto_one(member2->user, CMD_PART, member->user, "%H :%s", member->channel, "invisible user on +u channel.");
+                                       }
+                               }
+                       }
                }
        }
   } /* for (i = 0; state->cli_change[i].flags; i++) */
@@ -3916,8 +3933,11 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
     SetUserParting(member);
 
     /* Send notification to channel */
-       if((chan->mode.mode & MODE_AUDITORIUM) && !(flags & CHFL_VOICED_OR_OPPED)) {
-         //do noting here
+       if((chan->mode.mode & MODE_AUDITORIUM) && !(member->status & CHFL_VOICED_OR_OPPED)) {
+         //send part to ops only
+         sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL, SKIP_NONOPS, "%H :%s", chan, jbuf->jb_comment);
+         if(MyUser(jbuf->jb_source))
+                 sendcmdto_one(jbuf->jb_source, CMD_PART, jbuf->jb_source, "%H :%s", chan, jbuf->jb_comment);
     } else if (!(flags & (CHFL_ZOMBIE | CHFL_DELAYED)))
       sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL, 0,
                                (flags & CHFL_BANNED || !jbuf->jb_comment) ?