eion/purple-hangouts

Support receiving gmail notifications.
draft
2017-04-21, Eion Robb
7f49e4de9545
Parents affe14b79674
Children 6684fd566561
Support receiving gmail notifications.
See issue #138
--- a/Makefile Sun Apr 16 23:56:39 2017 +0000
+++ b/Makefile Fri Apr 21 14:46:16 2017 +1200
@@ -68,7 +68,7 @@
WIN32_PIDGIN2_LDFLAGS = -L$(PIDGIN_TREE_TOP)/libpurple $(WIN32_LDFLAGS)
WIN32_PIDGIN3_LDFLAGS = -L$(PIDGIN3_TREE_TOP)/libpurple -L$(WIN32_DEV_TOP)/gplugin-dev/gplugin $(WIN32_LDFLAGS) -lgplugin
-C_FILES := hangouts.pb-c.c hangout_media.pb-c.c hangouts_json.c hangouts_pblite.c hangouts_connection.c hangouts_auth.c hangouts_events.c hangouts_conversation.c hangouts_media.c
+C_FILES := hangouts.pb-c.c hangout_media.pb-c.c gmail.pb-c.c hangouts_json.c hangouts_pblite.c hangouts_connection.c hangouts_auth.c hangouts_events.c hangouts_conversation.c hangouts_media.c
PURPLE_COMPAT_FILES := purple2compat/http.c purple2compat/purple-socket.c
PURPLE_C_FILES := libhangouts.c $(C_FILES)
TEST_C_FILES := hangouts_test.c $(C_FILES)
@@ -81,10 +81,13 @@
hangouts.pb-c.c: hangouts.proto
$(PROTOC_C) --c_out=. hangouts.proto
-
+
hangout_media.pb-c.c: hangout_media.proto
$(PROTOC_C) --c_out=. hangout_media.proto
+gmail.pb-c.c: gmail.proto
+ $(PROTOC_C) --c_out=. gmail.proto
+
libhangouts.so: $(PURPLE_C_FILES) $(PURPLE_COMPAT_FILES)
$(CC) -fPIC $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) $(PROTOBUF_OPTS) `$(PKG_CONFIG) purple glib-2.0 json-glib-1.0 --libs --cflags` $(INCLUDES) -Ipurple2compat -g -ggdb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gmail.proto Fri Apr 21 14:46:16 2017 +1200
@@ -0,0 +1,16 @@
+
+// proto2 is required because we need to be able to serialize default values:
+syntax = "proto2";
+
+
+message GmailNotification {
+ optional string thread_id = 3;
+ //optional string previous_id = 4;
+ optional string id = 5;
+ repeated string labels = 6;
+ optional string subject = 7;
+ optional string snippet = 8;
+ optional string sender_name = 9;
+ optional string sender_email = 10;
+ //repeated unknown = 11;
+}
--- a/hangouts_connection.c Sun Apr 16 23:56:39 2017 +0000
+++ b/hangouts_connection.c Fri Apr 21 14:46:16 2017 +1200
@@ -35,6 +35,7 @@
#include "hangouts.pb-c.h"
#include "hangouts_conversation.h"
+#include "gmail.pb-c.h"
void
hangouts_process_data_chunks(HangoutsAccount *ha, const gchar *data, gsize len)
@@ -83,6 +84,7 @@
if (json_object_has_member(wrapper, "2")) {
const gchar *wrapper22 = json_object_get_string_member(json_object_get_object_member(wrapper, "2"), "2");
JsonArray *pblite_message = json_decode_array(wrapper22, -1);
+ const gchar *message_type;
if (pblite_message == NULL) {
#ifdef DEBUG
@@ -92,8 +94,10 @@
continue;
}
+ message_type = json_array_get_string_element(pblite_message, 0);
+
//cbu == ClientBatchUpdate
- if (g_strcmp0(json_array_get_string_element(pblite_message, 0), "cbu") == 0) {
+ if (purple_strequal(message_type, "cbu")) {
BatchUpdate batch_update = BATCH_UPDATE__INIT;
guint j;
@@ -126,6 +130,12 @@
for(j = 0; j < batch_update.n_state_update; j++) {
purple_signal_emit(purple_connection_get_protocol(ha->pc), "hangouts-received-stateupdate", ha->pc, batch_update.state_update[j]);
}
+ } else if (purple_strequal(message_type, "n_nm")) {
+ GmailNotification gmail_notification = GMAIL_NOTIFICATION__INIT;
+ const gchar *username = json_object_get_string_member(json_object_get_object_member(json_object_get_object_member(wrapper, "2"), "1"), "2");
+
+ pblite_decode((ProtobufCMessage *) &gmail_notification, pblite_message, TRUE);
+ purple_signal_emit(purple_connection_get_protocol(ha->pc), "hangouts-gmail-notification", ha->pc, username, &gmail_notification);
}
json_array_unref(pblite_message);
@@ -522,6 +532,10 @@
json_object_set_string_member(obj, "p", "{\"3\":{\"1\":{\"1\":\"hangout_invite\"}}}");
json_array_add_object_element(map_list, obj);
+ obj = json_object_new();
+ json_object_set_string_member(obj, "p", "{\"3\":{\"1\":{\"1\":\"gmail\"}}}");
+ json_array_add_object_element(map_list, obj);
+
hangouts_send_maps(ha, map_list, NULL);
json_array_unref(map_list);
@@ -853,6 +867,16 @@
json_object_unref(node);
}
+/*
+
+POST https://people-pa.clients6.google.com/v2/people/lookup
+id=actual_email_address%40gmail.com&type=EMAIL&matchType=LENIENT&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_LOOKUP&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&coreIdParams.useRealtimeNotificationExpandedAcls=true&key=AIzaSyAfFJCeph-euFSwtmqFZi0kaKk-cZ5wufM
+
+id=%2B123456789&type=PHONE&matchType=LENIENT&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_LOOKUP&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&coreIdParams.useRealtimeNotificationExpandedAcls=true&quotaFilterType=PHONE&key=AIzaSyAfFJCeph-euFSwtmqFZi0kaKk-cZ5wufM
+
+*/
+
+
void
hangouts_search_users_text(HangoutsAccount *ha, const gchar *text)
{
@@ -882,7 +906,7 @@
void
hangouts_search_users(PurpleProtocolAction *action)
{
- PurpleConnection *pc = purple_protocol_action_get_connection(action);;
+ PurpleConnection *pc = purple_protocol_action_get_connection(action);
HangoutsAccount *ha = purple_connection_get_protocol_data(pc);
purple_request_input(pc, _("Search for friends..."),
--- a/hangouts_events.c Sun Apr 16 23:56:39 2017 +0000
+++ b/hangouts_events.c Fri Apr 21 14:46:16 2017 +1200
@@ -45,6 +45,8 @@
purple_signal_connect(plugin, "hangouts-received-stateupdate", plugin, PURPLE_CALLBACK(hangouts_received_delete_notification), NULL);
purple_signal_connect(plugin, "hangouts-received-stateupdate", plugin, PURPLE_CALLBACK(hangouts_received_block_notification), NULL);
purple_signal_connect(plugin, "hangouts-received-stateupdate", plugin, PURPLE_CALLBACK(hangouts_received_other_notification), NULL);
+
+ purple_signal_connect(plugin, "hangouts-gmail-notification", plugin, PURPLE_CALLBACK(hangouts_received_gmail_notification), NULL);
}
/*
@@ -173,6 +175,26 @@
}
void
+hangouts_received_gmail_notification(PurpleConnection *pc, const gchar *username, GmailNotification *msg)
+{
+ gchar *url;
+ gchar *subject = purple_markup_escape_text(msg->subject, -1);
+ gchar *from = purple_markup_escape_text(msg->sender_name, -1);
+ gchar *to = purple_markup_escape_text(username, -1);
+
+ purple_debug_info("hangouts", "Received gmail notification %s\n", pblite_dump_json((ProtobufCMessage *) msg));
+
+ url = g_strconcat("https://mail.google.com/mail/u/", username, "/#inbox/", purple_url_encode(msg->thread_id), NULL);
+
+ purple_notify_email(pc, subject, from, to, url, NULL, NULL);
+
+ g_free(url);
+ g_free(subject);
+ g_free(from);
+ g_free(to);
+}
+
+void
hangouts_received_other_notification(PurpleConnection *pc, StateUpdate *state_update)
{
if (state_update->typing_notification != NULL ||
--- a/hangouts_events.h Sun Apr 16 23:56:39 2017 +0000
+++ b/hangouts_events.h Fri Apr 21 14:46:16 2017 +1200
@@ -22,6 +22,7 @@
#include "libhangouts.h"
#include "hangouts.pb-c.h"
+#include "gmail.pb-c.h"
void hangouts_register_events(gpointer plugin);
@@ -35,6 +36,7 @@
void hangouts_received_delete_notification(PurpleConnection *pc, StateUpdate *state_update);
void hangouts_received_state_update(PurpleConnection *pc, StateUpdate *state_update);
+void hangouts_received_gmail_notification(PurpleConnection *pc, const gchar *username, GmailNotification *msg);
void hangouts_process_presence_result(HangoutsAccount *ha, PresenceResult *presence);
void hangouts_process_conversation_event(HangoutsAccount *ha, Conversation *conversation, Event *event, gint64 current_server_time);
--- a/libhangouts.c Sun Apr 16 23:56:39 2017 +0000
+++ b/libhangouts.c Fri Apr 21 14:46:16 2017 +1200
@@ -558,13 +558,19 @@
info->id = HANGOUTS_PLUGIN_ID;
info->name = "Hangouts";
- prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_CHAT_TOPIC;
+ prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_CHAT_TOPIC | OPT_PROTO_MAIL_CHECK;
prpl_info->account_options = hangouts_add_account_options(prpl_info->account_options);
purple_signal_register(plugin, "hangouts-received-stateupdate",
purple_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2,
PURPLE_TYPE_CONNECTION,
G_TYPE_OBJECT);
+
+ purple_signal_register(plugin, "hangouts-gmail-notification",
+ purple_marshal_VOID__POINTER_POINTER_POINTER, G_TYPE_NONE, 3,
+ PURPLE_TYPE_CONNECTION,
+ G_TYPE_STRING,
+ G_TYPE_OBJECT);
hangouts_register_events(plugin);
}
@@ -789,13 +795,19 @@
plugin->info = info = g_new0(PurplePluginInfo, 1);
}
- prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_IM_IMAGE | OPT_PROTO_CHAT_TOPIC;
+ prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_IM_IMAGE | OPT_PROTO_CHAT_TOPIC | OPT_PROTO_MAIL_CHECK;
prpl_info->protocol_options = hangouts_add_account_options(prpl_info->protocol_options);
purple_signal_register(plugin, "hangouts-received-stateupdate",
purple_marshal_VOID__POINTER_POINTER, NULL, 2,
PURPLE_TYPE_CONNECTION,
- purple_value_new_outgoing(PURPLE_TYPE_OBJECT));
+ purple_value_new(PURPLE_TYPE_OBJECT));
+
+ purple_signal_register(plugin, "hangouts-gmail-notification",
+ purple_marshal_VOID__POINTER_POINTER_POINTER, NULL, 3,
+ PURPLE_TYPE_CONNECTION,
+ purple_value_new(PURPLE_TYPE_STRING),
+ purple_value_new(PURPLE_TYPE_OBJECT));
hangouts_register_events(plugin);