fixed last commit
[ircu2.10.12-pk.git] / ircd / channel.c
index d1511be47ab30321f726109593655e20f5a2b071..65d37b22afb8f0b1db2dd003035215827ab10a13 100644 (file)
@@ -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,18 @@ 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));
+               }
+       }
   } /* for (i = 0; state->cli_change[i].flags; i++) */
 }
 
@@ -3536,6 +3550,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 +3687,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;
@@ -3944,7 +3957,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))