diff options
-rw-r--r-- | facebook/facebook-api.c | 26 | ||||
-rw-r--r-- | facebook/facebook.c | 31 |
2 files changed, 54 insertions, 3 deletions
diff --git a/facebook/facebook-api.c b/facebook/facebook-api.c index 0ec8e07..184cb89 100644 --- a/facebook/facebook-api.c +++ b/facebook/facebook-api.c @@ -436,6 +436,23 @@ fb_api_class_init(FbApiClass *klass) 1, FB_TYPE_ID); /** + * FbApi::thread-kicked: + * @api: The #FbApi. + * @thrd: The #FbApiThread. + * + * Emitted upon the reply of a thread request when the user is no longer + * part of that thread. This is emitted as a result of #fb_api_thread(). + */ + g_signal_new("thread-kicked", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_ACTION, + 0, + NULL, NULL, + fb_marshal_VOID__POINTER, + G_TYPE_NONE, + 1, G_TYPE_POINTER); + + /** * FbApi::threads: * @api: The #FbApi. * @thrds: The #GSList of #FbApiThread's. @@ -2591,7 +2608,6 @@ fb_api_thread_parse(FbApi *api, FbApiThread *thrd, JsonNode *root, } if (num_users < 2 || !haself) { - fb_api_thread_reset(thrd, TRUE); g_object_unref(values); return FALSE; } @@ -2626,8 +2642,12 @@ fb_api_cb_thread(FbHttpRequest *req, gpointer data) if (!fb_api_thread_parse(api, &thrd, node, &err)) { if (G_LIKELY(err == NULL)) { - fb_api_error(api, FB_API_ERROR_GENERAL, - "Failed to parse thread information"); + if (thrd.tid) { + g_signal_emit_by_name(api, "thread-kicked", &thrd); + } else { + fb_api_error(api, FB_API_ERROR_GENERAL, + "Failed to parse thread information"); + } } else { fb_api_error_emit(api, err); } diff --git a/facebook/facebook.c b/facebook/facebook.c index 55f9c37..4ef9fc9 100644 --- a/facebook/facebook.c +++ b/facebook/facebook.c @@ -571,6 +571,33 @@ fb_cb_api_thread_create(FbApi *api, FbId tid, gpointer data) } static void +fb_cb_api_thread_kicked(FbApi *api, FbApiThread *thrd, gpointer data) +{ + FbData *fata = data; + gchar id[FB_ID_STRMAX]; + gchar *topic; + struct groupchat *gc; + struct im_connection *ic; + + FB_ID_TO_STR(thrd->tid, id); + ic = fb_data_get_connection(fata); + gc = bee_chat_by_title(ic->bee, ic, id); + + if (G_UNLIKELY(gc == NULL)) { + return; + } + + topic = fb_thread_topic_gen(thrd); + imcb_chat_topic(gc, NULL, topic, 0); + g_free(topic); + + imcb_chat_log(gc, "You have been removed from this chat"); + + fb_data_remove_groupchat(fata, gc); + imcb_chat_free(gc); +} + +static void fb_cb_api_threads(FbApi *api, GSList *thrds, gpointer data) { FbApiThread *thrd; @@ -744,6 +771,10 @@ fb_login(account_t *acc) G_CALLBACK(fb_cb_api_thread_create), fata); g_signal_connect(api, + "thread-kicked", + G_CALLBACK(fb_cb_api_thread_kicked), + fata); + g_signal_connect(api, "threads", G_CALLBACK(fb_cb_api_threads), fata); |