X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fchannel.c;h=4f9547dcc730d534625023994ecee7cc82389e6b;hb=e5f1f0a5b9882c267800fb27c7e14dcba6c7ae36;hp=d1511be47ab30321f726109593655e20f5a2b071;hpb=6177e8285b22cb6277d21a29b165cbda59728b0d;p=ircu2.10.12-pk.git diff --git a/ircd/channel.c b/ircd/channel.c index d1511be..4f9547d 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -2339,9 +2339,9 @@ struct ParseState { struct Membership *member; int parc; char **parv; - unsigned int flags; + ulong64 flags; ulong64 dir; - unsigned int done; + ulong64 done; ulong64 add; ulong64 del; int args_used; @@ -2349,7 +2349,7 @@ struct ParseState { int numbans; struct Ban banlist[MAXPARA]; struct { - unsigned int flag; + ulong64 flag; unsigned short oplevel; struct Client *client; } cli_change[MAXPARA]; @@ -3496,7 +3496,9 @@ mode_process_clients(struct ParseState *state) else SetOpLevel(member, OpLevel(state->member) + 1); } - + + int user_visible = (member->status & CHFL_VOICED_OR_OPPED); + /* actually effect the change */ if (state->flags & MODE_PARSE_SET) { if (state->cli_change[i].flag & MODE_ADD) { @@ -3515,6 +3517,35 @@ mode_process_clients(struct ParseState *state) modebuf_mode_client(state->mbuf, state->cli_change[i].flag, state->cli_change[i].client, state->cli_change[i].oplevel); + + if((member->channel->mode.mode & MODE_AUDITORIUM)) { + //join or part the user + 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) && 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)); + //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 = member->next_member) { + if(!IsChanOp(member2) && !HasVoice(member2)) { + sendcmdto_one(member->user, CMD_JOIN, member2->user, ":%H", chan); + } + } + } else { + //PART ebents + for(member2 = state->chptr->members; member2; member2 = member->next_member) { + if(!IsChanOp(member2) && !HasVoice(member2) && member != member2) { + sendcmdto_one(member->user, CMD_PART, member2->user, "%H :%s", chan, "invisible user on +u channel."); + } + } + } + } + } } /* for (i = 0; state->cli_change[i].flags; i++) */ } @@ -3536,6 +3567,9 @@ mode_parse_mode(struct ParseState *state, ulong64 *flag_p) /* Local users are not permitted to change registration status */ if (flag_p[0] == MODE_REGISTERED && !(state->flags & MODE_PARSE_FORCE) && MyUser(state->sptr)) return; + + if(flag_p[0] == MODE_AUDITORIUM) + audit_chan_users(state, flag_p); if (state->dir == MODE_ADD) { state->add |= flag_p[0]; @@ -3670,10 +3704,6 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr, case 'l': /* deal with limits */ mode_parse_limit(&state, flag_p); break; - case 'u': /* deal with not oped members */ - audit_chan_users(&state, flag_p); - mode_parse_mode(&state, flag_p); - break; case 'a': /* deal with limits */ mode_parse_access(&state, flag_p); break; @@ -3903,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) ? @@ -3944,7 +3977,7 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags) } } - if((chan->mode.mode & MODE_DELJOINS) && !(flags & CHFL_VOICED_OR_OPPED)) { + if((chan->mode.mode & MODE_AUDITORIUM) && !(flags & CHFL_VOICED_OR_OPPED)) { //we have to send this JOIN event to ops only... sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_JOIN, chan, NULL, SKIP_NONOPS, "%H", chan); if(MyUser(jbuf->jb_source))