]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blame - chanmodeM.patch
rename patch files
[irc/quakenet/snircd-patchqueue.git] / chanmodeM.patch
CommitLineData
edb26b39
P
1# HG changeset patch
2# Parent c623cb9153f1b130586509af13b05e4e63880c7d
3
4diff -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
24diff -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,
35diff -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);
49diff -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 */
61diff -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
151diff -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),
175diff -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++)
224diff -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;
236diff -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 }
265diff -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]);
330diff -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]);