]>
Commit | Line | Data |
---|---|---|
edb26b39 P |
1 | # HG changeset patch |
2 | # Parent c623cb9153f1b130586509af13b05e4e63880c7d | |
3 | ||
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 | |
7 | @@ -118,12 +118,15 @@ | |
8 | * pending */ | |
9 | #define MODE_NOQUITPARTS 0x800000 | |
10 | ||
11 | +#define MODE_NOMULTITARGET 0x1000000 /**< +T No multiple targets */ | |
12 | +#define MODE_MODERATENOREG 0x2000000 /**< +M Moderate unauthed users */ | |
13 | + | |
14 | /** mode flags which take another parameter (With PARAmeterS) | |
15 | */ | |
16 | #define MODE_WPARAS (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS) | |
17 | ||
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" | |
23 | ||
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 | |
27 | @@ -165,6 +165,7 @@ | |
28 | FEAT_HIS_SERVERINFO, | |
29 | FEAT_HIS_URLSERVERS, | |
30 | FEAT_HIS_USERGLINE, | |
31 | + FEAT_HIS_LUSERS_ME, | |
32 | ||
33 | /* Misc. random stuff */ | |
34 | FEAT_NETWORK, | |
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 | |
38 | @@ -29,8 +29,8 @@ | |
39 | ||
40 | struct Client; | |
41 | ||
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 | |
52 | @@ -65,7 +65,7 @@ | |
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) | |
59 | ||
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 | |
64 | @@ -708,7 +708,7 @@ | |
65 | return 0; | |
66 | ||
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)) | |
70 | return 0; | |
71 | ||
72 | /* If you're banned then you can't speak either. */ | |
73 | @@ -754,7 +754,7 @@ | |
74 | */ | |
75 | if (!member) { | |
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))) | |
79 | return 0; | |
80 | else | |
81 | return !find_ban(cptr, chptr->banlist); | |
82 | @@ -780,7 +780,7 @@ | |
83 | if (IsVoicedOrOpped(member)) | |
84 | continue; | |
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)) | |
88 | || is_banned(member)) | |
89 | return member->channel->chname; | |
90 | } | |
91 | @@ -838,6 +838,10 @@ | |
92 | *mbuf++ = 'u'; | |
93 | if (chptr->mode.mode & MODE_DELJOINS) | |
94 | *mbuf++ = 'D'; | |
95 | + if (chptr->mode.mode & MODE_NOMULTITARGET) | |
96 | + *mbuf++ = 'T'; | |
97 | + if (chptr->mode.mode & MODE_MODERATENOREG) | |
98 | + *mbuf++ = 'M'; | |
99 | else if (MyUser(cptr) && (chptr->mode.mode & MODE_WASDELJOINS)) | |
100 | *mbuf++ = 'd'; | |
101 | if (chptr->mode.mode & MODE_REGISTERED) | |
102 | @@ -1292,7 +1296,9 @@ | |
103 | MODE_NOCTCP, 'C', | |
104 | MODE_NONOTICE, 'N', | |
105 | MODE_DELJOINS, 'D', | |
106 | - MODE_NOQUITPARTS, 'u' | |
107 | + MODE_NOQUITPARTS, 'u', | |
108 | + MODE_NOMULTITARGET, 'T', | |
109 | + MODE_MODERATENOREG, 'M' | |
110 | }; | |
111 | ||
112 | unsigned int *flag_p; | |
113 | @@ -1593,6 +1599,8 @@ | |
114 | MODE_NOCOLOUR, 'c', | |
115 | MODE_NOCTCP, 'C', | |
116 | MODE_NONOTICE, 'N', | |
117 | + MODE_NOMULTITARGET, 'T', | |
118 | + MODE_MODERATENOREG, 'M', | |
119 | 0x0, 0x0 | |
120 | }; | |
121 | static int local_flags[] = { | |
122 | @@ -2018,8 +2026,8 @@ | |
123 | ||
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 ); | |
130 | ||
131 | if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */ | |
132 | return; | |
133 | @@ -2156,6 +2164,8 @@ | |
134 | MODE_NOCOLOUR, 'c', | |
135 | MODE_NOCTCP, 'C', | |
136 | MODE_NONOTICE, 'N', | |
137 | + MODE_NOMULTITARGET, 'T', | |
138 | + MODE_MODERATENOREG, 'M', | |
139 | 0x0, 0x0 | |
140 | }; | |
141 | unsigned int add; | |
142 | @@ -3312,6 +3322,8 @@ | |
143 | MODE_NOCOLOUR, 'c', | |
144 | MODE_NOCTCP, 'C', | |
145 | MODE_NONOTICE, 'N', | |
146 | + MODE_NOMULTITARGET, 'T', | |
147 | + MODE_MODERATENOREG, 'M', | |
148 | MODE_ADD, '+', | |
149 | MODE_DEL, '-', | |
150 | 0x0, 0x0 | |
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), | |
167 | @@ -430,6 +430,7 @@ | |
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), | |
172 | ||
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 | |
178 | @@ -82,8 +82,9 @@ | |
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. | |
183 | */ | |
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) | |
186 | { | |
187 | struct Channel* chptr; | |
188 | const char *ch; | |
189 | @@ -106,6 +107,12 @@ | |
190 | check_target_limit(sptr, chptr, chptr->chname, 0)) | |
191 | return; | |
192 | ||
193 | + /* +T check */ | |
194 | + if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1)) { | |
195 | + send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr->chname); | |
196 | + return; | |
197 | + } | |
198 | + | |
199 | /* +cC checks */ | |
200 | if (chptr->mode.mode & MODE_NOCOLOUR) | |
201 | for (ch=text;*ch;ch++) | |
202 | @@ -131,8 +138,9 @@ | |
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. | |
207 | */ | |
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) | |
210 | { | |
211 | struct Channel* chptr; | |
212 | const char *ch; | |
213 | @@ -155,6 +163,10 @@ | |
214 | if ((chptr->mode.mode & MODE_NONOTICE)) | |
215 | return; | |
216 | ||
217 | + /* +T check */ | |
218 | + if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1)) | |
219 | + return; | |
220 | + | |
221 | /* +cC checks */ | |
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 | |
227 | @@ -128,6 +128,8 @@ | |
228 | MODE_NOCOLOUR, 'c', | |
229 | MODE_NOCTCP, 'C', | |
230 | MODE_NONOTICE, 'N', | |
231 | + MODE_NOMULTITARGET, 'T', | |
232 | + MODE_MODERATENOREG, 'M', | |
233 | 0x0, 0x0 | |
234 | }; | |
235 | int *flag_p; | |
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 | |
239 | @@ -106,6 +106,7 @@ | |
240 | */ | |
241 | int m_lusers(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) | |
242 | { | |
243 | + int his; | |
244 | int longoutput = MyUser(sptr) || IsOper(sptr); | |
245 | if (parc > 2) | |
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); | |
256 | ||
257 | sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :Highest connection count: " | |
258 | - "%d (%d clients)", sptr, max_connection_count, | |
259 | - max_client_count); | |
260 | + "%d (%d clients)", sptr, his ? 2 : max_connection_count, | |
261 | + his ? 1 : max_client_count); | |
262 | ||
263 | return 0; | |
264 | } | |
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 | |
268 | @@ -108,6 +108,7 @@ | |
269 | char* server; | |
270 | int i; | |
271 | int count; | |
272 | + int chancount; | |
273 | char* vector[MAXTARGETS]; | |
274 | ||
275 | assert(0 != cptr); | |
276 | @@ -128,13 +129,21 @@ | |
277 | ||
278 | count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); | |
279 | ||
280 | + chancount = 0; | |
281 | + for (i = 0; i < count; ++i) { | |
282 | + name = vector[i]; | |
283 | + | |
284 | + if (IsChannelPrefix(*name)) | |
285 | + chancount++; | |
286 | + } | |
287 | + | |
288 | for (i = 0; i < count; ++i) { | |
289 | name = vector[i]; | |
290 | /* | |
291 | * channel msg? | |
292 | */ | |
293 | if (IsChannelPrefix(*name)) { | |
294 | - relay_channel_notice(sptr, name, parv[parc - 1]); | |
295 | + relay_channel_notice(sptr, name, parv[parc - 1], chancount); | |
296 | } | |
297 | /* | |
298 | * we have to check for the '@' at least once no matter what we do | |
299 | @@ -199,6 +208,7 @@ | |
300 | char* server; | |
301 | int i; | |
302 | int count; | |
303 | + int chancount; | |
304 | char* vector[MAXTARGETS]; | |
305 | assert(0 != cptr); | |
306 | assert(cptr == sptr); | |
307 | @@ -218,13 +228,21 @@ | |
308 | ||
309 | count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); | |
310 | ||
311 | + chancount = 0; | |
312 | + for (i = 0; i < count; ++i) { | |
313 | + name = vector[i]; | |
314 | + | |
315 | + if (IsChannelPrefix(*name)) | |
316 | + chancount++; | |
317 | + } | |
318 | + | |
319 | for (i = 0; i < count; ++i) { | |
320 | name = vector[i]; | |
321 | /* | |
322 | * channel msg? | |
323 | */ | |
324 | if (IsChannelPrefix(*name)) | |
325 | - relay_channel_notice(sptr, name, parv[parc - 1]); | |
326 | + relay_channel_notice(sptr, name, parv[parc - 1], chancount); | |
327 | ||
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 | |
333 | @@ -106,6 +106,7 @@ | |
334 | char* server; | |
335 | int i; | |
336 | int count; | |
337 | + int chancount; | |
338 | char* vector[MAXTARGETS]; | |
339 | ||
340 | assert(0 != cptr); | |
341 | @@ -125,13 +126,21 @@ | |
342 | ||
343 | count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); | |
344 | ||
345 | + chancount = 0; | |
346 | + for (i = 0; i < count; ++i) { | |
347 | + name = vector[i]; | |
348 | + | |
349 | + if (IsChannelPrefix(*name)) | |
350 | + chancount++; | |
351 | + } | |
352 | + | |
353 | for (i = 0; i < count; ++i) { | |
354 | name = vector[i]; | |
355 | /* | |
356 | * channel msg? | |
357 | */ | |
358 | if (IsChannelPrefix(*name)) { | |
359 | - relay_channel_message(sptr, name, parv[parc - 1]); | |
360 | + relay_channel_message(sptr, name, parv[parc - 1], chancount); | |
361 | } | |
362 | /* | |
363 | * we have to check for the '@' at least once no matter what we do | |
364 | @@ -197,6 +206,7 @@ | |
365 | char* server; | |
366 | int i; | |
367 | int count; | |
368 | + int chancount; | |
369 | char* vector[MAXTARGETS]; | |
370 | assert(0 != cptr); | |
371 | assert(cptr == sptr); | |
372 | @@ -215,13 +225,21 @@ | |
373 | ||
374 | count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); | |
375 | ||
376 | + chancount = 0; | |
377 | + for (i = 0; i < count; ++i) { | |
378 | + name = vector[i]; | |
379 | + | |
380 | + if (IsChannelPrefix(*name)) | |
381 | + chancount++; | |
382 | + } | |
383 | + | |
384 | for (i = 0; i < count; ++i) { | |
385 | name = vector[i]; | |
386 | /* | |
387 | * channel msg? | |
388 | */ | |
389 | if (IsChannelPrefix(*name)) | |
390 | - relay_channel_message(sptr, name, parv[parc - 1]); | |
391 | + relay_channel_message(sptr, name, parv[parc - 1], chancount); | |
392 | ||
393 | else if (*name == '$') | |
394 | relay_masked_message(sptr, name, parv[parc - 1]); |