Skip to content

Commit

Permalink
When retrieving unknown IMs, also lookup unknown users (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
dylex committed Jun 8, 2018
1 parent 2d82c39 commit c40cb3b
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 6 deletions.
26 changes: 20 additions & 6 deletions slack-conversation.c
Expand Up @@ -55,18 +55,32 @@ SlackObject *slack_conversation_get_conversation(SlackAccount *sa, PurpleConvers
struct conversation_retrieve {
SlackConversationCallback *cb;
gpointer data;
json_value *json;
};

static void conversation_retrieve_user_cb(SlackAccount *sa, gpointer data, SlackUser *user) {
struct conversation_retrieve *lookup = data;
lookup->cb(sa, lookup->data, conversation_update(sa, lookup->json));
g_free(lookup);
}

static void conversation_retrieve_cb(SlackAccount *sa, gpointer data, json_value *json, const char *error) {
struct conversation_retrieve *lookup = data;
json_value *chan = json_get_prop_type(json, "channel", object);
SlackObject *obj = NULL;
if (!chan || error)
if (!chan || error) {
purple_debug_error("slack", "Error retrieving conversation: %s\n", error ?: "missing");
else
obj = conversation_update(sa, chan);
lookup->cb(sa, lookup->data, obj);
g_free(lookup);
lookup->cb(sa, lookup->data, NULL);
g_free(lookup);
return;
}
lookup->json = chan;
if (json_get_prop_boolean(json, "is_im", FALSE)) {
/* Make sure we know the user, too */
const char *uid = json_get_prop_strptr(json, "user");
if (uid)
return slack_user_retrieve(sa, uid, conversation_retrieve_user_cb, lookup);
}
return conversation_retrieve_user_cb(sa, lookup, NULL);
}

void slack_conversation_retrieve(SlackAccount *sa, const char *sid, SlackConversationCallback *cb, gpointer data) {
Expand Down
27 changes: 27 additions & 0 deletions slack-user.c
Expand Up @@ -117,6 +117,33 @@ void slack_users_load(SlackAccount *sa) {
slack_api_call(sa, users_list_cb, NULL, "users.list", "presence", "false", SLACK_PAGINATE_LIMIT, NULL);
}

struct user_retrieve {
SlackUserCallback *cb;
gpointer data;
};

static void user_retrieve_cb(SlackAccount *sa, gpointer data, json_value *json, const char *error) {
struct user_retrieve *lookup = data;
json_value *user = json_get_prop_type(json, "user", object);
SlackUser *obj = NULL;
if (!user || error)
purple_debug_error("slack", "Error retrieving user: %s\n", error ?: "missing");
else
obj = slack_user_update(sa, user);
lookup->cb(sa, lookup->data, obj);
g_free(lookup);
}

void slack_user_retrieve(SlackAccount *sa, const char *uid, SlackUserCallback *cb, gpointer data) {
SlackUser *user = (SlackUser *)slack_object_hash_table_lookup(sa->users, uid);
if (user)
return cb(sa, data, user);
struct user_retrieve *lookup = g_new(struct user_retrieve, 1);
lookup->cb = cb;
lookup->data = data;
slack_api_call(sa, user_retrieve_cb, lookup, "users.info", "user", uid, NULL);
}

static void presence_set(SlackAccount *sa, json_value *json, const char *presence) {
if (json->type != json_string)
return;
Expand Down
9 changes: 9 additions & 0 deletions slack-user.h
Expand Up @@ -29,6 +29,15 @@ void slack_users_load(SlackAccount *sa);

SlackUser *slack_user_update(SlackAccount *sa, json_value *json);

typedef void SlackUserCallback(SlackAccount *sa, gpointer data, SlackUser *user);

/**
* Get the SlackUser associated with a user id (in sa->users).
* If it's not known, look it up.
* The callback may be made inline or later, possibly with a NULL obj on unknown user or error.
*/
void slack_user_retrieve(SlackAccount *sa, const char *uid, SlackUserCallback *cb, gpointer data);

/* RTM event handlers */
void slack_user_changed(SlackAccount *sa, json_value *json);
void slack_presence_change(SlackAccount *sa, json_value *json);
Expand Down

0 comments on commit c40cb3b

Please sign in to comment.