Example #1
0
static void status_update_location(void)
{
    free(session.online.place_token);
    session.online.place_token = NULL;
    free(session.online.place_info_token);
    session.online.place_info_token = NULL;
    free(session.online.mode_info_token);
    session.online.mode_info_token = NULL;
    free(session.online.mission_info_token);
    session.online.mission_info_token = NULL;

    if (session.online.status & STATUS_LOBBY)
    {
        session.online.place_token =
            strdup("@ui_playerinfo_inlobby");
    }
    else if (session.gameroom.jid != NULL)
    {
        const char *mode = session.gameroom.sync.mission.mode;

        if (mode != NULL)
        {
            if (strcmp(mode, "pve") == 0)
            {
                session.online.place_token =
                    strdup("@ui_playerinfo_pveroom");

                if (session.gameroom.sync.mission.mission_key != NULL)
                {
                    const struct mission *m =
                        mission_list_get_by_key(
                            session.gameroom.sync.mission.mission_key);

                    if (m != NULL && m->type != NULL)
                    {
                        FORMAT(session.online.place_info_token,
                               "@%s",
                               m->type);
                    }
                }
            }
            else
            {
                session.online.place_token =
                    strdup("@ui_playerinfo_pvproom");
                session.online.place_info_token =
                    strdup("@ui_playerinfo_location");

                if (session.gameroom.sync.mission.mode_name != NULL)
                    session.online.mode_info_token =
                        strdup(session.gameroom.sync.mission.mode_name);
                if (session.gameroom.sync.mission.name != NULL)
                    session.online.mission_info_token =
                        strdup(session.gameroom.sync.mission.name);
            }
        }
    }
}
static void xmpp_iq_gameroom_open_cb(const char *msg,
                                     enum xmpp_msg_type type,
                                     void *args)
{
    /* Answer :
       <iq to='masterserver@warface/pve_2' type='get'>
        <query xmlns='urn:cryonline:k01'>
         <data query_name='gameroom_open' compressedData='...'
               originalSize='42'/>
        </query>
       </iq>
     */

    struct cb_args *a = (struct cb_args *) args;

    if (type & XMPP_TYPE_ERROR)
    {
        int code = get_info_int(msg, "code='", "'", NULL);
        int custom_code = get_info_int(msg, "custom_code='", "'", NULL);
        const char *reason = NULL;

        switch (code)
        {
            case 1006:
                reason = "QoS limit reached";
                break;
            case 8:
                switch (custom_code)
                {
                    case 0: /* Expired mission, update and try again */
                        if (++a->tries < 2)
                        {
                            struct mission *m =
                                mission_list_get_by_key(a->mission_key);

                            if (m != NULL)
                            {
                                a->mission_name = strdup(m->name);
                                mission_list_update(
                                    _open_updated_list,
                                    args);

                                return;
                            }
                        }

                        reason = "Expired missions";
                        break;
                    case 1:
                        reason = "Invalid or expired mission";
                        break;
                    case 12:
                        reason = "Rank restricted";
                        break;
                    case 21:
                        reason = "Invalid room name";
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }

        if (reason != NULL)
            eprintf("Failed to open room (%s)\n", reason);
        else
            eprintf("Failed to open room (%i:%i)\n", code, custom_code);
    }
    else
    {
        char *data = wf_get_query_content(msg);

        if (data == NULL)
        {
            free(a);
            return;
        }

        /* Leave previous room if any */
        if (session.gameroom.jid != NULL)
        {
            xmpp_presence(session.gameroom.jid, XMPP_PRESENCE_LEAVE, NULL, NULL);
            free(session.gameroom.group_id);
            session.gameroom.group_id = NULL;
            free(session.gameroom.jid);
            session.gameroom.jid = NULL;

            gameroom_sync_free();
        }

        char *room = get_info(data, "room_id='", "'", "Room ID");

        if (room != NULL)
        {
            /* Join XMPP room */
            char *room_jid;

            FORMAT(room_jid, "*****@*****.**",
                   session.online.channel, room);
            xmpp_presence(room_jid, XMPP_PRESENCE_JOIN, NULL, NULL);
            session.gameroom.jid = room_jid;

            /* Reset auto-ready */
            session.gameroom.desired_status = GAMEROOM_READY;

            gameroom_sync_init();
            gameroom_sync(data);

            status_set(STATUS_ONLINE | STATUS_ROOM);
        }

        if (a->fun != NULL)
            a->fun(room, a->args);

        free(room);

        free(data);
    }

    free(a->mission_name);
    a->mission_name = NULL;
    free(a->mission_key);
    a->mission_key = NULL;
    free(a);
}
static void xmpp_iq_gameroom_quickplay_cb(const char *msg,
                                          enum xmpp_msg_type type,
                                          void *args)
{
    /* Answer :
       <iq to='masterserver@warface/pve_2' type='get'>
        <query xmlns='urn:cryonline:k01'>
         <gameroom_quickplay/>
        </query>
       </iq>
     */

    struct cb_args *a = (struct cb_args *) args;

    if (type & XMPP_TYPE_ERROR)
    {
        int code = get_info_int(msg, "code='", "'", NULL);
        int custom_code = get_info_int(msg, "custom_code='", "'", NULL);
        const char *reason = NULL;

        switch (code)
        {
            case 1006:
                reason = "QoS limit reached";
                break;
            case 8:
                switch (custom_code)
                {
                    case 1: /* Expired mission, update and try again */
                        if (++a->tries < 2)
                        {
                            struct mission *m =
                                mission_list_get_by_key(a->mission_key);

                            if (m != NULL)
                            {
                                a->mission_name = strdup(m->name);
                                mission_list_update(
                                    _quickplay_updated_list,
                                    args);

                                return;
                            }
                        }

                        reason = "Expired mission";
                        break;
                    case 12:
                        reason = "Invalid mission";
                        break;
                    case 27:
                        reason = "Ranked season over";
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }

        if (reason != NULL)
            eprintf("Failed to open quickplay room (%s)\n",
                    reason);
        else
            eprintf("Failed to open quickplay room (%i:%i)\n",
                    code,
                    custom_code);
    }
    else
    {
        if (a->cb)
            a->cb(a->args);
    }

    free(a->mission_key);
    a->mission_key = NULL;
    free(a->mission_name);
    a->mission_name = NULL;
    free(a->game_mode);
    a->game_mode = NULL;
    free(a->uid);
    a->uid = NULL;
    free(a);
}