added MODE_AUDITORIUM (+u) to show only ops the full userlist
authorpk910 <philipp@zoelle1.de>
Tue, 28 Jun 2011 17:49:23 +0000 (19:49 +0200)
committerpk910 <philipp@zoelle1.de>
Tue, 28 Jun 2011 19:02:27 +0000 (21:02 +0200)
include/channel.h
include/s_user.h
include/send.h
ircd/channel.c
ircd/m_names.c
ircd/m_who.c
ircd/send.c

index af416d922ae3aa0f9a1b4eb9079fcd168d298289..6984250e62ea1dd9143d7df2abeaf3843b151dae 100644 (file)
@@ -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,
index bc365b59b4993d1fa5baa1c4376a4f24bd302595..7b1fc1800cd3733d8fb4d394ce8b282035e58f93 100644 (file)
@@ -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);
 
index 3d05ef9180881846a767f7c551544addb9660a3c..1fb416a9a5f7dce315a3efc4fcc6c191eba57302 100644 (file)
@@ -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, 
index fa8412e0528fb984b6e45daaa390aee215160b8b..714dbd24be173957cb2ad8c67fcd66431189badb 100644 (file)
@@ -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
  */
index 16cee5cac1b624879891b32d2d57277bbeb33c44..41a48c7f207cc00c69fc51304e65ae2fff98a3eb 100644 (file)
  *  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++] = ' ';
index 7f5277b44d83ae41a8ac74049d6b435bbb4b64a8..4368c4ea9995a484526dc172d1737d4743032f6b 100644 (file)
@@ -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 */
index 9be66519077b8088da5cd011afb386a8e21275ab..828b518b4cb1565bca4e1619070ca10862140e75 100644 (file)
@@ -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 ||