+
+ 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 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.");
+ }
+ }
+ }
+ }
+ }