Forward port of delayed-join.patch from Quakenet's "Asuka" patch set
[ircu2.10.12-pk.git] / ircd / m_names.c
index 02e80d2282789716c0268f46a7d0ff7d419b5687..2ee0c65b1f67ea2f3a0cc52165131164682574d7 100644 (file)
@@ -155,6 +155,12 @@ void do_names(struct Client* sptr, struct Channel* chptr, int filter)
     if (IsZombie(member) && member->user != sptr)
       continue;
 
+    if (IsDelayedJoin(member) && (member->user != sptr) && !(filter & NAMES_DEL))
+        continue;
+
+    if ((!IsDelayedJoin(member) || (member->user == sptr)) && (filter & NAMES_DEL))
+        continue;
+
     if (needs_space) {
        strcat(buf, " ");
       idx++;
@@ -181,7 +187,7 @@ void do_names(struct Client* sptr, struct Channel* chptr, int filter)
     if (mlen + idx + NICKLEN + 5 > BUFSIZE)
       /* space, modifier, nick, \r \n \0 */
     { 
-      send_reply(sptr, RPL_NAMREPLY, buf);
+      send_reply(sptr, (filter & NAMES_DEL) ? RPL_DELNAMREPLY : RPL_NAMREPLY, buf);
       strcpy(buf, "* ");
       ircd_strncpy(buf + 2, chptr->chname, len + 1);
       buf[len + 2] = 0;
@@ -196,7 +202,7 @@ void do_names(struct Client* sptr, struct Channel* chptr, int filter)
     }
   }
   if (flag)
-    send_reply(sptr, RPL_NAMREPLY, buf); 
+    send_reply(sptr, (filter & NAMES_DEL) ? RPL_DELNAMREPLY : RPL_NAMREPLY, buf); 
   if (filter&NAMES_EON)
     send_reply(sptr, RPL_ENDOFNAMES, chptr->chname);
 }
@@ -216,8 +222,14 @@ int m_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))
+  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; 
 
   if (EmptyString(para)) {
@@ -229,7 +241,7 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   
   s = strchr(para, ','); /* Recursively call m_names for each comma-seperated channel. Eww. */
   if (s) {
-    parv[1] = ++s;
+    parv[1+showingdelayed] = ++s;
     m_names(cptr, sptr, parc, parv);
   }
  
@@ -256,9 +268,9 @@ int m_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_DEL:0)|NAMES_ALL); /* Full list if we're in this chan. */
       } else { 
-        do_names(sptr, ch2ptr, NAMES_VIS);
+        do_names(sptr, ch2ptr, (showingdelayed?NAMES_DEL:0)|NAMES_VIS);
       }
     } 
 
@@ -321,7 +333,7 @@ int m_names(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     member = find_member_link(chptr, sptr);
     if (member)
     { 
-      do_names(sptr, chptr, NAMES_ALL);
+      do_names(sptr, chptr, (showingdelayed?NAMES_DEL:0)|NAMES_ALL);
       if (!EmptyString(para))
       {
         send_reply(sptr, RPL_ENDOFNAMES, chptr ? chptr->chname : para);
@@ -334,7 +346,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, NAMES_VIS);
+      do_names(sptr, chptr, (showingdelayed?NAMES_DEL:0)|NAMES_VIS);
       send_reply(sptr, RPL_ENDOFNAMES, para);
     } 
   } else { /* Channel doesn't exist. */