Commit Diff
Diff:
646218e6f4d936b7448b2b407ffb6a53650658de
53917fa4b80753fc189ed5a516c06c804f2cf415
53917fa4b80753fc189ed5a516c06c804f2cf415
Commit:
53917fa4b80753fc189ed5a516c06c804f2cf415
Tree:
0f91712252ec7b06dbcc6da31815ec76d71598c2
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.
--- 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".
--- 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. */
--- 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));