# HG changeset patch # Parent c623cb9153f1b130586509af13b05e4e63880c7d diff -r c623cb9153f1 include/channel.h --- a/include/channel.h Fri Jul 19 20:29:32 2013 +0100 +++ b/include/channel.h Fri Jul 19 20:31:50 2013 +0100 @@ -118,12 +118,15 @@ * pending */ #define MODE_NOQUITPARTS 0x800000 +#define MODE_NOMULTITARGET 0x1000000 /**< +T No multiple targets */ +#define MODE_MODERATENOREG 0x2000000 /**< +M Moderate unauthed users */ + /** 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) /** Available Channel modes */ -#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdRcCNu" : "biklmnopstvrDdRcCNu" +#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdRcCNuMT" : "biklmnopstvrDdRcCNuMT" /** Available Channel modes that take parameters */ #define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUv" : "bklov" diff -r c623cb9153f1 include/ircd_features.h --- a/include/ircd_features.h Fri Jul 19 20:29:32 2013 +0100 +++ b/include/ircd_features.h Fri Jul 19 20:31:50 2013 +0100 @@ -165,6 +165,7 @@ FEAT_HIS_SERVERINFO, FEAT_HIS_URLSERVERS, FEAT_HIS_USERGLINE, + FEAT_HIS_LUSERS_ME, /* Misc. random stuff */ FEAT_NETWORK, diff -r c623cb9153f1 include/ircd_relay.h --- a/include/ircd_relay.h Fri Jul 19 20:29:32 2013 +0100 +++ b/include/ircd_relay.h Fri Jul 19 20:31:50 2013 +0100 @@ -29,8 +29,8 @@ struct Client; -extern void relay_channel_message(struct Client* sptr, const char* name, const char* text); -extern void relay_channel_notice(struct Client* sptr, const char* name, const char* text); +extern void relay_channel_message(struct Client* sptr, const char* name, const char* text, const int count); +extern void relay_channel_notice(struct Client* sptr, const char* name, const char* text, const int count); extern void relay_directed_message(struct Client* sptr, char* name, char* server, const char* text); extern void relay_directed_notice(struct Client* sptr, char* name, char* server, const char* text); extern void relay_masked_message(struct Client* sptr, const char* mask, const char* text); diff -r c623cb9153f1 include/supported.h --- a/include/supported.h Fri Jul 19 20:29:32 2013 +0100 +++ b/include/supported.h Fri Jul 19 20:31:50 2013 +0100 @@ -65,7 +65,7 @@ #define FEATURESVALUES2 NICKLEN, TOPICLEN, AWAYLEN, TOPICLEN, \ feature_int(FEAT_CHANNELLEN), CHANNELLEN, \ (feature_bool(FEAT_LOCAL_CHANNELS) ? "#&" : "#"), "(ov)@+", "@+", \ - (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdRucCN" : "b,k,l,imnpstrDdRucCN"), \ + (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdRucCNMT" : "b,k,l,imnpstrDdRucCNMT"), \ "rfc1459", feature_str(FEAT_NETWORK) #endif /* INCLUDED_supported_h */ diff -r c623cb9153f1 ircd/channel.c --- a/ircd/channel.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/channel.c Fri Jul 19 20:31:50 2013 +0100 @@ -708,7 +708,7 @@ return 0; /* If only logged in users may join and you're not one, you can't speak. */ - if (member->channel->mode.mode & MODE_REGONLY && !IsAccount(member->user)) + if (member->channel->mode.mode & (MODE_MODERATENOREG|MODE_REGONLY) && !IsAccount(member->user)) return 0; /* If you're banned then you can't speak either. */ @@ -754,7 +754,7 @@ */ if (!member) { if ((chptr->mode.mode & (MODE_NOPRIVMSGS|MODE_MODERATED)) || - ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(cptr))) + ((chptr->mode.mode & (MODE_REGONLY|MODE_MODERATENOREG)) && !IsAccount(cptr))) return 0; else return !find_ban(cptr, chptr->banlist); @@ -780,7 +780,7 @@ if (IsVoicedOrOpped(member)) continue; if ((member->channel->mode.mode & MODE_MODERATED) - || (member->channel->mode.mode & MODE_REGONLY && !IsAccount(cptr)) + || (member->channel->mode.mode & (MODE_MODERATENOREG|MODE_REGONLY) && !IsAccount(cptr)) || is_banned(member)) return member->channel->chname; } @@ -838,6 +838,10 @@ *mbuf++ = 'u'; if (chptr->mode.mode & MODE_DELJOINS) *mbuf++ = 'D'; + if (chptr->mode.mode & MODE_NOMULTITARGET) + *mbuf++ = 'T'; + if (chptr->mode.mode & MODE_MODERATENOREG) + *mbuf++ = 'M'; else if (MyUser(cptr) && (chptr->mode.mode & MODE_WASDELJOINS)) *mbuf++ = 'd'; if (chptr->mode.mode & MODE_REGISTERED) @@ -1292,7 +1296,9 @@ MODE_NOCTCP, 'C', MODE_NONOTICE, 'N', MODE_DELJOINS, 'D', - MODE_NOQUITPARTS, 'u' + MODE_NOQUITPARTS, 'u', + MODE_NOMULTITARGET, 'T', + MODE_MODERATENOREG, 'M' }; unsigned int *flag_p; @@ -1593,6 +1599,8 @@ MODE_NOCOLOUR, 'c', MODE_NOCTCP, 'C', MODE_NONOTICE, 'N', + MODE_NOMULTITARGET, 'T', + MODE_MODERATENOREG, 'M', 0x0, 0x0 }; static int local_flags[] = { @@ -2018,8 +2026,8 @@ 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_NOQUITPARTS | - MODE_NOCOLOUR | MODE_NOCTCP | MODE_NONOTICE); + MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_NOQUITPARTS | MODE_NOCOLOUR | + MODE_NOCTCP | MODE_NONOTICE | MODE_NOMULTITARGET | MODE_MODERATENOREG ); if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */ return; @@ -2156,6 +2164,8 @@ MODE_NOCOLOUR, 'c', MODE_NOCTCP, 'C', MODE_NONOTICE, 'N', + MODE_NOMULTITARGET, 'T', + MODE_MODERATENOREG, 'M', 0x0, 0x0 }; unsigned int add; @@ -3312,6 +3322,8 @@ MODE_NOCOLOUR, 'c', MODE_NOCTCP, 'C', MODE_NONOTICE, 'N', + MODE_NOMULTITARGET, 'T', + MODE_MODERATENOREG, 'M', MODE_ADD, '+', MODE_DEL, '-', 0x0, 0x0 diff -r c623cb9153f1 ircd/ircd_features.c --- a/ircd/ircd_features.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/ircd_features.c Fri Jul 19 20:31:50 2013 +0100 @@ -404,10 +404,10 @@ F_B(HIS_STATS_s, 0, 1, 0), F_B(HIS_STATS_t, 0, 1, 0), F_B(HIS_STATS_T, 0, 1, 0), - F_B(HIS_STATS_u, 0, 0, 0), + F_B(HIS_STATS_u, 0, 1, 0), F_B(HIS_STATS_U, 0, 1, 0), F_B(HIS_STATS_v, 0, 1, 0), - F_B(HIS_STATS_w, 0, 0, 0), + F_B(HIS_STATS_w, 0, 1, 0), F_B(HIS_STATS_x, 0, 1, 0), F_B(HIS_STATS_y, 0, 1, 0), F_B(HIS_STATS_z, 0, 1, 0), @@ -430,6 +430,7 @@ F_S(HIS_SERVERINFO, 0, "The Undernet Underworld", feature_notify_serverinfo), F_S(HIS_URLSERVERS, 0, "http://www.undernet.org/servers.php", 0), F_B(HIS_USERGLINE, 0, 1, 0), + F_B(HIS_LUSERS_ME, 0, 0, 0), /* Misc. random stuff */ F_S(NETWORK, 0, "UnderNet", 0), diff -r c623cb9153f1 ircd/ircd_relay.c --- a/ircd/ircd_relay.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/ircd_relay.c Fri Jul 19 20:31:50 2013 +0100 @@ -82,8 +82,9 @@ * @param[in] sptr Client that originated the message. * @param[in] name Name of target channel. * @param[in] text %Message to relay. + * @param[in] targetc Count of channels we're sending the message to. */ -void relay_channel_message(struct Client* sptr, const char* name, const char* text) +void relay_channel_message(struct Client* sptr, const char* name, const char* text, const int targetc) { struct Channel* chptr; const char *ch; @@ -106,6 +107,12 @@ check_target_limit(sptr, chptr, chptr->chname, 0)) return; + /* +T check */ + if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1)) { + send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr->chname); + return; + } + /* +cC checks */ if (chptr->mode.mode & MODE_NOCOLOUR) for (ch=text;*ch;ch++) @@ -131,8 +138,9 @@ * @param[in] sptr Client that originated the message. * @param[in] name Name of target channel. * @param[in] text %Message to relay. + * @param[in] targetc Count of channels we're sending the notice to. */ -void relay_channel_notice(struct Client* sptr, const char* name, const char* text) +void relay_channel_notice(struct Client* sptr, const char* name, const char* text, const int targetc) { struct Channel* chptr; const char *ch; @@ -155,6 +163,10 @@ if ((chptr->mode.mode & MODE_NONOTICE)) return; + /* +T check */ + if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1)) + return; + /* +cC checks */ if (chptr->mode.mode & MODE_NOCOLOUR) for (ch=text;*ch;ch++) diff -r c623cb9153f1 ircd/m_clearmode.c --- a/ircd/m_clearmode.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/m_clearmode.c Fri Jul 19 20:31:50 2013 +0100 @@ -128,6 +128,8 @@ MODE_NOCOLOUR, 'c', MODE_NOCTCP, 'C', MODE_NONOTICE, 'N', + MODE_NOMULTITARGET, 'T', + MODE_MODERATENOREG, 'M', 0x0, 0x0 }; int *flag_p; diff -r c623cb9153f1 ircd/m_lusers.c --- a/ircd/m_lusers.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/m_lusers.c Fri Jul 19 20:31:50 2013 +0100 @@ -106,6 +106,7 @@ */ int m_lusers(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { + int his; int longoutput = MyUser(sptr) || IsOper(sptr); if (parc > 2) if (hunt_server_cmd(sptr, CMD_LUSERS, cptr, feature_int(FEAT_HIS_REMOTE), @@ -123,12 +124,13 @@ send_reply(sptr, RPL_LUSERUNKNOWN, UserStats.unknowns); if (longoutput && UserStats.channels > 0) send_reply(sptr, RPL_LUSERCHANNELS, UserStats.channels); - send_reply(sptr, RPL_LUSERME, UserStats.local_clients, - UserStats.local_servers); + his = (feature_bool(FEAT_HIS_LUSERS_ME) && !IsOper(sptr)); + send_reply(sptr, RPL_LUSERME, his ? 1 : UserStats.local_clients, + his ? 1 : UserStats.local_servers); sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :Highest connection count: " - "%d (%d clients)", sptr, max_connection_count, - max_client_count); + "%d (%d clients)", sptr, his ? 2 : max_connection_count, + his ? 1 : max_client_count); return 0; } diff -r c623cb9153f1 ircd/m_notice.c --- a/ircd/m_notice.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/m_notice.c Fri Jul 19 20:31:50 2013 +0100 @@ -108,6 +108,7 @@ char* server; int i; int count; + int chancount; char* vector[MAXTARGETS]; assert(0 != cptr); @@ -128,13 +129,21 @@ count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); + chancount = 0; + for (i = 0; i < count; ++i) { + name = vector[i]; + + if (IsChannelPrefix(*name)) + chancount++; + } + for (i = 0; i < count; ++i) { name = vector[i]; /* * channel msg? */ if (IsChannelPrefix(*name)) { - relay_channel_notice(sptr, name, parv[parc - 1]); + relay_channel_notice(sptr, name, parv[parc - 1], chancount); } /* * we have to check for the '@' at least once no matter what we do @@ -199,6 +208,7 @@ char* server; int i; int count; + int chancount; char* vector[MAXTARGETS]; assert(0 != cptr); assert(cptr == sptr); @@ -218,13 +228,21 @@ count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); + chancount = 0; + for (i = 0; i < count; ++i) { + name = vector[i]; + + if (IsChannelPrefix(*name)) + chancount++; + } + for (i = 0; i < count; ++i) { name = vector[i]; /* * channel msg? */ if (IsChannelPrefix(*name)) - relay_channel_notice(sptr, name, parv[parc - 1]); + relay_channel_notice(sptr, name, parv[parc - 1], chancount); else if (*name == '$') relay_masked_notice(sptr, name, parv[parc - 1]); diff -r c623cb9153f1 ircd/m_privmsg.c --- a/ircd/m_privmsg.c Fri Jul 19 20:29:32 2013 +0100 +++ b/ircd/m_privmsg.c Fri Jul 19 20:31:50 2013 +0100 @@ -106,6 +106,7 @@ char* server; int i; int count; + int chancount; char* vector[MAXTARGETS]; assert(0 != cptr); @@ -125,13 +126,21 @@ count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); + chancount = 0; + for (i = 0; i < count; ++i) { + name = vector[i]; + + if (IsChannelPrefix(*name)) + chancount++; + } + for (i = 0; i < count; ++i) { name = vector[i]; /* * channel msg? */ if (IsChannelPrefix(*name)) { - relay_channel_message(sptr, name, parv[parc - 1]); + relay_channel_message(sptr, name, parv[parc - 1], chancount); } /* * we have to check for the '@' at least once no matter what we do @@ -197,6 +206,7 @@ char* server; int i; int count; + int chancount; char* vector[MAXTARGETS]; assert(0 != cptr); assert(cptr == sptr); @@ -215,13 +225,21 @@ count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); + chancount = 0; + for (i = 0; i < count; ++i) { + name = vector[i]; + + if (IsChannelPrefix(*name)) + chancount++; + } + for (i = 0; i < count; ++i) { name = vector[i]; /* * channel msg? */ if (IsChannelPrefix(*name)) - relay_channel_message(sptr, name, parv[parc - 1]); + relay_channel_message(sptr, name, parv[parc - 1], chancount); else if (*name == '$') relay_masked_message(sptr, name, parv[parc - 1]);