From 275e1f928a44325a7ea1f0803d0ad23dc4e92d93 Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 28 Jun 2011 19:49:23 +0200 Subject: [PATCH] added MODE_AUDITORIUM (+u) to show only ops the full userlist --- include/channel.h | 6 +++-- include/s_user.h | 1 + include/send.h | 1 + ircd/channel.c | 58 +++++++++++++++++++++++++++++++++++++++++++---- ircd/m_names.c | 4 ++++ ircd/m_who.c | 2 ++ ircd/send.c | 3 +++ 7 files changed, 69 insertions(+), 6 deletions(-) diff --git a/include/channel.h b/include/channel.h index af416d9..6984250 100644 --- a/include/channel.h +++ b/include/channel.h @@ -128,13 +128,14 @@ typedef signed long long long64; #define MODE_ALTCHAN 0x8000000 /**< Alternative channel */ #define MODE_DEL 0x20000000 #define MODE_ADD 0x40000000 -#define MODE_ACCESS 0x100000000LLU /**< ChanServ access */ +#define MODE_ACCESS 0x100000000LLU /**< ChanServ access */ +#define MODE_AUDITORIUM 0x200000000LLU /**< +u Auditorium */ /** mode flags which take another parameter (With PARAmeterS) */ #define MODE_WPARAS (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS|MODE_EXCEPTION|MODE_ALTCHAN|MODE_ACCESS) /** Available Channel modes */ -#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopstUvrDRzQ" : "cCbiklmMnNopstvrDRzQ" +#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopstuUvrDRzQu" : "cCbiklmMnNopstuvrDRzQu" /** Available Channel modes that take parameters */ #define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUvFa" : "bklovFa" @@ -424,6 +425,7 @@ extern void list_set_default(void); /* this belongs elsewhere! */ extern void RevealDelayedJoinIfNeeded(struct Client *sptr, struct Channel *chptr); extern void RevealDelayedJoin(struct Membership *member); extern void CheckDelayedJoins(struct Channel *chan); +extern void CheckEnableDelayedJoins(struct Channel *chan); extern void modebuf_init(struct ModeBuf *mbuf, struct Client *source, struct Client *connect, struct Channel *chan, diff --git a/include/s_user.h b/include/s_user.h index bc365b5..7b1fc18 100644 --- a/include/s_user.h +++ b/include/s_user.h @@ -110,6 +110,7 @@ extern int send_supported(struct Client *cptr); #define NAMES_VIS 2 /**< List only visible users in non-secret channels */ #define NAMES_EON 4 /**< Add an 'End Of Names' reply to the end */ #define NAMES_DEL 8 /**< Show delayed joined users only */ +#define NAMES_OPS 16 /**< Show oped users only */ void do_names(struct Client* sptr, struct Channel* chptr, int filter); diff --git a/include/send.h b/include/send.h index 3d05ef9..1fb416a 100644 --- a/include/send.h +++ b/include/send.h @@ -91,6 +91,7 @@ extern void sendcmdto_channel_butone(struct Client *from, const char *cmd, #define SKIP_NONOPS 0x04 /**< skip users that aren't chanops */ #define SKIP_NONVOICES 0x08 /**< skip users that aren't voiced (includes chanops) */ +#define SKIP_OPS 0x10 /**< skip users that are chanops */ /* Send command to all users having a particular flag set */ extern void sendwallto_group_butone(struct Client *from, int type, diff --git a/ircd/channel.c b/ircd/channel.c index fa8412e..714dbd2 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -870,6 +870,8 @@ void channel_modes(struct Client *cptr, char *mbuf, char *pbuf, int buflen, *mbuf++ = 'M'; if (chptr->mode.mode & MODE_QUARANTINE) *mbuf++ = 'Q'; + if (chptr->mode.mode & MODE_AUDITORIUM) + *mbuf++ = 'u'; if (chptr->mode.limit) { *mbuf++ = 'l'; ircd_snprintf(0, pbuf, buflen, "%u", chptr->mode.limit); @@ -1603,6 +1605,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all) MODE_NOAMSGS, 'M', MODE_NONOTICE, 'N', MODE_QUARANTINE, 'Q', + MODE_AUDITORIUM, 'u', 0x0, 0x0 }; static ulong64 local_flags[] = { @@ -2040,7 +2043,8 @@ modebuf_mode(struct ModeBuf *mbuf, ulong64 mode) mode &= (MODE_ADD | MODE_DEL | MODE_PRIVATE | MODE_SECRET | MODE_MODERATED | MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY | MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_PERSIST | - MODE_NOCOLOUR | MODE_NOCTCP | MODE_NOAMSGS | MODE_NONOTICE | MODE_QUARANTINE); + MODE_NOCOLOUR | MODE_NOCTCP | MODE_NOAMSGS | MODE_NONOTICE | + MODE_QUARANTINE | MODE_AUDITORIUM); if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */ return; @@ -2218,6 +2222,7 @@ modebuf_extract(struct ModeBuf *mbuf, char *buf) MODE_QUARANTINE, 'Q', MODE_ALTCHAN, 'F', MODE_ACCESS, 'a', + MODE_AUDITORIUM, 'u', 0x0, 0x0 }; ulong64 add; @@ -3116,6 +3121,28 @@ static void reveal_hidden_chan_users(struct ParseState *state, ulong64 *flag_p) } } +/* Handle MODE_AUDITORIUM changes + * set Delayed for all hidden users on MODE_DEL + * part all nonoped users on MODE_ADD + */ +static void audit_chan_users(struct ParseState *state, ulong64 *flag_p) { + struct Membership *member; + if (state->dir == MODE_ADD) { + for(member = state->chptr->members; member; member = member->next_member) { + if(!IsChanOp(member) && !HasVoice(member)) { + sendcmdto_channel_butserv_butone(member->user, CMD_PART, member->channel, member->user, SKIP_OPS, "%H :%s", member->channel, "mode +u set."); + } + } + } else { + for(member = state->chptr->members; member; member = member->next_member) { + if(!IsChanOp(member) && !HasVoice(member)) { + sendcmdto_channel_butserv_butone(member->user, CMD_JOIN, member->channel, member->user, SKIP_OPS, ":%H", member->channel); + } + } + } +} + + /* * Helper function to convert bans */ @@ -3577,6 +3604,7 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr, MODE_QUARANTINE, 'Q', MODE_ALTCHAN, 'F', MODE_ACCESS, 'a', + MODE_AUDITORIUM, 'u', MODE_ADD, '+', MODE_DEL, '-', 0x0, 0x0 @@ -3642,6 +3670,10 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr, case 'l': /* deal with limits */ mode_parse_limit(&state, flag_p); break; + case 'u': /* deal with not oped members */ + audit_chan_users(&state, flag_p); + mode_parse_mode(&state, flag_p); + break; case 'a': /* deal with limits */ mode_parse_access(&state, flag_p); break; @@ -3871,7 +3903,9 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags) SetUserParting(member); /* Send notification to channel */ - if (!(flags & (CHFL_ZOMBIE | CHFL_DELAYED))) + if((chan->mode.mode & MODE_AUDITORIUM) && !(flags & CHFL_VOICED_OR_OPPED)) { + //do noting here + } else if (!(flags & (CHFL_ZOMBIE | CHFL_DELAYED))) sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL, 0, (flags & CHFL_BANNED || !jbuf->jb_comment) ? ":%H" : "%H :%s", chan, jbuf->jb_comment); @@ -3909,8 +3943,14 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags) "%H %Tu %i", chan, chan->creationtime, 0); } } - - if (!((chan->mode.mode & MODE_DELJOINS) && !(flags & CHFL_VOICED_OR_OPPED)) && !((flags & CHFL_INVISIBLE) && !(flags & CHFL_VOICED_OR_OPPED))) { + + if((chan->mode.mode & MODE_DELJOINS) && !(flags & CHFL_VOICED_OR_OPPED)) { + //we have to send this JOIN event to ops only... + sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_JOIN, chan, NULL, SKIP_NONOPS, "%H", chan); + if(MyUser(jbuf->jb_source)) + sendcmdto_one(jbuf->jb_source, CMD_JOIN, jbuf->jb_source, ":%H", chan); + } + else if (!((chan->mode.mode & MODE_DELJOINS) && !(flags & CHFL_VOICED_OR_OPPED)) && !((flags & CHFL_INVISIBLE) && !(flags & CHFL_VOICED_OR_OPPED))) { /* Send the notification to the channel */ sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_JOIN, chan, NULL, 0, "%H", chan); @@ -4023,6 +4063,16 @@ void CheckDelayedJoins(struct Channel *chan) } } +void CheckEnableDelayedJoins(struct Channel *chan) { + if (!(chan->mode.mode & MODE_WASDELJOINS) && find_delayed_joins(chan)) { + chan->mode.mode |= MODE_WASDELJOINS; + sendcmdto_channel_butserv_butone(&me, CMD_MODE, chan, NULL, 0, + "%H +d", chan); + sendcmdto_channel_servers_butone(&me, CMD_MODE, chan, NULL, 0, + "%H +d", chan); + } +} + /* checks whether a channel is nonpersistent with no users and deletes it * returns 1 if deleted, otherwise 0 */ diff --git a/ircd/m_names.c b/ircd/m_names.c index 16cee5c..41a48c7 100644 --- a/ircd/m_names.c +++ b/ircd/m_names.c @@ -106,6 +106,7 @@ * NAMES_DEL - Show join-delayed names list. * NAMES_EON - When OR'd with the other two, adds an 'End of Names' numeric * used by m_join + * NAMES_OPS - Only list oped (+o) or voiced (+v) users * */ @@ -165,6 +166,9 @@ 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)) + continue; if (needs_space) buf[idx++] = ' '; diff --git a/ircd/m_who.c b/ircd/m_who.c index 7f5277b..4368c4e 100644 --- a/ircd/m_who.c +++ b/ircd/m_who.c @@ -337,6 +337,8 @@ int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) continue; if ((acptr != sptr) && IsInvisibleJoin(member)) continue; + if((acptr != sptr) && (!IsChanOp(member) && !HasVoice(member) && (chptr->mode.mode & MODE_AUDITORIUM))) + continue; if (!(isthere || (SEE_USER(sptr, acptr, bitsel)))) continue; if (!Process(acptr)) /* This can't be moved before other checks */ diff --git a/ircd/send.c b/ircd/send.c index 9be6651..828b518 100644 --- a/ircd/send.c +++ b/ircd/send.c @@ -546,6 +546,7 @@ void sendcmdto_channel_butserv_butone(struct Client *from, const char *cmd, || IsZombie(member) || (skip & SKIP_DEAF && IsDeaf(member->user)) || (skip & SKIP_NONOPS && !IsChanOp(member)) + || (skip & SKIP_OPS && IsChanOp(member)) || (skip & SKIP_NONVOICES && !IsChanOp(member) && !HasVoice(member))) continue; send_buffer(member->user, mb, 0); @@ -588,6 +589,7 @@ void sendcmdto_channel_servers_butone(struct Client *from, const char *cmd, || cli_fd(cli_from(member->user)) < 0 || cli_sentalong(member->user) == sentalong_marker || (skip & SKIP_NONOPS && !IsChanOp(member)) + || (skip & SKIP_OPS && IsChanOp(member)) || (skip & SKIP_NONVOICES && !IsChanOp(member) && !HasVoice(member))) continue; cli_sentalong(member->user) = sentalong_marker; @@ -639,6 +641,7 @@ void sendcmdto_channel_butone(struct Client *from, const char *cmd, if (IsZombie(member) || (skip & SKIP_DEAF && IsDeaf(member->user)) || (skip & SKIP_NONOPS && !IsChanOp(member)) || + (skip & SKIP_OPS && IsChanOp(member)) || (skip & SKIP_NONVOICES && !IsChanOp(member) && !HasVoice(member)) || (skip & SKIP_BURST && IsBurstOrBurstAck(cli_from(member->user))) || cli_fd(cli_from(member->user)) < 0 || -- 2.20.1