From c83c217f65b9f0366bf64bbf13683669699a42a8 Mon Sep 17 00:00:00 2001 From: Eion Robb Date: Wed, 7 Feb 2024 21:54:51 +1300 Subject: [PATCH] Fixes for setting/displaying idleness --- libteams.c | 6 ++++++ teams_connection.c | 1 + teams_messages.c | 32 +++++++++++++++++++------------- teams_trouter.c | 17 ++++++++++++++++- teams_trouter.h | 1 + 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/libteams.c b/libteams.c index 64a10c6..1259d27 100644 --- a/libteams.c +++ b/libteams.c @@ -178,6 +178,12 @@ teams_status_types(PurpleAccount *account) // types = g_list_append(types, status); status = purple_status_type_new_with_attrs(PURPLE_STATUS_OFFLINE, "Offline", _("Offline"), TRUE, TRUE, FALSE, "message", "Mood", purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); + + status = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, "AvailableIdle", _("Available (Idle)"), FALSE, FALSE, FALSE, "message", "Mood", purple_value_new(PURPLE_TYPE_STRING), NULL); + types = g_list_append(types, status); + status = purple_status_type_new_with_attrs(PURPLE_STATUS_OFFLINE, "PresenceUnknown", _("Unknown"), FALSE, FALSE, FALSE, "message", "Mood", purple_value_new(PURPLE_TYPE_STRING), NULL); + types = g_list_append(types, status); + return types; } diff --git a/teams_connection.c b/teams_connection.c index 8a9f98c..ee48985 100644 --- a/teams_connection.c +++ b/teams_connection.c @@ -146,6 +146,7 @@ TeamsConnection *teams_post_or_get(TeamsAccount *sa, TeamsMethod method, purple_http_request_header_set(request, "x-ms-client-user-agent", "Teams-Desktop"); purple_http_request_header_set(request, "x-ms-correlation-id", "1"); purple_http_request_header_set(request, "x-ms-client-version", "27/1.0.0.2023052414"); + purple_http_request_header_set(request, "x-ms-endpoint-id", sa->endpoint); } else if (g_str_equal(host, "substrate.office.com")) { purple_http_request_header_set_printf(request, "Authorization", "Bearer %s", sa->substrate_access_token); diff --git a/teams_messages.c b/teams_messages.c index bab6317..28c84c0 100644 --- a/teams_messages.c +++ b/teams_messages.c @@ -21,6 +21,7 @@ #include "teams_connection.h" #include "teams_contacts.h" #include "teams_login.h" +#include "teams_trouter.h" static GString* make_last_timestamp_setting(const gchar *convname) { GString *rv = g_string_new(NULL); @@ -63,19 +64,11 @@ process_userpresence_resource(TeamsAccount *sa, JsonObject *resource) purple_blist_add_buddy(purple_buddy_new(sa->account, from, NULL), NULL, group, NULL); } - - // if (g_str_equal(capabilities, "IsMobile")) { //"Seamless | IsMobile" - // purple_protocol_got_user_status(sa->account, from, "mobile", NULL); - // } - - // is_idle = purple_strequal(status, TEAMS_STATUS_IDLE); - // if (!is_idle) { - purple_protocol_got_user_status(sa->account, from, status, NULL); - // } else { - // purple_protocol_got_user_status(sa->account, from, "Available", NULL); - // } - - // purple_protocol_got_user_idle(sa->account, from, is_idle, 0); + + purple_protocol_got_user_status(sa->account, from, status, NULL); + + gboolean is_idle = purple_strequal(status, "AvailableIdle"); + purple_prpl_got_user_idle(sa->account, from, is_idle, 0); } // static gboolean @@ -1698,6 +1691,9 @@ teams_got_contact_statuses(TeamsAccount *sa, JsonNode *node, gpointer user_data) */ purple_protocol_got_user_status(sa->account, from, availability, NULL); + + gboolean is_idle = purple_strequal(availability, "AvailableIdle"); + purple_prpl_got_user_idle(sa->account, from, is_idle, 0); } } } @@ -1902,6 +1898,13 @@ teams_subscribe(TeamsAccount *sa) subscriptions = json_array_new(); json_array_add_object_element(subscriptions, sub); json_object_set_array_member(obj, "subscriptions", subscriptions); + + if (sa->trouter_surl != NULL) { + JsonObject *trouter_sub = json_object_new(); + json_object_set_string_member(trouter_sub, "channelType", "TrouterPush"); + json_object_set_array_member(trouter_sub, "interestedResources", json_array_ref(interested)); + json_array_add_object_element(subscriptions, trouter_sub); + } post = teams_jsonobj_to_string(obj); @@ -2086,6 +2089,9 @@ teams_set_idle(PurpleConnection *pc, int time) post = g_strdup_printf("{\"endpointId\":\"%s\",\"isActive\":%s}", sa->endpoint, is_active ? "true" : "false"); teams_post_or_get(sa, TEAMS_METHOD_POST | TEAMS_METHOD_SSL, TEAMS_PRESENCE_HOST, "/v1/me/reportmyactivity/", post, NULL, NULL, TRUE); g_free(post); + + // send isactive on trouter if it's connected + teams_trouter_send_active(sa, is_active); } diff --git a/teams_trouter.c b/teams_trouter.c index 6f3815d..f617b28 100644 --- a/teams_trouter.c +++ b/teams_trouter.c @@ -40,6 +40,21 @@ teams_trouter_stop(TeamsAccount *sa) } +void +teams_trouter_send_active(TeamsAccount *sa, gboolean active) +{ + gchar *message; + gchar *cv; + + cv = purple_uuid_random(); + message = g_strdup_printf("{\"name\":\"user.activity\",\"args\":[{\"state\":\"%s\",\"cv\":\"%s\"}]}", active ? "active" : "inactive", cv); + + teams_trouter_send_message(sa, message); + + g_free(cv); + g_free(message); +} + static void teams_trouter_websocket_cb(PurpleWebsocket *ws, gpointer user_data, PurpleWebsocketOp op, const guchar *msg, size_t len) { @@ -49,7 +64,7 @@ teams_trouter_websocket_cb(PurpleWebsocket *ws, gpointer user_data, PurpleWebsoc if (op == PURPLE_WEBSOCKET_OPEN) { purple_debug_info("teams", "Trouter WS: Opened\n"); - teams_trouter_send_message(sa, "{\"name\":\"user.activity\",\"args\":[{\"state\":\"active\"}]}"); + teams_trouter_send_active(sa, TRUE); return; } else if (op == PURPLE_WEBSOCKET_CLOSE) { diff --git a/teams_trouter.h b/teams_trouter.h index 1f0af29..0c15adc 100644 --- a/teams_trouter.h +++ b/teams_trouter.h @@ -25,5 +25,6 @@ void teams_trouter_begin(TeamsAccount *sa); void teams_trouter_stop(TeamsAccount *sa); gboolean teams_trouter_send_message(TeamsAccount *sa, const gchar *message); +void teams_trouter_send_active(TeamsAccount *sa, gboolean active); #endif /*TEAMS_TROUTER_H*/