static void xmpp_iq_peer_clan_member_update_cb(const char *msg, enum xmpp_msg_type type, void *args) { struct clanmate *cp = (struct clanmate *) args; /* If user is not reachable, it means he disconnected */ if (type & XMPP_TYPE_ERROR) { cp->status = STATUS_OFFLINE; clanmate_list_update(NULL, cp->nickname, cp->profile_id, cp->status, cp->experience, cp->clan_points, cp->clan_role); #ifdef DBUS_API dbus_api_emit_status_update(cp->nickname, cp->status, cp->experience, cp->clan_points); #endif /* DBUS_API */ } clanmate_free(cp); }
static void xmpp_iq_clan_members_updated_cb(const char *msg_id, const char *msg, void *args) { /* Answer: <iq from='k01.warface' type='get'> <query xmlns='urn:cryonline:k01'> <clan_members_updated> <update profile_id='xxxx'> <clan_member_info nickname='xxxx' profile_id='xxxx' experience='xxxxx' clan_points='xxxx' invite_date='xxxx' clan_role='xxx' jid='xxxxx' status='xxxx'/> </update> </clan_members_updated> </query> </iq> or <iq from='k01.warface' type='get'> <query xmlns='urn:cryonline:k01'> <clan_members_updated> <update profile_id='xxxx'/> </clan_members_updated> </query> </iq> */ char *data = wf_get_query_content(msg); if (data == NULL) return; const char *m = data; while ((m = strstr(m, "<update"))) { char *update = get_info(m, "<update", "</update>", NULL); if (update == NULL) update = get_info(m, "<update", "/>", NULL); if (update == NULL) { ++m; continue; } char *jid = get_info(update, "jid='", "'", NULL); char *nick = get_info(update, "nickname='", "'", NULL); char *pid = get_info(update, "profile_id='", "'", NULL); int status = get_info_int(update, "status='", "'", NULL); int exp = get_info_int(update, "experience='", "'", NULL); int cp = get_info_int(update, "clan_points='", "'", NULL); int cr = get_info_int(update, "clan_role='", "'", NULL); if (pid == NULL) { free(jid); free(pid); free(nick); free(update); ++m; continue; } /* If it's us */ if (0 == strcmp(pid, session.profile.id)) { session.profile.clan.points = cp; session.profile.clan.role = cr; } else { char *real_nick = NULL; if (nick == NULL) { struct clanmate *c = clanmate_list_get_by_pid(pid); if (c != NULL && c->nickname != NULL) real_nick = strdup(c->nickname); } else real_nick = strdup(nick); if (real_nick != NULL) { enum clan_update ret = clanmate_list_update(jid, real_nick, pid, status, exp, cp, cr); switch (ret) { case CLAN_UPDATE_JOINED: { char *s = LANG_FMT(notif_clan_joined, real_nick); xprintf("%s", s); free(s); break; } case CLAN_UPDATE_LEFT: { char *s = LANG_FMT(notif_clan_left, real_nick); xprintf("%s", s); free(s); break; } default: break; } } free(real_nick); } free(jid); free(nick); free(pid); free(update); ++m; } free(data); }
static void xmpp_iq_clan_info_cb ( const char *msg_id, const char *msg, void *args ) { char *data = wf_get_query_content ( msg ); //clanmate_list_empty(); unsigned int old_clanmates = session.clan.clanmates->length + 1; unsigned int new_clanmates = 0; /* Answer: <clan name="XXXXXXX" clan_id="xxx" description="..." creation_date="xxxx" master="xxxx" clan_points="xxxxx" members="xx" master_badge="xxxx" master_stripe="xxxx" master_mark="xxx" leaderboard_position="xx"> */ const char *m = strstr ( data, "<clan " ); if ( m != NULL ) { m += sizeof ( "<clan " ) - 1; session.clan.id = get_info_int ( m, "clan_id='", "'", NULL ); session.clan.name = get_info ( m, "name='", "'", NULL ); int old_leaderboard_position = session.clan.leaderboard_position; session.clan.leaderboard_position = get_info_int ( m, "leaderboard_position='", "'", NULL ); if ( old_leaderboard_position != session.clan.leaderboard_position ) LOGPRINT ( "%-20s " BOLD "%d\n", "CLAN RANK", session.clan.leaderboard_position ); const char *tmp = m; while ( ( tmp = strstr ( tmp, "<clan_member_info " ) ) ) { new_clanmates++; tmp += sizeof ( "<clan_member_info" ); } if ( new_clanmates < old_clanmates ) clanmate_list_empty ( ); /* Nodes: <clan_member_info nickname="xxxx" profile_id="xxx" experience="xxx" clan_points="xxx" invite_date="xxxxxxxxx" clan_role="3" jid="xxxx@warface/GameClient" status="1" /> */ while ( ( m = strstr ( m, "<clan_member_info " ) ) ) { m += sizeof ( "<clan_member_info " ); char *jid = get_info ( m, "jid='", "'", NULL ); char *nick = get_info ( m, "name='", "'", 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 ); int cp = get_info_int ( m, "clan_points='", "'", NULL ); int cr = get_info_int ( m, "clan_role='", "'", NULL ); unsigned int invite_date = get_info_int ( m, "invite_date='", "'", NULL ); if ( strcmp ( session.profile.nickname, nick ) != 0 ) { if ( list_get ( session.clan.clanmates, nick ) ) clanmate_list_update ( jid, nick, pid, status, exp, cp, cr, invite_date, "", "", "", "" ); else { struct clanmate *c = clanmate_list_add ( jid, nick, pid, status, exp, cp, cr, invite_date ); if ( jid && *jid ) if ( !( status & ( STATUS_AFK | STATUS_PLAYING ) ) ) LOGPRINT ( "Clanmate: " KGRN BOLD "%s" KWHT "\n", nick ); else if ( status & STATUS_PLAYING ) LOGPRINT ( "Clanmate: " KMAG BOLD "%s" KWHT "\n", nick ); else LOGPRINT ( "Clanmate: " KYEL BOLD "%s" KWHT "\n", nick ); else LOGPRINT ( "Clanmate: " KCYN BOLD "%s" KWHT "\n", nick ); if ( c->jid ) xmpp_iq_peer_clan_member_update ( c ); } } else { session.clan.points = cp; session.clan.role = cr; session.clan.joined = invite_date; } free ( jid ); free ( nick ); free ( pid ); } } if ( old_clanmates != new_clanmates ) LOGPRINT ( "Clan member count: " KWHT BOLD "%u/50\n", new_clanmates ); free ( data ); }