commit - 646218e6f4d936b7448b2b407ffb6a53650658de
commit + 53917fa4b80753fc189ed5a516c06c804f2cf415
blob - 516a4a4c914bd45138c9cea81e19d6ba2e1d920d
blob + 9a8ddf6fdcefa96674200764876b7e7895cd2b74
--- doc/Protocol.txt
+++ doc/Protocol.txt
- 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
#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
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);
* (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));