aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjgeboski <jgeboski@gmail.com>2015-08-25 15:51:33 -0400
committerjgeboski <jgeboski@gmail.com>2015-08-25 16:33:27 -0400
commita4fdfe5a96383258df28b2f756eb0d8f3165090a (patch)
treed71a0712962f04dcecdae98edcd543bfc5a577df
parentd7583c3d34b286c535e00e9c54fca1a5aa4e1e6a (diff)
downloadbitlbee-facebook-a4fdfe5a96383258df28b2f756eb0d8f3165090a.tar.gz
bitlbee-facebook-a4fdfe5a96383258df28b2f756eb0d8f3165090a.tar.bz2
bitlbee-facebook-a4fdfe5a96383258df28b2f756eb0d8f3165090a.tar.xz
Implemented group chat topic change events
-rw-r--r--facebook/facebook-api.c58
-rw-r--r--facebook/facebook-api.h10
-rw-r--r--facebook/facebook.c5
3 files changed, 63 insertions, 10 deletions
diff --git a/facebook/facebook-api.c b/facebook/facebook-api.c
index 9ba01ec..7a698b0 100644
--- a/facebook/facebook-api.c
+++ b/facebook/facebook-api.c
@@ -1064,6 +1064,36 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,
}
};
+ 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, "$");
@@ -1074,7 +1104,7 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,
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);
@@ -1093,7 +1123,7 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,
}
static void
-fb_api_cb_mercury(FbApi *api, GByteArray *pload)
+fb_api_cb_publish_mercury(FbApi *api, GByteArray *pload)
{
const gchar *str;
FbApiEvent event;
@@ -1112,7 +1142,7 @@ fb_api_cb_mercury(FbApi *api, GByteArray *pload)
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);
@@ -1518,7 +1548,7 @@ fb_api_cb_mqtt_publish(FbMqtt *mqtt, const gchar *topic, GByteArray *pload,
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}
@@ -2782,19 +2812,32 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state)
}
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);
}
@@ -2802,6 +2845,7 @@ void
fb_api_event_free(FbApiEvent *event)
{
if (G_LIKELY(event != NULL)) {
+ g_free(event->text);
g_free(event);
}
}
diff --git a/facebook/facebook-api.h b/facebook/facebook-api.h
index d72abbc..75bd739 100644
--- a/facebook/facebook-api.h
+++ b/facebook/facebook-api.h
@@ -255,6 +255,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.
*
@@ -262,6 +263,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;
@@ -309,6 +311,7 @@ struct _FbApiClass
* @type: The #FbApiEventType.
* @uid: The user #FbId.
* @tid: The thread #FbId.
+ * @text: The event text.
*
* Represents a Facebook update event.
*/
@@ -317,6 +320,7 @@ struct _FbApiEvent
FbApiEventType type;
FbId uid;
FbId tid;
+ gchar *text;
};
/**
@@ -643,6 +647,7 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state);
/**
* 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
@@ -651,16 +656,17 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state);
* 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/facebook/facebook.c b/facebook/facebook.c
index 61bc04d..8b970a5 100644
--- a/facebook/facebook.c
+++ b/facebook/facebook.c
@@ -221,6 +221,10 @@ fb_cb_api_events(FbApi *api, GSList *events, gpointer data)
FB_ID_TO_STR(event->uid, uid);
switch (event->type) {
+ case FB_API_EVENT_TYPE_THREAD_TOPIC:
+ imcb_chat_topic(gc, uid, (gchar *) event->text, 0);
+ break;
+
case FB_API_EVENT_TYPE_THREAD_USER_ADDED:
if (bee_user_by_handle(ic->bee, ic, uid) == NULL) {
g_hash_table_insert(fetch, &event->tid, event);
@@ -755,7 +759,6 @@ fb_chat_topic(struct groupchat *gc, char *topic)
api = fb_data_get_api(fata);
tid = FB_ID_FROM_STR(gc->title);
fb_api_thread_topic(api, tid, topic);
- imcb_chat_topic(gc, NULL, topic, 0);
}
static account_t *