X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-server.c;h=380ab6224f55cf9b0d504f80be5718eceff824ae;hp=cca295ac831dc486675f08778ec3d0de881a63ea;hb=8cfb9104419d3c00fbef3fe8639eb04f03d83f3d;hpb=770a58ac6df8099cfa8e7cf3b105ef495f2cf437 diff --git a/src/ngircd/irc-server.c b/src/ngircd/irc-server.c index cca295ac..380ab622 100644 --- a/src/ngircd/irc-server.c +++ b/src/ngircd/irc-server.c @@ -54,7 +54,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) CLIENT *from, *c; int i; CONN_ID con; - + assert( Client != NULL ); assert( Req != NULL ); @@ -80,14 +80,15 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true); return DISCONNECTED; } - if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 ) + if( strcmp( Conn_Password( Client_Conn( Client ) ), + Conf_Server[i].pwd_in ) != 0 ) { /* wrong password */ Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] ); Conn_Close( Client_Conn( Client ), NULL, "Bad password", true); return DISCONNECTED; } - + /* Is there a registered server with this ID? */ if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED; @@ -202,10 +203,10 @@ 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; - + assert( Client != NULL ); assert( Req != NULL ); @@ -219,11 +220,15 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req ) while( ptr ) { 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++; } @@ -234,8 +239,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req ) Channel_Join( c, channame ); 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... */ @@ -250,12 +258,15 @@ 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 )); } else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame ); - + /* search for next Nick */ ptr = strtok( NULL, "," ); }