X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fchannel.c;h=decfd78975f7d8137083d5b1216403de61821dac;hb=bf31de248f88b4c7311d2c1f199944b0dde605da;hp=f8f5239c59e7e4976eb929ce88646e7bfc85b418;hpb=0f9f4378b021b1d4cf18f92f77546eae25bb2195;p=ircu2.10.12-pk.git diff --git a/ircd/channel.c b/ircd/channel.c index f8f5239..decfd78 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -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 working 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 events + 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) ?