Commit Diff


commit - 646218e6f4d936b7448b2b407ffb6a53650658de
commit + 53917fa4b80753fc189ed5a516c06c804f2cf415
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));