diff options
| -rw-r--r-- | facebook/facebook-api.c | 30 | ||||
| -rw-r--r-- | facebook/facebook.c | 80 | 
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); | 
