diff options
Diffstat (limited to 'irc.c')
-rw-r--r-- | irc.c | 31 |
1 files changed, 25 insertions, 6 deletions
@@ -656,7 +656,7 @@ void irc_names( irc_t *irc, char *channel ) if( !control ) c = conv_findchannel( channel ); - /* RFC's say there is no error reply allowed on NAMES, so when the + /* RFCs say there is no error reply allowed on NAMES, so when the channel is invalid, just give an empty reply. */ if( control || c ) while( u ) @@ -670,7 +670,7 @@ void irc_names( irc_t *irc, char *channel ) else s = ""; - irc_reply( irc, 353, "@ %s :%s%s", channel, s, u->nick ); + irc_reply( irc, 353, "= %s :%s%s", channel, s, u->nick ); } else if( !u->gc ) { @@ -681,7 +681,7 @@ void irc_names( irc_t *irc, char *channel ) else s = ""; - irc_reply( irc, 353, "@ %s :%s%s", channel, s, u->nick ); + irc_reply( irc, 353, "= %s :%s%s", channel, s, u->nick ); } } @@ -696,7 +696,7 @@ void irc_names( irc_t *irc, char *channel ) for( l = c->in_room; l; l = l->next ) if( ( u = user_findhandle( c->gc, l->data ) ) ) - irc_reply( irc, 353, "@ %s :%s%s", channel, "", u->nick ); + irc_reply( irc, 353, "= %s :%s%s", channel, "", u->nick ); } irc_reply( irc, 366, "%s :End of /NAMES list", channel ); @@ -734,6 +734,7 @@ void irc_login( irc_t *irc ) irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES ); irc_reply( irc, 5, "PREFIX=(ov)@+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); irc_motd( irc ); + irc->umode[0] = '\0'; irc_umode_set( irc, "+" UMODE, 1 ); u = user_add( irc, irc->mynick ); @@ -841,19 +842,33 @@ void irc_umode_set( irc_t *irc, char *s, int allow_priv ) to set a "privileged" mode (+o, +R, etc). */ char m[256], st = 1, *t; int i; + char changes[512], *p, st2 = 2; + char badflag = 0; memset( m, 0, sizeof( m ) ); for( t = irc->umode; *t; t ++ ) m[(int)*t] = 1; - + + p = changes; for( t = s; *t; t ++ ) { if( *t == '+' || *t == '-' ) st = *t == '+'; else if( st == 0 || ( strchr( UMODES, *t ) || ( allow_priv && strchr( UMODES_PRIV, *t ) ) ) ) + { + if( m[(int)*t] != st) + { + if( st != st2 ) + st2 = st, *p++ = st ? '+' : '-'; + *p++ = *t; + } m[(int)*t] = st; + } + else + badflag = 1; } + *p = '\0'; memset( irc->umode, 0, sizeof( irc->umode ) ); @@ -861,7 +876,11 @@ void irc_umode_set( irc_t *irc, char *s, int allow_priv ) if( m[i] ) irc->umode[strlen(irc->umode)] = i; - irc_reply( irc, 221, "+%s", irc->umode ); + if( badflag ) + irc_reply( irc, 501, ":Unknown MODE flag" ); + /* Deliberately no !user@host on the prefix here */ + if( *changes ) + irc_write( irc, ":%s MODE %s %s", irc->nick, irc->nick, changes ); } void irc_spawn( irc_t *irc, user_t *u ) |