static void xmpp_iq_gameroom_update_pvp_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_update_pvp' compressedData='...' originalSize='42'/> </query> </iq> */ struct cb_args *a = (struct cb_args *) args; if (type ^ XMPP_TYPE_ERROR) { char *data = wf_get_query_content(msg); if (data == NULL) return; gameroom_sync(data); if (a->cb) a->cb(a->args); free(data); } free(a); }
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_update_pvp_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_update_pvp' compressedData='...' originalSize='42'/> </query> </iq> */ struct cb_args *a = (struct cb_args *) args; if (type & XMPP_TYPE_ERROR) { const char *reason = NULL; int code = get_info_int(msg, "code='", "'", NULL); int custom_code = get_info_int(msg, "custom_code='", "'", NULL); switch (code) { case 8: switch (custom_code) { case 1: reason = LANG(error_unknown_mission); break; case 7: reason = LANG(error_room_started); break; default: break; } break; default: break; } if (reason != NULL) eprintf("%s (%s)", LANG(error_gameroom_setinfo), reason); else eprintf("%s (%i:%i)", LANG(error_gameroom_setinfo), code, custom_code); } else { char *data = wf_get_query_content(msg); if (data == NULL) return; gameroom_sync(data); status_set(session.online.status); if (a->cb) a->cb(a->args); free(data); } free(a); }