diff options
| -rw-r--r-- | doc/Protocol.txt | 3 | ||||
| -rw-r--r-- | src/ngircd/defines.h | 2 | ||||
| -rw-r--r-- | src/ngircd/numeric.c | 17 |
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)); |