diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-10-10 14:05:42 +0200 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-10-10 14:05:42 +0200 | 
| commit | a21a8ac4fbd5a234bc8d31d9d487c74a81383c8a (patch) | |
| tree | d8445a5409dfe11de56433f59cfa063952734d86 /protocols/jabber/presence.c | |
| parent | 6a1128d1333cf79f1ef9fb1f55b1b8fec67caf2a (diff) | |
Added resource selection (based on priority or time of last message) to
budd_by_jid(), added a full_jid property to easily address that resource
without having to rebuild the full JID every time and implemented typing
notification shite.
Diffstat (limited to 'protocols/jabber/presence.c')
| -rw-r--r-- | protocols/jabber/presence.c | 27 | 
1 files changed, 22 insertions, 5 deletions
diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c index 86bdcb1d..3a682e52 100644 --- a/protocols/jabber/presence.c +++ b/protocols/jabber/presence.c @@ -29,13 +29,19 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data )  	char *from = xt_find_attr( node, "from" );  	char *type = xt_find_attr( node, "type" );	/* NULL should mean the person is online. */  	struct xt_node *c; +	struct jabber_buddy *bud;  	if( !from )  		return XT_HANDLED;  	if( type == NULL )  	{ -		struct jabber_buddy *bud; +		if( strchr( from, '/' ) == NULL ) +		{ +			char *s = xt_to_string( node ); +			serv_got_crap( gc, "WARNING: Ignoring presence tag with bare JID: %s\n", s ); +			g_free( s ); +		}  		if( !( bud = jabber_buddy_by_jid( gc, from ) ) )  		{ @@ -51,23 +57,34 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data )  		if( ( c = xt_find_node( node->children, "show" ) ) && c->text_len > 0 )  			bud->away_state = (void*) jabber_away_state_by_code( c->text );  		else +		{  			bud->away_state = NULL; +			/* Let's only set last_act if there's *no* away state, +			   since it could be some auto-away thingy. */ +			bud->last_act = time( NULL ); +		}  		if( ( c = xt_find_node( node->children, "priority" ) ) && c->text_len > 0 )  			bud->priority = atoi( c->text );  		else  			bud->priority = 0; -		serv_got_update( gc, bud->handle, 1, 0, 0, 0, 0, 0 ); +		serv_got_update( gc, bud->handle, 1, 0, 0, 0, +		                 bud->away_state ? UC_UNAVAILABLE : 0, 0 );  	}  	else if( strcmp( type, "unavailable" ) == 0 )  	{  		char *s; -		jabber_buddy_remove( gc, from ); +		if( ( s = strchr( from, '/' ) ) == NULL ) +		{ +			char *s = xt_to_string( node ); +			serv_got_crap( gc, "WARNING: Ignoring presence tag with bare JID: %s\n", s ); +			g_free( s ); +		} -		if( ( s = strchr( from, '/' ) ) ) -			*s = 0; +		jabber_buddy_remove( gc, from ); +		*s = 0;  		/* Only count this as offline if there's no other resource  		   available anymore. */  | 
