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);
}
Exemplo n.º 3
0
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 );
}