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