eion/purple-hangouts

e6b34c1972be
Parents 6cf906e84334
Children b0a9edba101e
Bring through extra buddy info into the tooltip
When they were last seen, whether they're in a call, what type of device they're using
--- a/hangouts.proto Thu Oct 20 20:31:33 2016 +1300
+++ b/hangouts.proto Thu Oct 20 22:37:19 2016 +1300
@@ -78,7 +78,8 @@
}
message LastSeen {
- required uint64 last_seen_timestamp = 1;
+ required uint64 last_seen_timestamp = 1; //in microseconds
+ optional uint64 usec_since_last_seen = 2;
}
message Location {
--- a/hangouts_events.c Thu Oct 20 20:31:33 2016 +1300
+++ b/hangouts_events.c Thu Oct 20 22:37:19 2016 +1300
@@ -397,6 +397,33 @@
}
g_free(message);
+
+ if (buddy != NULL) {
+ HangoutsBuddy *hbuddy = purple_buddy_get_protocol_data(buddy);
+ HangoutsDeviceTypeFlags device_type = HANGOUTS_DEVICE_TYPE_UNKNOWN;
+
+ if (hbuddy == NULL) {
+ hbuddy = g_new0(HangoutsBuddy, 1);
+ hbuddy->buddy = buddy;
+ purple_buddy_set_protocol_data(buddy, hbuddy);
+ }
+
+ hbuddy->in_call = presence->in_call && presence->in_call->has_call_type && presence->in_call->call_type != CALL_TYPE__CALL_TYPE_NONE;
+ hbuddy->last_seen = presence->last_seen ? presence->last_seen->last_seen_timestamp / 1000000 : 0;
+
+ if (presence->device_status) {
+ if (presence->device_status->mobile) {
+ device_type |= HANGOUTS_DEVICE_TYPE_MOBILE;
+ }
+ if (presence->device_status->desktop) {
+ device_type |= HANGOUTS_DEVICE_TYPE_DESKTOP;
+ }
+ if (presence->device_status->tablet) {
+ device_type |= HANGOUTS_DEVICE_TYPE_TABLET;
+ }
+ }
+ hbuddy->device_type = device_type;
+ }
}
void
--- a/libhangouts.c Thu Oct 20 20:31:33 2016 +1300
+++ b/libhangouts.c Thu Oct 20 22:37:19 2016 +1300
@@ -412,6 +412,7 @@
PurplePresence *presence;
PurpleStatus *status;
const gchar *message;
+ HangoutsBuddy *hbuddy;
g_return_if_fail(buddy != NULL);
@@ -424,6 +425,25 @@
purple_notify_user_info_add_pair_html(user_info, _("Message"), message);
}
+ hbuddy = purple_buddy_get_protocol_data(buddy);
+ if (hbuddy != NULL) {
+ if (hbuddy->last_seen != 0) {
+ const time_t last_seen = hbuddy->last_seen;
+ purple_notify_user_info_add_pair_html(user_info, _("Last seen"), purple_date_format_full(localtime(&last_seen)));
+ }
+
+ if (hbuddy->in_call) {
+ purple_notify_user_info_add_pair_html(user_info, _("In call"), NULL);
+ }
+
+ if (hbuddy->device_type) {
+ purple_notify_user_info_add_pair_html(user_info, _("Device Type"),
+ hbuddy->device_type & HANGOUTS_DEVICE_TYPE_DESKTOP ? _("Desktop") :
+ hbuddy->device_type & HANGOUTS_DEVICE_TYPE_TABLET ? _("Tablet") :
+ hbuddy->device_type & HANGOUTS_DEVICE_TYPE_MOBILE ? _("Mobile") :
+ _("Unknown"));
+ }
+ }
}
GList *
@@ -468,6 +488,15 @@
return g_markup_printf_escaped("%s", message);
}
+static void
+hangouts_buddy_free(PurpleBuddy *buddy)
+{
+ HangoutsBuddy *hbuddy = purple_buddy_get_protocol_data(buddy);
+
+ g_return_if_fail(hbuddy != NULL);
+
+ g_free(hbuddy);
+}
/*****************************************************************************/
@@ -551,6 +580,7 @@
prpl_info->blist_node_menu = hangouts_node_menu;
prpl_info->status_text = hangouts_status_text;
prpl_info->tooltip_text = hangouts_tooltip_text;
+ prpl_info->buddy_free = hangouts_buddy_free;
}
static void
@@ -770,6 +800,7 @@
prpl_info->list_icon = hangouts_list_icon;
prpl_info->status_text = hangouts_status_text;
prpl_info->tooltip_text = hangouts_tooltip_text;
+ prpl_info->buddy_free = hangouts_buddy_free;
prpl_info->get_info = hangouts_get_info;
prpl_info->set_status = hangouts_set_status;
--- a/libhangouts.h Thu Oct 20 20:31:33 2016 +1300
+++ b/libhangouts.h Thu Oct 20 22:37:19 2016 +1300
@@ -103,6 +103,21 @@
} HangoutsAccount;
+typedef enum
+{
+ HANGOUTS_DEVICE_TYPE_UNKNOWN = 0x0000,
+ HANGOUTS_DEVICE_TYPE_MOBILE = 0x0001,
+ HANGOUTS_DEVICE_TYPE_DESKTOP = 0x0002,
+ HANGOUTS_DEVICE_TYPE_TABLET = 0x0004
+} HangoutsDeviceTypeFlags;
+
+typedef struct {
+ PurpleBuddy *buddy;
+ gboolean in_call;
+ gint64 last_seen;
+ HangoutsDeviceTypeFlags device_type;
+} HangoutsBuddy;
+
gboolean hangouts_is_valid_id(const gchar *id);