aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2017-01-07 18:51:05 +0100
committerMarius Halden <marius.h@lden.org>2017-01-07 18:51:05 +0100
commitdfc6d6593cad26ffef63657b2abdd63a9420e2bb (patch)
tree621dcf0a9aae8f1d02f8ce8c2e1561e13d3bd943
parent83702a89afa8575dbb155115eec57d6629e67748 (diff)
parent2707fa7895f33f3886616169073fc8b5fabfdd02 (diff)
downloadbitlbee-facebook-dfc6d6593cad26ffef63657b2abdd63a9420e2bb.tar.gz
bitlbee-facebook-dfc6d6593cad26ffef63657b2abdd63a9420e2bb.tar.bz2
bitlbee-facebook-dfc6d6593cad26ffef63657b2abdd63a9420e2bb.tar.xz
Merge branch 'master' into track-messages
-rw-r--r--facebook/facebook-api.c30
-rw-r--r--facebook/facebook.c80
2 files changed, 87 insertions, 23 deletions
diff --git a/facebook/facebook-api.c b/facebook/facebook-api.c
index 4a54e41..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.
@@ -2535,6 +2552,7 @@ fb_api_thread_parse(FbApi *api, FbApiThread *thrd, JsonNode *root,
FbId uid;
FbJsonValues *values;
gboolean haself = FALSE;
+ guint num_users = 0;
GError *err = NULL;
values = fb_json_values_new(root);
@@ -2570,6 +2588,7 @@ fb_api_thread_parse(FbApi *api, FbApiThread *thrd, JsonNode *root,
while (fb_json_values_update(values, &err)) {
str = fb_json_values_next_str(values, "0");
uid = FB_ID_FROM_STR(str);
+ num_users++;
if (uid != priv->uid) {
user = fb_api_user_dup(NULL, FALSE);
@@ -2588,8 +2607,7 @@ fb_api_thread_parse(FbApi *api, FbApiThread *thrd, JsonNode *root,
return FALSE;
}
- if ((g_slist_length(thrd->users) < 2) || !haself) {
- fb_api_thread_reset(thrd, TRUE);
+ if (num_users < 2 || !haself) {
g_object_unref(values);
return FALSE;
}
@@ -2624,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 ae4ba63..15dd6c6 100644
--- a/facebook/facebook.c
+++ b/facebook/facebook.c
@@ -513,6 +513,32 @@ fb_cb_api_presences(FbApi *api, GSList *press, gpointer data)
}
}
+static gchar *
+fb_thread_topic_gen(FbApiThread *thrd)
+{
+ GSList *l;
+ GString *gstr;
+ FbApiUser *user;
+
+ if (thrd->topic != NULL) {
+ return g_strdup(thrd->topic);
+ }
+
+ gstr = g_string_new(NULL);
+
+ for (l = thrd->users; l != NULL; l = l->next) {
+ user = l->data;
+
+ if (gstr->len > 0) {
+ g_string_append(gstr, ", ");
+ }
+
+ g_string_append(gstr, user->name);
+ }
+
+ return g_string_free(gstr, FALSE);
+}
+
static void
fb_cb_api_thread(FbApi *api, FbApiThread *thrd, gpointer data)
{
@@ -520,9 +546,9 @@ fb_cb_api_thread(FbApi *api, FbApiThread *thrd, gpointer data)
FbApiUser *user;
FbData *fata = data;
gchar id[FB_ID_STRMAX];
+ gchar *topic;
GList *h;
GSList *l;
- GString *gstr;
struct groupchat *gc;
struct im_connection *ic;
@@ -534,24 +560,9 @@ fb_cb_api_thread(FbApi *api, FbApiThread *thrd, gpointer data)
return;
}
- if (thrd->topic == NULL) {
- gstr = g_string_new(NULL);
-
- for (l = thrd->users; l != NULL; l = l->next) {
- user = l->data;
-
- if (gstr->len > 0) {
- g_string_append(gstr, ", ");
- }
-
- g_string_append(gstr, user->name);
- }
-
- imcb_chat_topic(gc, NULL, gstr->str, 0);
- g_string_free(gstr, TRUE);
- } else {
- imcb_chat_topic(gc, NULL, (gchar *) thrd->topic, 0);
- }
+ topic = fb_thread_topic_gen(thrd);
+ imcb_chat_topic(gc, NULL, topic, 0);
+ g_free(topic);
for (l = thrd->users; l != NULL; l = l->next) {
user = l->data;
@@ -590,6 +601,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;
@@ -763,6 +801,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);