From fb33f1b5ba4fc6e673dc96690d94d11756f445f7 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Sat, 24 Sep 2005 02:57:20 +0000 Subject: [PATCH] Support showing join-delayed users in /WHO output. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1495 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 12 ++++++++++++ include/whocmds.h | 1 + ircd/m_who.c | 9 ++++++++- ircd/whocmds.c | 36 ++++++++++++++++++++++-------------- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 549e60b..c7d9a84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-09-23 Michael Poole + + * include/whocmds.h (WHOSELECT_DELAY): Define new constant. + + * ircd/m_who.c (m_who): Accept 'd'/'D' as a way to set + WHOSELECT_DELAY, just like 'o' for WHOSELECT_OPER. Do not skip + join-delayed users if WHOSELECT_DELAY is set. + + * ircd/whocmds.c (do_who): Remember membership for shared channel + if one exists. Use it when displaying flags, adding '<' for + join-delayed users. + 2005-09-22 Michael Poole * ircd/channel.c (mode_parse_key): Only accept the new key when diff --git a/include/whocmds.h b/include/whocmds.h index 70b89c2..3a30796 100644 --- a/include/whocmds.h +++ b/include/whocmds.h @@ -23,6 +23,7 @@ struct Channel; #define WHOSELECT_OPER 1 /**< Flag for /WHO: Show IRC operators. */ #define WHOSELECT_EXTRA 2 /**< Flag for /WHO: Pull rank to see users. */ +#define WHOSELECT_DELAY 4 /**< Flag for /WHO: Show join-delayed users. */ #define WHO_FIELD_QTY 1 /**< Display query type. */ #define WHO_FIELD_CHA 2 /**< Show common channel name. */ diff --git a/ircd/m_who.c b/ircd/m_who.c index d2a4411..6b277f1 100644 --- a/ircd/m_who.c +++ b/ircd/m_who.c @@ -174,6 +174,10 @@ int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) while (((ch = *(p++))) && (ch != '%') && (ch != ',')) switch (ch) { + case 'd': + case 'D': + bitsel |= WHOSELECT_DELAY; + continue; case 'o': case 'O': bitsel |= WHOSELECT_OPER; @@ -322,7 +326,10 @@ int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) acptr = member->user; if ((bitsel & WHOSELECT_OPER) && !SeeOper(sptr,acptr)) continue; - if ((acptr != sptr) && (member->status & (CHFL_ZOMBIE | CHFL_DELAYED))) + if ((acptr != sptr) + && ((member->status & CHFL_ZOMBIE) + || ((member->status & CHFL_DELAYED) + && !(bitsel & WHOSELECT_DELAY)))) continue; if (!(isthere || (SEE_USER(sptr, acptr, bitsel)))) continue; diff --git a/ircd/whocmds.c b/ircd/whocmds.c index 34f7ee7..6516d74 100644 --- a/ircd/whocmds.c +++ b/ircd/whocmds.c @@ -72,7 +72,7 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan, int fields, char* qrt) { char *p1; - struct Channel *chptr = repchan; + struct Membership *chan; static char buf1[512]; /* NOTE: with current fields list and sizes this _cannot_ overrun, @@ -85,14 +85,15 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan, unless the listing is for a channel service, we already know that there are no common channels, thus use PubChannel and not SeeChannel */ - if (!chptr && (!fields || (fields & (WHO_FIELD_CHA | WHO_FIELD_FLA))) && - !IsChannelService(acptr)) + if (repchan) + chan = find_channel_member(acptr, repchan); + else if ((!fields || (fields & (WHO_FIELD_CHA | WHO_FIELD_FLA))) + && !IsChannelService(acptr)) { - struct Membership* chan; - for (chan = cli_user(acptr)->channel; chan && !chptr; chan = chan->next_channel) + for (chan = cli_user(acptr)->channel; chan; chan = chan->next_channel) if (PubChannel(chan->channel) && (acptr == sptr || !IsZombie(chan))) - chptr = chan->channel; + break; } /* Place the fields one by one in the buffer and send it @@ -111,7 +112,7 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan, { char *p2; *(p1++) = ' '; - if ((p2 = (chptr ? chptr->chname : NULL))) + if ((p2 = (chan ? chan->channel->chname : NULL))) while ((*p2) && (*(p1++) = *(p2++))); else *(p1++) = '*'; @@ -165,25 +166,32 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan, *(p1++) = 'H'; if SeeOper(sptr,acptr) *(p1++) = '*'; - if (fields) { + if (!chan) { + /* No flags possible for the channel, so skip them all. */ + } + else if (fields) { /* If you specified flags then we assume you know how to parse * multiple channel status flags, as this is currently the only * way to know if someone has @'s *and* is +'d. */ - if (chptr && is_chan_op(acptr, chptr)) + if (IsChanOp(chan)) *(p1++) = '@'; - if (chptr && has_voice(acptr, chptr)) + if (HasVoice(chan)) *(p1++) = '+'; - if (chptr && is_zombie(acptr, chptr)) + if (IsZombie(chan)) *(p1++) = '!'; + if (IsDelayedJoin(chan)) + *(p1++) = '<'; } else { - if (chptr && is_chan_op(acptr, chptr)) + if (IsChanOp(chan)) *(p1++) = '@'; - else if (chptr && has_voice(acptr, chptr)) + else if (HasVoice(chan)) *(p1++) = '+'; - else if (chptr && is_zombie(acptr, chptr)) + else if (IsZombie(chan)) *(p1++) = '!'; + else if (IsDelayedJoin(chan)) + *(p1++) = '<'; } if (IsDeaf(acptr)) *(p1++) = 'd'; -- 2.20.1