/soc/2015/jgeboski/facebook: 06ad6f6aa43a: facebook: implemented...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 06ad6f6aa43a606ddb732a41e8f8a9ec06beaf65
Author:	 James Geboski <[email protected]>
Date:	 2015-08-25 16:48 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/06ad6f6aa43a

Description:

facebook: implemented group chat topic change events

diffstat:

 libpurple/protocols/facebook/api.c      |  59 +++++++++++++++++++++++++++++---
 libpurple/protocols/facebook/api.h      |  10 ++++-
 libpurple/protocols/facebook/facebook.c |  10 ++--
 3 files changed, 65 insertions(+), 14 deletions(-)

diffs (219 lines):

diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -1113,6 +1113,37 @@ fb_api_event_parse(FbApi *api, FbApiEven
 		}
 	};
 
+	values = fb_json_values_new(root);
+	fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
+	                   "$.log_message_type");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.author");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
+	                   "$.log_message_data.name");
+	fb_json_values_update(values, &err);
+
+	if (G_UNLIKELY(err != NULL)) {
+		g_propagate_error(error, err);
+		g_object_unref(values);
+		return events;
+	}
+
+	str = fb_json_values_next_str(values, NULL);
+
+	if (g_strcmp0(str, "log:thread-name") == 0) {
+		str = fb_json_values_next_str(values, "");
+		str = strrchr(str, ':');
+
+		if (str != NULL) {
+			devent = fb_api_event_dup(event, FALSE);
+			devent->type = FB_API_EVENT_TYPE_THREAD_TOPIC;
+			devent->uid = FB_ID_FROM_STR(str + 1);
+			devent->text = fb_json_values_next_str_dup(values, NULL);
+			events = g_slist_prepend(events, devent);
+		}
+	}
+
+	g_object_unref(values);
+
 	for (i = 0; i < G_N_ELEMENTS(evtypes); i++) {
 		values = fb_json_values_new(root);
 		fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$");
@@ -1123,7 +1154,7 @@ fb_api_event_parse(FbApi *api, FbApiEven
 			str = strrchr(str, ':');
 
 			if (str != NULL) {
-				devent = fb_api_event_dup(event);
+				devent = fb_api_event_dup(event, FALSE);
 				devent->type = evtypes[i].type;
 				devent->uid = FB_ID_FROM_STR(str + 1);
 				events = g_slist_prepend(events, devent);
@@ -1142,7 +1173,7 @@ fb_api_event_parse(FbApi *api, FbApiEven
 }
 
 static void
-fb_api_cb_mercury(FbApi *api, GByteArray *pload)
+fb_api_cb_publish_mercury(FbApi *api, GByteArray *pload)
 {
 	const gchar *str;
 	FbApiEvent event;
@@ -1161,7 +1192,7 @@ fb_api_cb_mercury(FbApi *api, GByteArray
 	fb_json_values_set_array(values, FALSE, "$.actions");
 
 	while (fb_json_values_update(values, &err)) {
-		fb_api_event_reset(&event);
+		fb_api_event_reset(&event, FALSE);
 		str = fb_json_values_next_str(values, "0");
 		event.tid = FB_ID_FROM_STR(str);
 
@@ -1569,7 +1600,7 @@ fb_api_cb_mqtt_publish(FbMqtt *mqtt, con
 		void (*func) (FbApi *api, GByteArray *pload);
 	} parsers[] = {
 		{"/mark_thread_response", fb_api_cb_publish_mark},
-		{"/mercury", fb_api_cb_mercury},
+		{"/mercury", fb_api_cb_publish_mercury},
 		{"/orca_typing_notifications", fb_api_cb_publish_typing},
 		{"/t_ms", fb_api_cb_publish_ms},
 		{"/t_p", fb_api_cb_publish_p}
@@ -2851,19 +2882,32 @@ fb_api_typing(FbApi *api, FbId uid, gboo
 }
 
 FbApiEvent *
-fb_api_event_dup(const FbApiEvent *event)
+fb_api_event_dup(const FbApiEvent *event, gboolean deep)
 {
+	FbApiEvent *ret;
+
 	if (event == NULL) {
 		return g_new0(FbApiEvent, 1);
 	}
 
-	return g_memdup(event, sizeof *event);
+	ret = g_memdup(event, sizeof *event);
+
+	if (deep) {
+		ret->text = g_strdup(event->text);
+	}
+
+	return ret;
 }
 
 void
-fb_api_event_reset(FbApiEvent *event)
+fb_api_event_reset(FbApiEvent *event, gboolean deep)
 {
 	g_return_if_fail(event != NULL);
+
+	if (deep) {
+		g_free(event->text);
+	}
+
 	memset(event, 0, sizeof *event);
 }
 
@@ -2871,6 +2915,7 @@ void
 fb_api_event_free(FbApiEvent *event)
 {
 	if (G_LIKELY(event != NULL)) {
+		g_free(event->text);
 		g_free(event);
 	}
 }
diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h
--- a/libpurple/protocols/facebook/api.h
+++ b/libpurple/protocols/facebook/api.h
@@ -262,6 +262,7 @@ typedef enum
 
 /**
  * FbApiEventType:
+ * @FB_API_EVENT_TYPE_THREAD_TOPIC: The thread topic was changed.
  * @FB_API_EVENT_TYPE_THREAD_USER_ADDED: A thread user was added.
  * @FB_API_EVENT_TYPE_THREAD_USER_REMOVED: A thread user was removed.
  *
@@ -269,6 +270,7 @@ typedef enum
  */
 typedef enum
 {
+	FB_API_EVENT_TYPE_THREAD_TOPIC,
 	FB_API_EVENT_TYPE_THREAD_USER_ADDED,
 	FB_API_EVENT_TYPE_THREAD_USER_REMOVED
 } FbApiEventType;
@@ -316,6 +318,7 @@ struct _FbApiClass
  * @type: The #FbApiEventType.
  * @uid: The user #FbId.
  * @tid: The thread #FbId.
+ * @text: The event text.
  *
  * Represents a Facebook update event.
  */
@@ -324,6 +327,7 @@ struct _FbApiEvent
 	FbApiEventType type;
 	FbId uid;
 	FbId tid;
+	gchar *text;
 };
 
 /**
@@ -651,6 +655,7 @@ fb_api_typing(FbApi *api, FbId uid, gboo
 /**
  * fb_api_event_dup:
  * @event: The #FbApiEvent or #NULL.
+ * @deep: #TRUE to duplicate allocated data, otherwise #FALSE.
  *
  * Duplicates an #FbApiEvent. If @event is #NULL, a new zero filled
  * #FbApiEvent is returned. The returned #FbApiEvent should be freed
@@ -659,16 +664,17 @@ fb_api_typing(FbApi *api, FbId uid, gboo
  * Returns: The new #FbApiEvent.
  */
 FbApiEvent *
-fb_api_event_dup(const FbApiEvent *event);
+fb_api_event_dup(const FbApiEvent *event, gboolean deep);
 
 /**
  * fb_api_event_reset:
  * @event: The #FbApiEvent.
+ * @deep: #TRUE to free allocated data, otherwise #FALSE.
  *
  * Resets an #FbApiEvent.
  */
 void
-fb_api_event_reset(FbApiEvent *event);
+fb_api_event_reset(FbApiEvent *event, gboolean deep);
 
 /**
  * fb_api_event_free:
diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c
--- a/libpurple/protocols/facebook/facebook.c
+++ b/libpurple/protocols/facebook/facebook.c
@@ -386,6 +386,11 @@ fb_cb_api_events(FbApi *api, GSList *eve
 		FB_ID_TO_STR(event->uid, uid);
 
 		switch (event->type) {
+		case FB_API_EVENT_TYPE_THREAD_TOPIC:
+			purple_chat_conversation_set_topic(chat, uid,
+			                                   event->text);
+			break;
+
 		case FB_API_EVENT_TYPE_THREAD_USER_ADDED:
 			if (purple_blist_find_buddy(acct, uid) == NULL) {
 				g_hash_table_insert(fetch, &event->tid, event);
@@ -1247,19 +1252,14 @@ fb_chat_set_topic(PurpleConnection *gc, 
 	FbApi *api;
 	FbData *fata;
 	FbId tid;
-	PurpleAccount *acct;
 	PurpleChatConversation *chat;
 
-	acct = purple_connection_get_account(gc);
 	fata = purple_connection_get_protocol_data(gc);
 	api = fb_data_get_api(fata);
 	chat = purple_conversations_find_chat(gc, id);
 
 	name = purple_conversation_get_name(PURPLE_CONVERSATION(chat));
 	tid = FB_ID_FROM_STR(name);
-
-	name = purple_account_get_username(acct);
-	purple_chat_conversation_set_topic(chat, name, topic);
 	fb_api_thread_topic(api, tid, topic);
 }
 

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.