add online status to friends overview

This commit is contained in:
Florian Stinglmayr 2019-07-19 16:09:28 +02:00
parent 5febc2061c
commit b879151e07
5 changed files with 59 additions and 4 deletions

View File

@ -67,6 +67,9 @@ char const *dc_account_discriminator(dc_account_t a);
char const *dc_account_fullname(dc_account_t a);
char const *dc_account_status(dc_account_t a);
void dc_account_set_status(dc_account_t a, char const *s);
void dc_account_set_token(dc_account_t a, char const *token);
char const *dc_account_token(dc_account_t a);
bool dc_account_has_token(dc_account_t a);

View File

@ -26,6 +26,9 @@ struct dc_account_
/* full username username#discriminator
*/
char *full;
/* online/offline status
*/
char *status;
/* authentication token
*/
@ -50,6 +53,7 @@ static void dc_account_free(dc_account_t ptr)
free(ptr->discriminator);
free(ptr->full);
free(ptr->token);
free(ptr->status);
if (ptr->friends != NULL) {
g_ptr_array_unref(ptr->friends);
@ -149,9 +153,9 @@ dc_account_t dc_account_from_relationship(json_t *j)
goto error;
}
val = json_object_get(j, "type");
if (val != NULL && json_is_integer(val)) {
dc_account_set_friend_state(user, json_integer_value(val));
val = json_object_get(j, "status");
if (val != NULL && json_is_string(val)) {
dc_account_set_status(user, json_string_value(val));
}
return user;
@ -313,6 +317,19 @@ char const *dc_account_fullname(dc_account_t a)
return a->full;
}
char const *dc_account_status(dc_account_t a)
{
return_if_true(a == NULL, NULL);
return a->status;
}
void dc_account_set_status(dc_account_t a, char const *s)
{
return_if_true(a == NULL || s == NULL,);
free(a->status);
a->status = strdup(s);
}
bool dc_account_equal(dc_account_t a, dc_account_t b)
{
return_if_true(a == NULL && b == NULL, true);

View File

@ -29,6 +29,7 @@
#define return_if_true(v,r) do { if (v) return r; } while(0)
#define goto_if_true(v,l) do { if (v) goto l; } while(0)
#define continue_if_true(v) if (v) continue
#define TOKEN(l) (dc_account_token(l))

View File

@ -75,6 +75,7 @@ static void dc_session_handle_ready(dc_session_t s, dc_event_t e)
json_t *r = dc_event_payload(e);
json_t *user = NULL;
json_t *relationships = NULL;
json_t *presences = NULL;
size_t idx = 0;
json_t *c = NULL;
json_t *channels = NULL;
@ -104,6 +105,28 @@ static void dc_session_handle_ready(dc_session_t s, dc_event_t e)
}
}
/* check presences
*/
presences = json_object_get(r, "presences");
if (presences != NULL && json_is_array(presences)) {
json_array_foreach(presences, idx, c) {
json_t *user = NULL, *id = NULL, *status = NULL;
dc_account_t acc = NULL;
user = json_object_get(c, "user");
continue_if_true(user == NULL || !json_is_object(user));
id = json_object_get(user, "id");
continue_if_true(id == NULL || !json_is_string(id));
status = json_object_get(c, "status");
continue_if_true(s == NULL || !json_is_string(status));
acc = g_hash_table_lookup(s->accounts, json_string_value(id));
continue_if_true(acc == NULL);
dc_account_set_status(acc, json_string_value(status));
}
}
/* load channels
*/
channels = json_object_get(r, "private_channels");
@ -114,6 +137,9 @@ static void dc_session_handle_ready(dc_session_t s, dc_event_t e)
continue;
}
/* TODO: dedup recipients
*/
dc_session_add_channel(s, chan);
}
}

View File

@ -12,11 +12,19 @@ ncdc_cmd_friends_list(ncdc_mainwindow_t n, size_t ac,
LOG(n, L"/FRIENDS list");
for (i = 0; i < dc_account_friends_size(current_account); i++) {
dc_account_t acc = dc_account_nth_friend(current_account, i);
char const *status = dc_account_status(acc);
if (status == NULL) {
status = "offline";
}
switch (dc_account_friend_state(acc)) {
case FRIEND_STATE_FRIEND: c = 'F'; break;
case FRIEND_STATE_PENDING: c = 'P'; break;
default: c = ' '; break;
}
LOG(n, L" %c %s", c, dc_account_fullname(acc));
LOG(n, L" [%c] [%-7s] %s", c, status, dc_account_fullname(acc));
}
LOG(n, L"End of /FRIENDS list");