summary refs log tree commit diff
path: root/src/ngircd/irc-server.c
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2012-09-11 12:30:19 +0200
committerAlexander Barton <alex@barton.de>2012-09-11 12:30:19 +0200
commitf37600ee01f6cfd86e8fa80f77ee26ebaf3012b2 (patch)
tree1c1a9c7421b899a11a059b72615a7020b06ed7c2 /src/ngircd/irc-server.c
parentf38a9035e5439cb395b2de6b9bdfa36102bfe80c (diff)
parent097c72aa65d9914d688eaece718648ca060e287a (diff)
downloadngircd-f37600ee01f6cfd86e8fa80f77ee26ebaf3012b2.tar.gz
ngircd-f37600ee01f6cfd86e8fa80f77ee26ebaf3012b2.zip
Merge branch 'xop' of https://github.com/kart0ffelsack/ngircd into bug92-xop
* 'xop' of https://github.com/kart0ffelsack/ngircd:
  Tests and documentation for xop
  Implemented xop support

Conflicts (because of merge of the 'cmode-M' branch):
	src/ngircd/channel.c
	src/ngircd/defines.h
	src/ngircd/messages.h
Diffstat (limited to 'src/ngircd/irc-server.c')
-rw-r--r--src/ngircd/irc-server.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/ngircd/irc-server.c b/src/ngircd/irc-server.c
index 8526a573..f9182d98 100644
--- a/src/ngircd/irc-server.c
+++ b/src/ngircd/irc-server.c
@@ -203,7 +203,7 @@ GLOBAL bool
 IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 {
 	char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
-	bool is_op, is_voiced;
+	bool is_owner, is_chanadmin, is_op, is_halfop, is_voiced;
 	CHANNEL *chan;
 	CLIENT *c;
 	
@@ -222,9 +222,13 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 		is_op = is_voiced = false;
 		
 		/* cut off prefixes */
-		while(( *ptr == '@' ) || ( *ptr == '+' ))
-		{
+		while(( *ptr == '~') || ( *ptr == '&' ) || ( *ptr == '@' ) ||
+			( *ptr == '%') || ( *ptr == '+' ))
+		{	
+			if( *ptr == '~' ) is_owner = true;
+			if( *ptr == '&' ) is_chanadmin = true;
 			if( *ptr == '@' ) is_op = true;
+			if( *ptr == 'h' ) is_halfop = true;
 			if( *ptr == '+' ) is_voiced = true;
 			ptr++;
 		}
@@ -236,7 +240,10 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 			chan = Channel_Search( channame );
 			assert( chan != NULL );
 			
+			if( is_owner ) Channel_UserModeAdd( chan, c, 'q' );
+			if( is_chanadmin ) Channel_UserModeAdd( chan, c, 'a' );
 			if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
+			if( is_halfop ) Channel_UserModeAdd( chan, c, 'h' );
 			if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
 
 			/* announce to channel... */
@@ -251,7 +258,10 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 			}
 
 			if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
+			if( is_owner ) strlcat( nick_out, "~", sizeof( nick_out ));
+			if( is_chanadmin ) strlcat( nick_out, "&", sizeof( nick_out ));
 			if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
+			if( is_halfop ) strlcat( nick_out, "%", sizeof( nick_out ));
 			if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
 			strlcat( nick_out, ptr, sizeof( nick_out ));
 		}