m_names fix (changed the wrong part all commits before -.-)
[ircu2.10.12-pk.git] / ircd / m_names.c
index 16cee5cac1b624879891b32d2d57277bbeb33c44..0e1169e7016a38e300ece79c56871fe18c009971 100644 (file)
  *  NAMES_DEL - Show join-delayed names list.
  *  NAMES_EON - When OR'd with the other two, adds an 'End of Names' numeric
  *              used by m_join
+ *  NAMES_OPS - Only list oped (+o) or voiced (+v) users
  *
  */
 
@@ -165,6 +166,9 @@ void do_names(struct Client* sptr, struct Channel* chptr, int filter)
                
        if (IsInvisibleJoin(member) && member->user != sptr)
                continue;
+       
+       if (!IsChanOp(member) && !HasVoice(member) && member->user != sptr && (filter & NAMES_OPS))
+               continue;
 
     if (needs_space)
       buf[idx++] = ' ';
@@ -242,15 +246,15 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       mlen = strlen(cli_name(&me)) + 10 + strlen(cli_name(sptr));
 
       /* List all visible channels/visible members */ 
-
+      struct Membership *member;
       for (ch2ptr = GlobalChannelList; ch2ptr; ch2ptr = ch2ptr->next)
       { 
         if (!ShowChannel(sptr, ch2ptr))
           continue;                 /* Don't show secret chans. */ 
-        else if (find_channel_member(sptr, ch2ptr))
-          do_names(sptr, ch2ptr, showingdelayed|NAMES_ALL); /* Full list if we're in this chan. */
-        else
-          do_names(sptr, ch2ptr, showingdelayed|NAMES_VIS);
+        else if ((member = find_channel_member(sptr, ch2ptr))) {
+          do_names(sptr, ch2ptr, showingdelayed|NAMES_ALL|((ch2ptr->mode.mode & MODE_AUDITORIUM) && !(member->status & MODE_CHANOP) ? NAMES_OPS : 0)); /* Full list if we're in this chan. */
+        else
+          do_names(sptr, ch2ptr, showingdelayed|NAMES_VIS|((ch2ptr->mode.mode & MODE_AUDITORIUM) ? NAMES_OPS : 0));
       } 
 
       /* List all remaining users on channel '*' */
@@ -307,7 +311,7 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
          *  Special Case 2: User is on this channel, requesting full names list.
          *  (As performed with each /join) - ** High frequency usage **
          */
-        do_names(sptr, chptr, showingdelayed|NAMES_ALL|NAMES_EON);
+        do_names(sptr, chptr, showingdelayed|NAMES_ALL|NAMES_EON|((chptr->mode.mode & MODE_AUDITORIUM) && !(member->status & MODE_CHANOP) ? NAMES_OPS : 0));
       }
       else
       {
@@ -315,7 +319,7 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
          *  Special Case 3: User isn't on this channel, show all visible users, in 
          *  non secret channels.
          */ 
-        do_names(sptr, chptr, showingdelayed|NAMES_VIS|NAMES_EON);
+        do_names(sptr, chptr, showingdelayed|NAMES_VIS|NAMES_EON|((ch2ptr->mode.mode & MODE_AUDITORIUM) ? NAMES_OPS : 0));
       } 
     }
     else