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++;
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;
}
}
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);
}
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)) {
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);
}
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);
}
}
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);
* 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. */