summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/Protocol.txt3
-rw-r--r--src/ngircd/defines.h2
-rw-r--r--src/ngircd/numeric.c17
3 files changed, 13 insertions, 9 deletions
diff --git a/doc/Protocol.txt b/doc/Protocol.txt
index 516a4a4c..9a8ddf6f 100644
--- a/doc/Protocol.txt
+++ b/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".
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
index b2de98d5..dcdd440c 100644
--- a/src/ngircd/defines.h
+++ b/src/ngircd/defines.h
@@ -157,7 +157,7 @@
 
 #ifdef IRCPLUS
 /** Standard IRC+ flags. */
-# define IRCPLUSFLAGS "CHLMS"
+# define IRCPLUSFLAGS "CHLMSX"
 #endif
 
 /** Supported user modes. */
diff --git a/src/ngircd/numeric.c b/src/ngircd/numeric.c
index 3fc8c461..f48cc214 100644
--- a/src/ngircd/numeric.c
+++ b/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));