static void steam_cb_friends(SteamApiReq *req, gpointer data) { bee_user_t *bu; gchar sid[STEAM_ID_STRMAX]; GList *l; SteamData *sata = data; SteamUser *user; SteamUserInfo *info; struct im_connection *ic = sata->ic; if (steam_req_error(sata, req, TRUE)) { return; } if (!(ic->flags & BEE_USER_ONLINE)) { imcb_connected(ic); } for (l = req->infs->head; l != NULL; l = l->next) { info = l->data; STEAM_ID_STR(info->id, sid); /* Attempt to grab the buddy before adding */ bu = bee_user_by_handle(sata->ic->bee, sata->ic, sid); if (bu == NULL) { imcb_add_buddy(sata->ic, sid, NULL); imcb_buddy_nick_hint(sata->ic, sid, info->nick); imcb_rename_buddy(sata->ic, sid, info->fullname); } bu = bee_user_by_handle(sata->ic->bee, sata->ic, sid); if (G_UNLIKELY(bu == NULL)) { continue; } user = bu->data; user->vtime = info->vtime; switch (info->rel) { case STEAM_USER_REL_FRIEND: steam_user_status(sata, info, bu); break; case STEAM_USER_REL_IGNORE: ic->deny = g_slist_prepend(ic->deny, g_strdup(bu->handle)); break; } if (info->unread > 0) { req = steam_api_req_new(req->api, steam_cb_msgs, sata); steam_api_req_msgs(req, info->id, info->vtime); } } req = steam_api_req_new(req->api, steam_cb_poll, sata); steam_api_req_poll(req); }
/** * Implemented #SteamApiFunc for generic users actions. * * @param req The #SteamApiReq. * @param data The user defined data, which is #SteamData. **/ static void steam_cb_user_action(SteamApiReq *req, gpointer data) { SteamData *sata = data; SteamUserInfo *info = req->infs->head->data; if (steam_req_error(sata, req, TRUE)) return; steam_user_status(sata, info, NULL); }
/** * Implemented #SteamApiFunc for #steam_api_req_user_info_nicks(). * * @param req The #SteamApiReq. * @param data The user defined data, which is #SteamData. **/ static void steam_cb_user_info_nicks(SteamApiReq *req, gpointer data) { SteamData *sata = data; SteamUserInfo *info = req->infs->head->data; const gchar *ctr; gchar *str; GSList *l; guint i; if (steam_req_error(sata, req, TRUE)) return; if (info->fullname != NULL) imcb_log(sata->ic, "Name: %s (%s)", info->nick, info->fullname); else imcb_log(sata->ic, "Name: %s", info->nick); if (info->game != NULL) { if (info->server != NULL) { imcb_log(sata->ic, "Playing: %s - steam://connect/%s", info->game, info->server); } else { imcb_log(sata->ic, "Playing: %s", info->game); } } ctr = steam_user_state_str(info->state); if (info->state == STEAM_USER_STATE_OFFLINE) str = steam_util_time_since_utc(info->ltime); else str = steam_user_flags_str(info->flags); if (str != NULL) { imcb_log(sata->ic, "Status: %s (%s)", ctr, str); g_free(str); } else { imcb_log(sata->ic, "Status: %s", ctr); } imcb_log(sata->ic, "Steam ID: %" STEAM_ID_FORMAT " (%" G_GINT32_FORMAT ")", info->id, STEAM_ID_ACCID(info->id)); if (info->profile != NULL) imcb_log(sata->ic, "Profile: %s", info->profile); if (info->nicks != NULL) { imcb_log(sata->ic, "Nicknames:"); for (l = info->nicks, i = 1; l != NULL; l = l->next, i++) imcb_log(sata->ic, "%u. `%s'", i, (gchar*) l->data); } steam_user_status(sata, info, NULL); }
/** * Processes a #SteamApiMsg. * * @param sata The #SteamData. * @param msg The #SteamUserMsg. * @param time The timestamp (UTC) of the message, or 0 for now. **/ static void steam_user_msg(SteamData *sata, SteamUserMsg *msg, gint64 time) { SteamUserInfo *info = msg->info; bee_user_t *bu; gchar *str; guint32 f; gchar sid[STEAM_ID_STR_MAX]; STEAM_ID_STR(info->id, sid); STEAM_UTIL_DEBUGLN("Incoming message from %s (Type: %u, Act: %u)", sid, msg->type, info->act); switch (msg->type) { case STEAM_USER_MSG_TYPE_EMOTE: case STEAM_USER_MSG_TYPE_SAYTEXT: bu = imcb_buddy_by_handle(sata->ic, sid); if ((bu != NULL) && (bu->flags & OPT_TYPING)) imcb_buddy_typing(sata->ic, sid, 0); if (msg->type == STEAM_USER_MSG_TYPE_EMOTE) str = g_strconcat("/me ", msg->text, NULL); else str = g_strdup(msg->text); imcb_buddy_msg(sata->ic, sid, str, 0, time); g_free(str); return; case STEAM_USER_MSG_TYPE_LEFT_CONV: imcb_buddy_typing(sata->ic, sid, 0); return; case STEAM_USER_MSG_TYPE_RELATIONSHIP: goto relationship; case STEAM_USER_MSG_TYPE_TYPING: bu = imcb_buddy_by_handle(sata->ic, sid); if (G_UNLIKELY(bu == NULL)) return; f = (bu->flags & OPT_TYPING) ? 0 : OPT_TYPING; imcb_buddy_typing(sata->ic, sid, f); return; default: steam_user_status(sata, info, NULL); return; } relationship: switch (info->act) { case STEAM_USER_ACT_REMOVE: case STEAM_USER_ACT_IGNORE: imcb_remove_buddy(sata->ic, sid, NULL); return; case STEAM_USER_ACT_REQUEST: imcb_ask_auth(sata->ic, sid, info->nick); return; case STEAM_USER_ACT_ADD: imcb_add_buddy(sata->ic, sid, NULL); imcb_buddy_nick_hint(sata->ic, sid, info->nick); imcb_rename_buddy(sata->ic, sid, info->fullname); steam_user_status(sata, info, NULL); return; default: return; } }