2 # Parent c623cb9153f1b130586509af13b05e4e63880c7d
4 diff -r c623cb9153f1 include/channel.h
5 --- a/include/channel.h Fri Jul 19 20:29:32 2013 +0100
6 +++ b/include/channel.h Fri Jul 19 20:31:50 2013 +0100
9 #define MODE_NOQUITPARTS 0x800000
11 +#define MODE_NOMULTITARGET 0x1000000 /**< +T No multiple targets */
12 +#define MODE_MODERATENOREG 0x2000000 /**< +M Moderate unauthed users */
14 /** mode flags which take another parameter (With PARAmeterS)
16 #define MODE_WPARAS (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS)
18 /** Available Channel modes */
19 -#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdRcCNu" : "biklmnopstvrDdRcCNu"
20 +#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdRcCNuMT" : "biklmnopstvrDdRcCNuMT"
21 /** Available Channel modes that take parameters */
22 #define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUv" : "bklov"
24 diff -r c623cb9153f1 include/ircd_features.h
25 --- a/include/ircd_features.h Fri Jul 19 20:29:32 2013 +0100
26 +++ b/include/ircd_features.h Fri Jul 19 20:31:50 2013 +0100
33 /* Misc. random stuff */
35 diff -r c623cb9153f1 include/ircd_relay.h
36 --- a/include/ircd_relay.h Fri Jul 19 20:29:32 2013 +0100
37 +++ b/include/ircd_relay.h Fri Jul 19 20:31:50 2013 +0100
42 -extern void relay_channel_message(struct Client* sptr, const char* name, const char* text);
43 -extern void relay_channel_notice(struct Client* sptr, const char* name, const char* text);
44 +extern void relay_channel_message(struct Client* sptr, const char* name, const char* text, const int count);
45 +extern void relay_channel_notice(struct Client* sptr, const char* name, const char* text, const int count);
46 extern void relay_directed_message(struct Client* sptr, char* name, char* server, const char* text);
47 extern void relay_directed_notice(struct Client* sptr, char* name, char* server, const char* text);
48 extern void relay_masked_message(struct Client* sptr, const char* mask, const char* text);
49 diff -r c623cb9153f1 include/supported.h
50 --- a/include/supported.h Fri Jul 19 20:29:32 2013 +0100
51 +++ b/include/supported.h Fri Jul 19 20:31:50 2013 +0100
53 #define FEATURESVALUES2 NICKLEN, TOPICLEN, AWAYLEN, TOPICLEN, \
54 feature_int(FEAT_CHANNELLEN), CHANNELLEN, \
55 (feature_bool(FEAT_LOCAL_CHANNELS) ? "#&" : "#"), "(ov)@+", "@+", \
56 - (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdRucCN" : "b,k,l,imnpstrDdRucCN"), \
57 + (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdRucCNMT" : "b,k,l,imnpstrDdRucCNMT"), \
58 "rfc1459", feature_str(FEAT_NETWORK)
60 #endif /* INCLUDED_supported_h */
61 diff -r c623cb9153f1 ircd/channel.c
62 --- a/ircd/channel.c Fri Jul 19 20:29:32 2013 +0100
63 +++ b/ircd/channel.c Fri Jul 19 20:31:50 2013 +0100
67 /* If only logged in users may join and you're not one, you can't speak. */
68 - if (member->channel->mode.mode & MODE_REGONLY && !IsAccount(member->user))
69 + if (member->channel->mode.mode & (MODE_MODERATENOREG|MODE_REGONLY) && !IsAccount(member->user))
72 /* If you're banned then you can't speak either. */
76 if ((chptr->mode.mode & (MODE_NOPRIVMSGS|MODE_MODERATED)) ||
77 - ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(cptr)))
78 + ((chptr->mode.mode & (MODE_REGONLY|MODE_MODERATENOREG)) && !IsAccount(cptr)))
81 return !find_ban(cptr, chptr->banlist);
83 if (IsVoicedOrOpped(member))
85 if ((member->channel->mode.mode & MODE_MODERATED)
86 - || (member->channel->mode.mode & MODE_REGONLY && !IsAccount(cptr))
87 + || (member->channel->mode.mode & (MODE_MODERATENOREG|MODE_REGONLY) && !IsAccount(cptr))
89 return member->channel->chname;
93 if (chptr->mode.mode & MODE_DELJOINS)
95 + if (chptr->mode.mode & MODE_NOMULTITARGET)
97 + if (chptr->mode.mode & MODE_MODERATENOREG)
99 else if (MyUser(cptr) && (chptr->mode.mode & MODE_WASDELJOINS))
101 if (chptr->mode.mode & MODE_REGISTERED)
102 @@ -1292,7 +1296,9 @@
106 - MODE_NOQUITPARTS, 'u'
107 + MODE_NOQUITPARTS, 'u',
108 + MODE_NOMULTITARGET, 'T',
109 + MODE_MODERATENOREG, 'M'
112 unsigned int *flag_p;
113 @@ -1593,6 +1599,8 @@
117 + MODE_NOMULTITARGET, 'T',
118 + MODE_MODERATENOREG, 'M',
121 static int local_flags[] = {
122 @@ -2018,8 +2026,8 @@
124 mode &= (MODE_ADD | MODE_DEL | MODE_PRIVATE | MODE_SECRET | MODE_MODERATED |
125 MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY |
126 - MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_NOQUITPARTS |
127 - MODE_NOCOLOUR | MODE_NOCTCP | MODE_NONOTICE);
128 + MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_NOQUITPARTS | MODE_NOCOLOUR |
129 + MODE_NOCTCP | MODE_NONOTICE | MODE_NOMULTITARGET | MODE_MODERATENOREG );
131 if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */
133 @@ -2156,6 +2164,8 @@
137 + MODE_NOMULTITARGET, 'T',
138 + MODE_MODERATENOREG, 'M',
142 @@ -3312,6 +3322,8 @@
146 + MODE_NOMULTITARGET, 'T',
147 + MODE_MODERATENOREG, 'M',
151 diff -r c623cb9153f1 ircd/ircd_features.c
152 --- a/ircd/ircd_features.c Fri Jul 19 20:29:32 2013 +0100
153 +++ b/ircd/ircd_features.c Fri Jul 19 20:31:50 2013 +0100
154 @@ -404,10 +404,10 @@
155 F_B(HIS_STATS_s, 0, 1, 0),
156 F_B(HIS_STATS_t, 0, 1, 0),
157 F_B(HIS_STATS_T, 0, 1, 0),
158 - F_B(HIS_STATS_u, 0, 0, 0),
159 + F_B(HIS_STATS_u, 0, 1, 0),
160 F_B(HIS_STATS_U, 0, 1, 0),
161 F_B(HIS_STATS_v, 0, 1, 0),
162 - F_B(HIS_STATS_w, 0, 0, 0),
163 + F_B(HIS_STATS_w, 0, 1, 0),
164 F_B(HIS_STATS_x, 0, 1, 0),
165 F_B(HIS_STATS_y, 0, 1, 0),
166 F_B(HIS_STATS_z, 0, 1, 0),
168 F_S(HIS_SERVERINFO, 0, "The Undernet Underworld", feature_notify_serverinfo),
169 F_S(HIS_URLSERVERS, 0, "http://www.undernet.org/servers.php", 0),
170 F_B(HIS_USERGLINE, 0, 1, 0),
171 + F_B(HIS_LUSERS_ME, 0, 0, 0),
173 /* Misc. random stuff */
174 F_S(NETWORK, 0, "UnderNet", 0),
175 diff -r c623cb9153f1 ircd/ircd_relay.c
176 --- a/ircd/ircd_relay.c Fri Jul 19 20:29:32 2013 +0100
177 +++ b/ircd/ircd_relay.c Fri Jul 19 20:31:50 2013 +0100
179 * @param[in] sptr Client that originated the message.
180 * @param[in] name Name of target channel.
181 * @param[in] text %Message to relay.
182 + * @param[in] targetc Count of channels we're sending the message to.
184 -void relay_channel_message(struct Client* sptr, const char* name, const char* text)
185 +void relay_channel_message(struct Client* sptr, const char* name, const char* text, const int targetc)
187 struct Channel* chptr;
190 check_target_limit(sptr, chptr, chptr->chname, 0))
194 + if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1)) {
195 + send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr->chname);
200 if (chptr->mode.mode & MODE_NOCOLOUR)
201 for (ch=text;*ch;ch++)
203 * @param[in] sptr Client that originated the message.
204 * @param[in] name Name of target channel.
205 * @param[in] text %Message to relay.
206 + * @param[in] targetc Count of channels we're sending the notice to.
208 -void relay_channel_notice(struct Client* sptr, const char* name, const char* text)
209 +void relay_channel_notice(struct Client* sptr, const char* name, const char* text, const int targetc)
211 struct Channel* chptr;
214 if ((chptr->mode.mode & MODE_NONOTICE))
218 + if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1))
222 if (chptr->mode.mode & MODE_NOCOLOUR)
223 for (ch=text;*ch;ch++)
224 diff -r c623cb9153f1 ircd/m_clearmode.c
225 --- a/ircd/m_clearmode.c Fri Jul 19 20:29:32 2013 +0100
226 +++ b/ircd/m_clearmode.c Fri Jul 19 20:31:50 2013 +0100
231 + MODE_NOMULTITARGET, 'T',
232 + MODE_MODERATENOREG, 'M',
236 diff -r c623cb9153f1 ircd/m_lusers.c
237 --- a/ircd/m_lusers.c Fri Jul 19 20:29:32 2013 +0100
238 +++ b/ircd/m_lusers.c Fri Jul 19 20:31:50 2013 +0100
241 int m_lusers(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
244 int longoutput = MyUser(sptr) || IsOper(sptr);
246 if (hunt_server_cmd(sptr, CMD_LUSERS, cptr, feature_int(FEAT_HIS_REMOTE),
247 @@ -123,12 +124,13 @@
248 send_reply(sptr, RPL_LUSERUNKNOWN, UserStats.unknowns);
249 if (longoutput && UserStats.channels > 0)
250 send_reply(sptr, RPL_LUSERCHANNELS, UserStats.channels);
251 - send_reply(sptr, RPL_LUSERME, UserStats.local_clients,
252 - UserStats.local_servers);
253 + his = (feature_bool(FEAT_HIS_LUSERS_ME) && !IsOper(sptr));
254 + send_reply(sptr, RPL_LUSERME, his ? 1 : UserStats.local_clients,
255 + his ? 1 : UserStats.local_servers);
257 sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :Highest connection count: "
258 - "%d (%d clients)", sptr, max_connection_count,
260 + "%d (%d clients)", sptr, his ? 2 : max_connection_count,
261 + his ? 1 : max_client_count);
265 diff -r c623cb9153f1 ircd/m_notice.c
266 --- a/ircd/m_notice.c Fri Jul 19 20:29:32 2013 +0100
267 +++ b/ircd/m_notice.c Fri Jul 19 20:31:50 2013 +0100
273 char* vector[MAXTARGETS];
276 @@ -128,13 +129,21 @@
278 count = unique_name_vector(parv[1], ',', vector, MAXTARGETS);
281 + for (i = 0; i < count; ++i) {
284 + if (IsChannelPrefix(*name))
288 for (i = 0; i < count; ++i) {
293 if (IsChannelPrefix(*name)) {
294 - relay_channel_notice(sptr, name, parv[parc - 1]);
295 + relay_channel_notice(sptr, name, parv[parc - 1], chancount);
298 * we have to check for the '@' at least once no matter what we do
304 char* vector[MAXTARGETS];
306 assert(cptr == sptr);
307 @@ -218,13 +228,21 @@
309 count = unique_name_vector(parv[1], ',', vector, MAXTARGETS);
312 + for (i = 0; i < count; ++i) {
315 + if (IsChannelPrefix(*name))
319 for (i = 0; i < count; ++i) {
324 if (IsChannelPrefix(*name))
325 - relay_channel_notice(sptr, name, parv[parc - 1]);
326 + relay_channel_notice(sptr, name, parv[parc - 1], chancount);
328 else if (*name == '$')
329 relay_masked_notice(sptr, name, parv[parc - 1]);
330 diff -r c623cb9153f1 ircd/m_privmsg.c
331 --- a/ircd/m_privmsg.c Fri Jul 19 20:29:32 2013 +0100
332 +++ b/ircd/m_privmsg.c Fri Jul 19 20:31:50 2013 +0100
338 char* vector[MAXTARGETS];
341 @@ -125,13 +126,21 @@
343 count = unique_name_vector(parv[1], ',', vector, MAXTARGETS);
346 + for (i = 0; i < count; ++i) {
349 + if (IsChannelPrefix(*name))
353 for (i = 0; i < count; ++i) {
358 if (IsChannelPrefix(*name)) {
359 - relay_channel_message(sptr, name, parv[parc - 1]);
360 + relay_channel_message(sptr, name, parv[parc - 1], chancount);
363 * we have to check for the '@' at least once no matter what we do
369 char* vector[MAXTARGETS];
371 assert(cptr == sptr);
372 @@ -215,13 +225,21 @@
374 count = unique_name_vector(parv[1], ',', vector, MAXTARGETS);
377 + for (i = 0; i < count; ++i) {
380 + if (IsChannelPrefix(*name))
384 for (i = 0; i < count; ++i) {
389 if (IsChannelPrefix(*name))
390 - relay_channel_message(sptr, name, parv[parc - 1]);
391 + relay_channel_message(sptr, name, parv[parc - 1], chancount);
393 else if (*name == '$')
394 relay_masked_message(sptr, name, parv[parc - 1]);