added MODE_AUDITORIUM /names refresh on op/deop
[ircu2.10.12-pk.git] / ircd / channel.c
index 28c6547d5dd81a9d58a77dd6b909d03674bfcd49..c839fa2285c650bcae9ce27e3b082997c96d2e5c 100644 (file)
@@ -2339,17 +2339,17 @@ struct ParseState {
   struct Membership *member;
   int parc;
   char **parv;
-  unsigned int flags;
-  unsigned int dir;
-  unsigned int done;
-  unsigned int add;
-  unsigned int del;
+  ulong64 flags;
+  ulong64 dir;
+  ulong64 done;
+  ulong64 add;
+  ulong64 del;
   int args_used;
   int max_args;
   int numbans;
   struct Ban banlist[MAXPARA];
   struct {
-    unsigned int flag;
+    ulong64 flag;
     unsigned short oplevel;
     struct Client *client;
   } cli_change[MAXPARA];
@@ -3133,16 +3133,12 @@ static void audit_chan_users(struct ParseState *state, ulong64 *flag_p) {
                                sendcmdto_channel_butserv_butone(member->user, CMD_PART, member->channel, member->user, SKIP_OPS, "%H :%s", member->channel, "mode +u set.");
                        }
                }
-        state->add |= flag_p[0];
-        state->del &= ~flag_p[0];
        } else {
                for(member = state->chptr->members; member; member = member->next_member) {
                        if(!IsChanOp(member) && !HasVoice(member)) {
                                sendcmdto_channel_butserv_butone(member->user, CMD_JOIN, member->channel, member->user, SKIP_OPS, ":%H", member->channel);
                        }
                }
-               state->del |= flag_p[0];
-        state->add &= ~flag_p[0];
        }
 }
 
@@ -3519,6 +3515,10 @@ 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(MyUser(state->sptr) && (state->chptr->mode.mode & MODE_AUDITORIUM) && (state->cli_change[i].flag & MODE_CHANOP)) {
+               do_names(state->sptr, state->chptr, NAMES_ALL|NAMES_EON|((member->status & MODE_CHANOP) ? 0 : NAMES_OPS));
+       }
   } /* for (i = 0; state->cli_change[i].flags; i++) */
 }
 
@@ -3676,6 +3676,7 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr,
        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);