Author: Kev <klmitch@mit.edu>
[ircu2.10.12-pk.git] / ircd / m_names.c
index bddfd2795b5a2bba07d5b6255e80382270799add..54a299d33c5142f5f4fa14421f3de55248bfca82 100644 (file)
@@ -226,12 +226,12 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   int showingdelayed = 0;
 
   if (parc > 1 && !ircd_strcmp(parv[1], "-D")) {
-      para = (parc > 2) ? parv[2] : 0;
-      showingdelayed = 1;
-  }
-
-  if ((parc - showingdelayed) > 2 && hunt_server_cmd(sptr, CMD_NAMES, cptr, 1, "%s %C", 2+showingdelayed, parc, parv))
-    return 0; 
+    para = (parc > 2) ? parv[2] : 0;
+    showingdelayed = 1;
+    if (parc > 3 && hunt_server_cmd(sptr, CMD_NAMES, cptr, 1, "%s %s %C", 3, parc, parv))
+      return 0;
+  } else if (parc > 2 && hunt_server_cmd(sptr, CMD_NAMES, cptr, 1, "%s %C", 2, parc, parv))
+    return 0;
 
   if (EmptyString(para)) {
     send_reply(sptr, RPL_ENDOFNAMES, "*");
@@ -240,9 +240,10 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   else if (*para == '0')
     *para = '\0';
   
-  s = strchr(para, ','); /* Recursively call m_names for each comma-seperated channel. Eww. */
+  s = strchr(para, ','); /* Recursively call m_names for each comma-separated channel. Eww. */
   if (s) {
-    parv[1+showingdelayed] = ++s;
+    *s++ = '\0';
+    parv[1+showingdelayed] = s;
     m_names(cptr, sptr, parc, parv);
   }
  
@@ -327,7 +328,6 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
    *  (As performed with each /join) - ** High frequency usage **
    */
 
-  clean_channelname(para);
   chptr = FindChannel(para); 
 
   if (chptr) {
@@ -371,9 +371,15 @@ int ms_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   struct Membership* member; 
   char* s;
   char* para = parc > 1 ? parv[1] : 0; 
+  int showingdelayed = 0;
 
-  if (parc > 2 && hunt_server_cmd(sptr, CMD_NAMES, cptr, 1, "%s %C", 2, parc, parv))
-    return 0; 
+  if (parc > 1 && !ircd_strcmp(parv[1], "-D")) {
+    para = (parc > 2) ? parv[2] : 0;
+    showingdelayed = NAMES_DEL;
+    if (parc > 3 && hunt_server_cmd(sptr, CMD_NAMES, cptr, 1, "%s %s %C", 3, parc, parv))
+      return 0;
+  } else if (parc > 2 && hunt_server_cmd(sptr, CMD_NAMES, cptr, 1, "%s %C", 2, parc, parv))
+    return 0;
 
   if (EmptyString(para)) {
     send_reply(sptr, RPL_ENDOFNAMES, "*");
@@ -382,9 +388,10 @@ int ms_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   else if (*para == '0')
     *para = '\0';
   
-  s = strchr(para, ','); /* Recursively call m_names for each comma-seperated channel. */
+  s = strchr(para, ','); /* Recursively call m_names for each comma-separated channel. */
   if (s) {
-    parv[1] = ++s;
+    *s++ = '\0';
+    parv[1+!!showingdelayed] = s;
     m_names(cptr, sptr, parc, parv);
   }
  
@@ -411,9 +418,9 @@ int ms_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 
       if (find_channel_member(sptr, ch2ptr))
       {
-        do_names(sptr, ch2ptr, NAMES_ALL); /* Full list if we're in this chan. */
+        do_names(sptr, ch2ptr, showingdelayed|NAMES_ALL); /* Full list if we're in this chan. */
       } else { 
-        do_names(sptr, ch2ptr, NAMES_VIS);
+        do_names(sptr, ch2ptr, showingdelayed|NAMES_VIS);
       }
     } 
  
@@ -469,14 +476,13 @@ int ms_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
    *  (As performed with each /join) - ** High frequency usage **
    */
 
-  clean_channelname(para);
   chptr = FindChannel(para); 
 
   if (chptr) {
     member = find_member_link(chptr, sptr);
     if (member)
     { 
-      do_names(sptr, chptr, NAMES_ALL);
+      do_names(sptr, chptr, showingdelayed|NAMES_ALL);
       if (!EmptyString(para))
       {
         send_reply(sptr, RPL_ENDOFNAMES, chptr ? chptr->chname : para);
@@ -489,7 +495,7 @@ int ms_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, NAMES_VIS);
+      do_names(sptr, chptr, showingdelayed|NAMES_VIS);
     } 
   } else { /* Channel doesn't exist. */ 
       send_reply(sptr, RPL_ENDOFNAMES, para);