diff options
| author | Sven Moritz Hallberg <pesco@khjk.org> | 2010-06-03 23:13:57 +0200 | 
|---|---|---|
| committer | Sven Moritz Hallberg <pesco@khjk.org> | 2010-06-03 23:13:57 +0200 | 
| commit | bb09b3c6b8190be09e0b7c7ef2f4b1b5a69b504f (patch) | |
| tree | de453c5fc945d9cafc8ffb5705ab4fe7834bcd32 /protocols/nogaim.c | |
| parent | a6b2f13e38e75e7bca00a1e6c1963783f244c0b2 (diff) | |
| parent | df1ae6223a5fdb3c18d5438670834285101c6213 (diff) | |
merge in bitlbee 1.2.7
Diffstat (limited to 'protocols/nogaim.c')
| -rw-r--r-- | protocols/nogaim.c | 59 | 
1 files changed, 49 insertions, 10 deletions
diff --git a/protocols/nogaim.c b/protocols/nogaim.c index ebb00418..5535e093 100644 --- a/protocols/nogaim.c +++ b/protocols/nogaim.c @@ -656,7 +656,18 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,  	g_free( u->status_msg );  	u->away = u->status_msg = NULL; -	if( ( flags & OPT_LOGGED_IN ) && !u->online ) +	if( set_getbool( &ic->irc->set, "show_offline" ) && !u->online ) +	{ +		/* always set users as online */ +		irc_spawn( ic->irc, u ); +		u->online = 1; +		if( !( flags & OPT_LOGGED_IN ) ) +		{ +			/* set away message if user isn't really online */ +			u->away = g_strdup( "User is offline" ); +		} +	} +	else if( ( flags & OPT_LOGGED_IN ) && !u->online )  	{  		irc_spawn( ic->irc, u );  		u->online = 1; @@ -665,14 +676,30 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,  	{  		struct groupchat *c; -		irc_kill( ic->irc, u ); -		u->online = 0; -		 -		/* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */ -		for( c = ic->groupchats; c; c = c->next ) -			remove_chat_buddy_silent( c, handle ); +		if( set_getbool( &ic->irc->set, "show_offline" ) ) +		{ +			/* keep offline users in channel and set away message to "offline" */ +			u->away = g_strdup( "User is offline" ); + +			/* Keep showing him/her in the control channel but not in groupchats. */ +			for( c = ic->groupchats; c; c = c->next ) +			{ +				if( remove_chat_buddy_silent( c, handle ) && c->joined ) +					irc_part( c->ic->irc, u, c->channel ); +			} +		} +		else +		{ +			/* kill offline users */ +			irc_kill( ic->irc, u ); +			u->online = 0; + +			/* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */ +			for( c = ic->groupchats; c; c = c->next ) +				remove_chat_buddy_silent( c, handle ); +		}  	} -	 +  	if( flags & OPT_AWAY )  	{  		if( state && message ) @@ -699,7 +726,7 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,  	/* LISPy... */  	if( ( u->online ) &&						/* Don't touch offline people */ -	    ( ( ( u->online != oo ) && !u->away ) ||			/* Do joining people */ +	    ( ( u->online != oo ) ||					/* Do joining people */  	      ( ( u->online == oo ) && ( oa == !u->away ) ) ) )		/* Do people changing state */  	{  		char *from; @@ -713,6 +740,17 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,  			from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick,  			                                    ic->irc->myhost );  		} + +		if(!strcmp(set_getstr(&ic->irc->set, "voice_buddies"), "online")) { +			irc_write( ic->irc, ":%s MODE %s +v %s", from, ic->irc->channel, u->nick ); +		} +		if(!strcmp(set_getstr(&ic->irc->set, "halfop_buddies"), "online")) { +			irc_write( ic->irc, ":%s MODE %s +h %s", from, ic->irc->channel, u->nick ); +		} +		if(!strcmp(set_getstr(&ic->irc->set, "op_buddies"), "online")) { +			irc_write( ic->irc, ":%s MODE %s +o %s", from, ic->irc->channel, u->nick ); +		} +  		if(!strcmp(set_getstr(&ic->irc->set, "voice_buddies"), "notaway")) {  			irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,  		 	                                         u->away?'-':'+', u->nick ); @@ -725,6 +763,7 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,  			irc_write( ic->irc, ":%s MODE %s %co %s", from, ic->irc->channel,  		 	                                         u->away?'-':'+', u->nick );  		} +  		g_free( from );  	}  } @@ -1155,7 +1194,7 @@ static char *format_timestamp( irc_t *irc, time_t msg_ts )  	else  		return g_strdup_printf( "\x02[\x02\x02\x02%04d-%02d-%02d "  		                        "%02d:%02d:%02d\x02]\x02 ", -		                        msg.tm_year + 1900, msg.tm_mon, msg.tm_mday, +		                        msg.tm_year + 1900, msg.tm_mon + 1, msg.tm_mday,  		                        msg.tm_hour, msg.tm_min, msg.tm_sec );  }  | 
