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) {
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) && !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", member->channel);
+ }
+ }
+ } 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", member->channel, "invisible user on +u channel.");
+ }
+ }
+ }
+ }
}
} /* for (i = 0; state->cli_change[i].flags; i++) */
}
/* 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];
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;
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) ?