Commit Diff
Diff:
646218e6f4d936b7448b2b407ffb6a53650658de
53917fa4b80753fc189ed5a516c06c804f2cf415
Commit:
53917fa4b80753fc189ed5a516c06c804f2cf415
Tree:
0f91712252ec7b06dbcc6da31815ec76d71598c2
Author:
Alexander Barton <alex@barton.de>
Committer:
Alexander Barton <alex@barton.de>
Date:
Sat Nov 10 22:33:19 2012 UTC
Message:
Add new IRC+ server flag "X": "XOP modes supported" This flag indicates, that the server supports the enhanced "xop channel user modes", like channel owner, admin, and halfop. This information is used to make sure that no unsupported CHANINFO commands are sent to servers not supporting such mode prefixes, for example.
blob - 516a4a4c914bd45138c9cea81e19d6ba2e1d920d
blob + 9a8ddf6fdcefa96674200764876b7e7895cd2b74
--- doc/Protocol.txt
+++ doc/Protocol.txt
@@ -89,6 +89,9 @@ The following <serverflags> are defined at the moment:
- S: The server supports the SERVICE command (on this link).
+- X: Server supports XOP channel modes (owner, admin, halfop) and supports
+ these user prefixes in CHANINFO commands, for example.
+
- Z: Compressed server links are supported by the server.
Example for a complete <flags> string: "ngircd|0.7.5:CZ".
blob - b2de98d5e94a4627e0f7965d00ae86da0b10a887
blob + dcdd440c45b606f3c67d475f9fcc106d9c123532
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
@@ -157,7 +157,7 @@
#ifdef IRCPLUS
/** Standard IRC+ flags. */
-# define IRCPLUSFLAGS "CHLMS"
+# define IRCPLUSFLAGS "CHLMSX"
#endif
/** Supported user modes. */
blob - 3fc8c461bf73f1455731bf21f818a63455cd619d
blob + f48cc2147f470124cf120e0d9c063c23ce0ac8dc
--- src/ngircd/numeric.c
+++ src/ngircd/numeric.c
@@ -48,12 +48,11 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
CL2CHAN *cl2chan;
CLIENT *cl;
char str[LINE_LEN], *ptr;
- bool njoin;
+ bool njoin, xop;
- if (Conn_Options(Client_Conn(Client)) & CONN_RFC1459)
- njoin = false;
- else
- njoin = true;
+ /* Check features of remote server */
+ njoin = Conn_Options(Client_Conn(Client)) & CONN_RFC1459 ? false : true;
+ xop = strchr(Client_Flags(Client), 'X') ? true : false;
/* Get all the members of this channel */
cl2chan = Channel_FirstMember(Chan);
@@ -67,13 +66,15 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
* (if user is channel operator or has voice) */
if (str[strlen(str) - 1] != ':')
strlcat(str, ",", sizeof(str));
- if (strchr(Channel_UserModes(Chan, cl), 'q'))
+
+ /* Prepare user prefix (ChanOp, voiced, ...) */
+ if (xop && strchr(Channel_UserModes(Chan, cl), 'q'))
strlcat(str, "~", sizeof(str));
- if (strchr(Channel_UserModes(Chan, cl), 'a'))
+ if (xop && strchr(Channel_UserModes(Chan, cl), 'a'))
strlcat(str, "&", sizeof(str));
if (strchr(Channel_UserModes(Chan, cl), 'o'))
strlcat(str, "@", sizeof(str));
- if (strchr(Channel_UserModes(Chan, cl), 'h'))
+ if (xop && strchr(Channel_UserModes(Chan, cl), 'h'))
strlcat(str, "%", sizeof(str));
if (strchr(Channel_UserModes(Chan, cl), 'v'))
strlcat(str, "+", sizeof(str));
IRCNow