diff options
author | jgeboski <jgeboski@gmail.com> | 2015-08-25 15:51:33 -0400 |
---|---|---|
committer | jgeboski <jgeboski@gmail.com> | 2015-08-25 16:33:27 -0400 |
commit | a4fdfe5a96383258df28b2f756eb0d8f3165090a (patch) | |
tree | d71a0712962f04dcecdae98edcd543bfc5a577df | |
parent | d7583c3d34b286c535e00e9c54fca1a5aa4e1e6a (diff) | |
download | bitlbee-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.c | 58 | ||||
-rw-r--r-- | facebook/facebook-api.h | 10 | ||||
-rw-r--r-- | facebook/facebook.c | 5 |
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 * |