Module: ngircd.git Branch: master Commit: 53917fa4b80753fc189ed5a516c06c804f2cf415 URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=53917...
Author: Alexander Barton alex@barton.de Date: Sat Nov 10 23:33:19 2012 +0100
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 | 3 +++ src/ngircd/defines.h | 2 +- src/ngircd/numeric.c | 17 +++++++++-------- 3 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/doc/Protocol.txt b/doc/Protocol.txt index 516a4a4..9a8ddf6 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 b2de98d..dcdd440 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 3fc8c46..f48cc21 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));
ngircd-commits@lists.barton.de