2 # Parent 450ce608fb5cb90722bed3601ea5d424664796c6
4 diff -r 450ce608fb5c include/channel.h
5 --- a/include/channel.h Sat Jul 20 14:47:02 2013 +0100
6 +++ b/include/channel.h Sat Jul 20 14:47:57 2013 +0100
8 #define MODE_LIMIT 0x0400 /**< +l Limit */
9 #define MODE_REGONLY 0x0800 /**< Only +r users may join */
10 #define MODE_DELJOINS 0x1000 /**< New join messages are delayed */
11 -#define MODE_REGISTERED 0x2000 /**< Channel marked as registered
12 - * (for future semantic expansion) */
13 +#define MODE_REGISTERED 0x2000 /**< Channel marked as registered
14 + * (for future semantic expansion) */
15 +#define MODE_NOCOLOUR 0x4000 /**< No mIRC/ANSI colors/bold */
16 +#define MODE_NOCTCP 0x8000 /**< No channel CTCPs */
17 +#define MODE_NONOTICE 0x10000 /**< No channel notices */
19 #define MODE_SAVE 0x20000 /**< save this mode-with-arg 'til
21 #define MODE_FREE 0x40000 /**< string needs to be passed to
23 #define MODE_WPARAS (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS)
25 /** Available Channel modes */
26 -#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdR" : "biklmnopstvrDdR"
27 +#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdRcCNu" : "biklmnopstvrDdRcCNu"
28 /** Available Channel modes that take parameters */
29 #define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUv" : "bklov"
31 diff -r 450ce608fb5c include/supported.h
32 --- a/include/supported.h Sat Jul 20 14:47:02 2013 +0100
33 +++ b/include/supported.h Sat Jul 20 14:47:57 2013 +0100
35 #define FEATURESVALUES2 NICKLEN, TOPICLEN, AWAYLEN, TOPICLEN, \
36 feature_int(FEAT_CHANNELLEN), CHANNELLEN, \
37 (feature_bool(FEAT_LOCAL_CHANNELS) ? "#&" : "#"), "(ov)@+", "@+", \
38 - (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdRu" : "b,k,l,imnpstrDdRu"), \
39 + (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdRucCN" : "b,k,l,imnpstrDdRucCN"), \
40 "rfc1459", feature_str(FEAT_NETWORK)
42 #endif /* INCLUDED_supported_h */
43 diff -r 450ce608fb5c ircd/channel.c
44 --- a/ircd/channel.c Sat Jul 20 14:47:02 2013 +0100
45 +++ b/ircd/channel.c Sat Jul 20 14:47:57 2013 +0100
48 if (chptr->mode.mode & MODE_REGONLY)
50 + if (chptr->mode.mode & MODE_NOCOLOUR)
52 + if (chptr->mode.mode & MODE_NOCTCP)
54 + if (chptr->mode.mode & MODE_NONOTICE)
56 if (chptr->mode.mode & MODE_NOQUITPARTS)
58 if (chptr->mode.mode & MODE_DELJOINS)
63 -/* MODE_NOCOLOUR, 'c',
66 - MODE_NONOTICE, 'N',*/
72 /* MODE_APASS, 'A', */
73 /* MODE_UPASS, 'U', */
74 MODE_NOQUITPARTS, 'u',
80 static int local_flags[] = {
83 mode &= (MODE_ADD | MODE_DEL | MODE_PRIVATE | MODE_SECRET | MODE_MODERATED |
84 MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY |
85 - MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_NOQUITPARTS);
86 + MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_NOQUITPARTS |
87 + MODE_NOCOLOUR | MODE_NOCTCP | MODE_NONOTICE);
89 if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */
94 MODE_NOQUITPARTS, 'u',
101 @@ -3303,6 +3316,9 @@
104 MODE_NOQUITPARTS, 'u',
105 + MODE_NOCOLOUR, 'c',
107 + MODE_NONOTICE, 'N',
111 diff -r 450ce608fb5c ircd/ircd_relay.c
112 --- a/ircd/ircd_relay.c Sat Jul 20 14:47:02 2013 +0100
113 +++ b/ircd/ircd_relay.c Sat Jul 20 14:47:57 2013 +0100
115 void relay_channel_message(struct Client* sptr, const char* name, const char* text)
117 struct Channel* chptr;
123 check_target_limit(sptr, chptr, chptr->chname, 0))
127 + if (chptr->mode.mode & MODE_NOCOLOUR)
128 + for (ch=text;*ch;ch++)
129 + if (*ch==2 || *ch==3 || *ch==22 || *ch==27 || *ch==31) {
130 + send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr->chname);
134 + if ((chptr->mode.mode & MODE_NOCTCP) && ircd_strncmp(text,"\001ACTION ",8))
137 + send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr->chname);
141 RevealDelayedJoinIfNeeded(sptr, chptr);
142 sendcmdto_channel_butone(sptr, CMD_PRIVATE, chptr, cli_from(sptr),
143 SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text);
145 void relay_channel_notice(struct Client* sptr, const char* name, const char* text)
147 struct Channel* chptr;
153 check_target_limit(sptr, chptr, chptr->chname, 0))
156 + if ((chptr->mode.mode & MODE_NONOTICE))
160 + if (chptr->mode.mode & MODE_NOCOLOUR)
161 + for (ch=text;*ch;ch++)
162 + if (*ch==2 || *ch==3 || *ch==22 || *ch==27 || *ch==31)
165 + if (chptr->mode.mode & MODE_NOCTCP)
170 RevealDelayedJoinIfNeeded(sptr, chptr);
171 sendcmdto_channel_butone(sptr, CMD_NOTICE, chptr, cli_from(sptr),
172 SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text);
173 diff -r 450ce608fb5c ircd/m_clearmode.c
174 --- a/ircd/m_clearmode.c Sat Jul 20 14:47:02 2013 +0100
175 +++ b/ircd/m_clearmode.c Sat Jul 20 14:47:57 2013 +0100
179 MODE_NOQUITPARTS, 'u',
180 + MODE_NOCOLOUR, 'c',
182 + MODE_NONOTICE, 'N',
186 diff -r 450ce608fb5c ircd/m_wallchops.c
187 --- a/ircd/m_wallchops.c Sat Jul 20 14:47:02 2013 +0100
188 +++ b/ircd/m_wallchops.c Sat Jul 20 14:47:57 2013 +0100
190 int m_wallchops(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
192 struct Channel *chptr;
193 + struct Membership* member;
196 assert(cptr == sptr);
197 @@ -115,10 +116,24 @@
198 return send_reply(sptr, ERR_NOTEXTTOSEND);
200 if (IsChannelName(parv[1]) && (chptr = FindChannel(parv[1]))) {
201 - if (client_can_send_to_channel(sptr, chptr, 0)) {
202 + if (client_can_send_to_channel(sptr, chptr, 0) && !(chptr->mode.mode & MODE_NONOTICE)) {
203 if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
204 check_target_limit(sptr, chptr, chptr->chname, 0))
208 + if (chptr->mode.mode & MODE_NOCOLOUR)
209 + for (ch=parv[parc - 1];*ch;ch++)
210 + if (*ch==2 || *ch==3 || *ch==22 || *ch==27 || *ch==31) {
214 + if ((chptr->mode.mode & MODE_NOCTCP) && ircd_strncmp(parv[parc - 1],"\001ACTION ",8))
215 + for (ch=parv[parc - 1];*ch;)
220 RevealDelayedJoinIfNeeded(sptr, chptr);
221 sendcmdto_channel_butone(sptr, CMD_WALLCHOPS, chptr, cptr,
222 SKIP_DEAF | SKIP_BURST | SKIP_NONOPS,
226 if (!IsLocalChannel(parv[1]) && (chptr = FindChannel(parv[1]))) {
227 - if (client_can_send_to_channel(sptr, chptr, 1)) {
228 + if (client_can_send_to_channel(sptr, chptr, 0) && !(chptr->mode.mode & MODE_NONOTICE)) {
229 + RevealDelayedJoinIfNeeded(sptr, chptr);
230 sendcmdto_channel_butone(sptr, CMD_WALLCHOPS, chptr, cptr,
231 SKIP_DEAF | SKIP_BURST | SKIP_NONOPS,
232 "%H :%s", chptr, parv[parc - 1]);
233 diff -r 450ce608fb5c ircd/m_wallvoices.c
234 --- a/ircd/m_wallvoices.c Sat Jul 20 14:47:02 2013 +0100
235 +++ b/ircd/m_wallvoices.c Sat Jul 20 14:47:57 2013 +0100
237 int m_wallvoices(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
239 struct Channel *chptr;
240 + struct Membership* member;
243 assert(cptr == sptr);
244 @@ -114,10 +115,24 @@
245 return send_reply(sptr, ERR_NOTEXTTOSEND);
247 if (IsChannelName(parv[1]) && (chptr = FindChannel(parv[1]))) {
248 - if (client_can_send_to_channel(sptr, chptr, 0)) {
249 + if (client_can_send_to_channel(sptr, chptr, 0) && !(chptr->mode.mode & MODE_NONOTICE)) {
250 if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
251 check_target_limit(sptr, chptr, chptr->chname, 0))
255 + if (chptr->mode.mode & MODE_NOCOLOUR)
256 + for (ch=parv[parc - 1];*ch;ch++)
257 + if (*ch==2 || *ch==3 || *ch==22 || *ch==27 || *ch==31) {
261 + if ((chptr->mode.mode & MODE_NOCTCP) && ircd_strncmp(parv[parc - 1],"\001ACTION ",8))
262 + for (ch=parv[parc - 1];*ch;)
267 RevealDelayedJoinIfNeeded(sptr, chptr);
268 sendcmdto_channel_butone(sptr, CMD_WALLVOICES, chptr, cptr,
269 SKIP_DEAF | SKIP_BURST | SKIP_NONVOICES,
273 if (!IsLocalChannel(parv[1]) && (chptr = FindChannel(parv[1]))) {
274 - if (client_can_send_to_channel(sptr, chptr, 1)) {
275 + if (client_can_send_to_channel(sptr, chptr, 0) && !(chptr->mode.mode & MODE_NONOTICE)) {
276 + RevealDelayedJoinIfNeeded(sptr, chptr);
277 sendcmdto_channel_butone(sptr, CMD_WALLVOICES, chptr, cptr,
278 SKIP_DEAF | SKIP_BURST | SKIP_NONVOICES,
279 "%H :%s", chptr, parv[parc - 1]);
280 diff -r 450ce608fb5c ircd/s_auth.c
281 --- a/ircd/s_auth.c Sat Jul 20 14:47:02 2013 +0100
282 +++ b/ircd/s_auth.c Sat Jul 20 14:47:57 2013 +0100
284 || ((user->username[0] == '~') && (user->username[1] == '\0')))
285 return exit_client(sptr, sptr, &me, "USER: Bogus userid.");
287 + /* Have to set up "realusername" before doing the gline check below */
288 + ircd_strncpy(user->realusername, user->username, USERLEN);
290 /* Check for K- or G-line. */
291 killreason = find_kill(sptr, 1);