fixed ssl.c bug when ssl backend returns IO_BLOCKED but IO engine doesn't get informe...
[ircu2.10.12-pk.git] / ircd / m_names.c
index 13950fc22a32ce22468729a2997b4d28b474828e..1951922084696784a743848495bad15e328af11f 100644 (file)
@@ -141,8 +141,11 @@ void do_names(struct Client* sptr, struct Channel* chptr, int filter)
   flag = 1;
   needs_space = 0;
 
-  if (!ShowChannel(sptr, chptr)) /* Don't list private channels unless we are on them. */
+  if (!ShowChannel(sptr, chptr)) { /* Don't list private channels unless we are on them. */
+    if (filter&NAMES_EON)
+      send_reply(sptr, RPL_ENDOFNAMES, chptr->chname);
     return;
+  }
 
   /* Iterate over all channel members, and build up the list. */
 
@@ -167,7 +170,7 @@ 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))
+       if (!IsChanOpOrHalfOp(member) && !HasVoice(member) && member->user != sptr && (filter & NAMES_OPS))
                continue;
 
     if (needs_space)
@@ -177,6 +180,8 @@ void do_names(struct Client* sptr, struct Channel* chptr, int filter)
       buf[idx++] = '!';
     else if (IsChanOp(member))
       buf[idx++] = '@';
+    else if (IsHalfOp(member))
+      buf[idx++] = '%';
     else if (HasVoice(member))
       buf[idx++] = '+';
     strcpy(buf + idx, cli_name(c2ptr));
@@ -252,10 +257,9 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
         if (!ShowChannel(sptr, ch2ptr))
           continue;                 /* Don't show secret chans. */ 
         else if ((member = find_channel_member(sptr, ch2ptr))) {
-                 
-          do_names(sptr, ch2ptr, showingdelayed|NAMES_ALL|((chptr->mode.mode & MODE_AUDITORIUM) && !(member->status & MODE_CHANOP) ? NAMES_OPS : 0)); /* Full list if we're in this chan. */
+          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|((chptr->mode.mode & MODE_AUDITORIUM) ? NAMES_OPS : 0));
+          do_names(sptr, ch2ptr, showingdelayed|NAMES_VIS|((ch2ptr->mode.mode & MODE_AUDITORIUM) ? NAMES_OPS : 0));
       } 
 
       /* List all remaining users on channel '*' */
@@ -312,7 +316,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
       {
@@ -320,7 +324,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|((chptr->mode.mode & MODE_AUDITORIUM) ? NAMES_OPS : 0));
       } 
     }
     else