static void xmpp_iq_peer_status_update_cb(const char *msg_id,
                                          const char *msg,
                                          void *args)
{
    /* Answer
       <iq from='xxxxxxx@warface/GameClient' type='get'>
        <query xmlns='urn:cryonline:k01'>
         <peer_status_update nickname='xxxx' profile_id='xxxx' status='13'
                             experience='xxxx' place_token=''
                             place_info_token=''/>
        </query>
       </iq>
    */

    char *data = wf_get_query_content(msg);

    if (data == NULL)
        return;

    char *jid = get_info(msg, "from='", "'", NULL);
    char *nick = get_info(data, "nickname='", "'", NULL);
    char *pid = get_info(data, "profile_id='", "'", NULL);
    int status = get_info_int(data, "status='", "'", NULL);
    int exp = get_info_int(data, "experience='", "'", NULL);

#ifdef DBUS_API
    dbus_api_emit_status_update(nick, status, exp, 0);
#endif /* DBUS_API */

    if (status == STATUS_OFFLINE || status & STATUS_LEFT)
        friend_list_update(NULL, nick, pid, status, exp);
    else
        friend_list_update(jid, nick, pid, status, exp);

    xmpp_send_iq_result(
        JID(jid),
        msg_id,
        "<query xmlns='urn:cryonline:k01'>"
        " <peer_status_update/>"
        "</query>",
        NULL);

    free(jid);
    free(nick);
    free(pid);
    free(data);
}
Esempio n. 2
0
static void xmpp_iq_friend_list_cb ( const char *msg_id,
									 const char *msg,
									 void *args )
{
	/* Record friends to list
	   <iq from='masterserver@warface/pve_12' type='get'>
		<query xmlns='urn:cryonline:k01'>
		 <friend_list>
		  <friend jid='XXX' profile_id='XXX' nickname='XXX'
			   status='XXX' experience='XXX' location='XXX'/>
		  <friend jid='XXX' profile_id='XXX' nickname='XXX'
			   status='XXX' experience='XXX' location='XXX'/>
		 </friend_list>
		</query>
	   </iq>
	*/

	char *data = wf_get_query_content ( msg );

#if 0
	printf ( "\n\nDECODED:\n%s\n\n", data );
#endif

	//friend_list_empty();
	unsigned int old_friends = session.profile.friends->length;
	unsigned int new_friends = 0;

	const char *m = strstr ( data, "<friend_list" );

	const char *tmp = m + sizeof ( "<friend_list" );
	while ( ( tmp = strstr ( tmp, "<friend" ) ) )
	{
		new_friends++;
		tmp += sizeof ( "<friend" );
	}
	if ( new_friends < old_friends )
		friend_list_empty ( );

	if ( m != NULL )
	{
		m += sizeof ( "<friend_list" );

		while ( ( m = strstr ( m, "<friend" ) ) )
		{
			m += sizeof ( "<friend" );

			char *jid = get_info ( m, "jid='", "'", NULL );
			char *nick = get_info ( m, "nickname='", "'", NULL );
			char *pid = get_info ( m, "profile_id='", "'", NULL );
			int status = get_info_int ( m, "status='", "'", NULL );
			int exp = get_info_int ( m, "experience='", "'", NULL );

			if ( list_get ( session.profile.friends, nick ) )
				friend_list_update ( jid, nick, pid, status, exp, "", "", "", "" );
			else
			{
				if ( jid && *jid )
					if ( !( status & ( STATUS_AFK | STATUS_PLAYING ) ) )
						LOGPRINT ( "Friend: " KGRN BOLD "%s" KWHT "\n", nick );
					else if ( status & STATUS_PLAYING )
						LOGPRINT ( "Friend: " KMAG BOLD "%s" KWHT "\n", nick );
					else
						LOGPRINT ( "Friend: " KYEL BOLD "%s" KWHT "\n", nick );
				else
					LOGPRINT ( "Friend: " KCYN BOLD "%s" KWHT "\n", nick );

				struct friend *f = friend_list_add ( jid, nick, pid, status, exp );

				if ( f->jid )
					xmpp_iq_peer_status_update ( f );
			}

			free ( jid );
			free ( nick );
			free ( pid );
		}
	}