static void xmpp_iq_session_join_cb(const char *msg, void *args) { char *data = wf_get_query_content(msg); char *ip = get_info(data, "hostname='", "'", NULL); int port = get_info_int(data, "port='", "'", NULL); printf("Game room started! Leave... (IP/PORT: %s %d)\n", ip, port); free(ip); free(data); xmpp_iq_gameroom_leave(); }
static void xmpp_iq_gameroom_sync_cb(const char *msg_id, const char *msg, void *args) { char *data = wf_get_query_content(msg); int room_status = get_info_int(data, "status='", "'", NULL); if (room_status == 2) { printf("Game room started! Leave...\n"); xmpp_iq_gameroom_leave(); } free(data); }
static void xmpp_iq_join_channel_cb(const char *msg, enum xmpp_msg_type type, void *args) { /* Answer <iq from='masterserver@warface/pve_12' to='xxxxxx@warface/GameClient' type='result'> <query xmlns='urn:cryonline:k01'> <data query_name='join_channel' compressedData='...' originalSize='13480'/> </query> </iq> */ struct cb_args *a = (struct cb_args *) args; char *data = wf_get_query_content(msg); if (type & XMPP_TYPE_ERROR) { fprintf(stderr, "Failed to join channel\nReason: "); int code = get_info_int(msg, "code='", "'", NULL); int custom_code = get_info_int(msg, "custom_code='", "'", NULL); switch (code) { case 1006: fprintf(stderr, "QoS limit reached\n"); break; case 503: fprintf(stderr, "Invalid channel (%s)\n", a->channel); break; case 8: switch (custom_code) { case 0: fprintf(stderr, "Invalid token (%s) or userid (%s)\n", session.active_token, session.online_id); break; case 1: fprintf(stderr, "Invalid profile_id (%s)\n", session.profile_id); break; case 2: fprintf(stderr, "Game version mismatch (%s)\n", game_version_get()); break; case 3: fprintf(stderr, "Banned\n"); break; case 5: fprintf(stderr, "Rank restricted\n"); break; default: fprintf(stderr, "Unknown code (%d)\n", custom_code); break; } break; default: fprintf(stderr, "Unknown\n"); break; } } else { /* Leave previous room if any */ xmpp_iq_gameroom_leave(); if (data != NULL) { session.experience = get_info_int(data, "experience='", "'", "EXPERIENCE"); if (a->channel != NULL) { free(session.channel); session.channel = strdup(a->channel); } char *m = data; while ((m = strstr(m, "<notif"))) { char *notif = get_info(m, "<notif", "</notif>", NULL); xmpp_iq_confirm_notification(notif); free(notif); ++m; } } /* Ask for today's missions list */ mission_list_update(NULL, NULL); /* Inform to k01 our status */ xmpp_iq_player_status(STATUS_ONLINE | STATUS_LOBBY); if (a->cb) a->cb(a->args); } free(data); free(a->channel); free(a); }
void cmd_leave(void) { xmpp_iq_gameroom_leave(); }