static void _sync_core(s_gr_core *local, const char *node) { SYNC_INT(local->teams_switched, node, "teams_switched"); SYNC_INT(local->private, node, "private"); SYNC_INT(local->can_start, node, "can_start"); SYNC_INT(local->team_balanced, node, "team_balanced"); SYNC_INT(local->min_ready_players, node, "min_ready_players"); SYNC_INT(local->num_players, node, "players"); { const char *r = local->room_name; SYNC_STR(local->room_name, node, "room_name"); if (r != local->room_name) xml_deserialize_inplace(&local->room_name); } char *players = get_info(node, "<players>", "</players>", NULL); /* Loop foreach players */ if (players != NULL) { const char *m = players; list_empty(local->players); while ((m = strstr(m, "<player"))) { char *player = get_info(m, "<player", "/>", NULL); struct gr_core_player *p = calloc(1, sizeof(struct gr_core_player)); SYNC_STR(p->nickname, player, "nickname"); SYNC_STR(p->clan_name, player, "clanName"); SYNC_STR(p->profile_id, player, "profile_id"); SYNC_STR(p->online_id, player, "online_id"); SYNC_STR(p->group_id, player, "group_id"); SYNC_STR(p->region_id, player, "region_id"); SYNC_INT(p->class_id, player, "class_id"); SYNC_INT(p->team_id, player, "team_id"); SYNC_INT(p->status, player, "status"); SYNC_INT(p->presence, player, "presence"); SYNC_INT(p->observer, player, "observer"); SYNC_INT(p->experience, player, "experience"); SYNC_INT(p->rank, player, "rank"); SYNC_INT(p->banner.badge, player, "banner_badge"); SYNC_INT(p->banner.mark, player, "banner_mark"); SYNC_INT(p->banner.stripe, player, "banner_stripe"); SYNC_FLT(p->skill, player, "skill"); list_add(local->players, p); free(player); ++m; } } free(players); }
static void handle_private_message_(const char *msg_id, const char *msg) { /* Answer #2: <iq from='xxxxx@warface/GameClient' type='get'> <query xmlns='urn:cryonline:k01'> <message from='xxxx' nick='xxxx' message='xxxx'/> </query> </iq> */ char *message = get_info(msg, "message='", "'", NULL); char *nick_from = get_info(msg, "<message from='", "'", NULL); char *jid_from = get_info(msg, "<iq from='", "'", NULL); /* Deserialize message */ xml_deserialize_inplace(&message); /* Feedback the user what was sent */ xmpp_ack_message(nick_from, jid_from, message, msg_id); /* Determine the correct command */ if (strstr(message, "leave")) { cmd_leave(); xmpp_send_message(nick_from, jid_from, "but whyy :("); } else if (strstr(message, "ready") || strstr(message, "take")) { cmd_ready(strstr(message, " ")); xmpp_send_message(nick_from, jid_from, "go"); } else if (strstr(message, "invite")) { cmd_invite(nick_from, 0); } else if (strstr(message, "master")) { cmd_master(nick_from); xmpp_send_message(nick_from, jid_from, "Yep, just a sec."); } else if (strstr(message, "whois")) { char *nickname = strchr(message, ' '); if (nickname == NULL) nickname = nick_from; else nickname++; cmd_whois(nickname, nick_from, jid_from); } else if (strstr(message, "missions")) { cmd_missions(nick_from, jid_from); } else if (strstr(message, "say")) { cmd_say(strchr(message, ' ')); } else { int r = rand() % 4; const char *answer = r == 0 ? "I'm sorry Dave. I'm afraid I can't do that." : r == 1 ? "It can only be attributable to human error." : r == 2 ? "Just what do you think you're doing, Dave ?" : "Dave, stop. Stop, will you ?"; /* Command not found */ xmpp_send_message(nick_from, jid_from, answer); } free(jid_from); free(nick_from); free(message); }