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); }
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 ); } }