diff options
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | facebook/facebook-api.c | 55 | ||||
-rw-r--r-- | facebook/facebook-api.h | 4 | ||||
-rw-r--r-- | facebook/facebook-http.c | 4 | ||||
-rw-r--r-- | facebook/facebook.c | 26 |
5 files changed, 67 insertions, 26 deletions
diff --git a/configure.ac b/configure.ac index 3395d3c..031ec7e 100644 --- a/configure.ac +++ b/configure.ac @@ -16,9 +16,9 @@ AC_INIT( [bitlbee-facebook], [1.0.0], - [https://github.com/jgeboski/bitlbee-facebook/issues], + [https://github.com/bitlbee/bitlbee-facebook/issues], [bitlbee-facebook], - [https://github.com/jgeboski/bitlbee-facebook], + [https://github.com/bitlbee/bitlbee-facebook], [] ) diff --git a/facebook/facebook-api.c b/facebook/facebook-api.c index c8e5e30..213937e 100644 --- a/facebook/facebook-api.c +++ b/facebook/facebook-api.c @@ -589,6 +589,12 @@ fb_api_json_chk(FbApi *api, gconstpointer data, gssize size, JsonNode **node) priv->token = NULL; } + /* 509 is used for "invalid attachment id" */ + if (code == 509) { + errc = FB_API_ERROR_NONFATAL; + success = FALSE; + } + str = fb_json_values_next_str(values, NULL); if ((g_strcmp0(str, "ERROR_QUEUE_NOT_FOUND") == 0) || @@ -1890,13 +1896,35 @@ fb_api_auth(FbApi *api, const gchar *user, const gchar *pass) fb_api_cb_auth); } +static gchar * +fb_api_user_icon_checksum(gchar *icon) +{ + gchar *csum; + FbHttpValues *prms; + + if (G_UNLIKELY(icon == NULL)) { + return NULL; + } + + prms = fb_http_values_new(); + fb_http_values_parse(prms, icon, TRUE); + csum = fb_http_values_dup_str(prms, "oh", NULL); + fb_http_values_free(prms); + + if (G_UNLIKELY(csum == NULL)) { + /* Revert to the icon URL as the unique checksum */ + csum = g_strdup(icon); + } + + return csum; +} + static void fb_api_cb_contact(FbHttpRequest *req, gpointer data) { const gchar *str; FbApi *api = data; FbApiUser user; - FbHttpValues *prms; FbJsonValues *values; GError *err = NULL; JsonNode *node; @@ -1918,7 +1946,7 @@ fb_api_cb_contact(FbHttpRequest *req, gpointer data) values = fb_json_values_new(node); fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.id"); fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.name"); - fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, + fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.profile_pic_large.uri"); fb_json_values_update(values, &err); @@ -1934,15 +1962,7 @@ fb_api_cb_contact(FbHttpRequest *req, gpointer data) user.name = fb_json_values_next_str_dup(values, NULL); user.icon = fb_json_values_next_str_dup(values, NULL); - prms = fb_http_values_new(); - fb_http_values_parse(prms, user.icon, TRUE); - user.csum = fb_http_values_dup_str(prms, "oh", NULL); - fb_http_values_free(prms); - - if (G_UNLIKELY(user.csum == NULL)) { - /* Revert to the icon URL as the unique checksum */ - user.csum = g_strdup(user.icon); - } + user.csum = fb_api_user_icon_checksum(user.icon); g_signal_emit_by_name(api, "contact", &user); fb_api_user_reset(&user, TRUE); @@ -1972,7 +1992,6 @@ fb_api_cb_contacts(FbHttpRequest *req, gpointer data) FbApi *api = data; FbApiPrivate *priv = api->priv; FbApiUser *user; - FbHttpValues *prms; FbId uid; FbJsonValues *values; gboolean complete; @@ -1991,7 +2010,7 @@ fb_api_cb_contacts(FbHttpRequest *req, gpointer data) "$.represented_profile.friendship_status"); fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.structured_name.text"); - fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, + fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.hugePictureUrl.uri"); fb_json_values_set_array(values, FALSE, "$.viewer.messenger_contacts" ".nodes"); @@ -2012,15 +2031,7 @@ fb_api_cb_contacts(FbHttpRequest *req, gpointer data) user->name = fb_json_values_next_str_dup(values, NULL); user->icon = fb_json_values_next_str_dup(values, NULL); - prms = fb_http_values_new(); - fb_http_values_parse(prms, user->icon, TRUE); - user->csum = fb_http_values_dup_str(prms, "oh", NULL); - fb_http_values_free(prms); - - if (G_UNLIKELY(user->csum == NULL)) { - /* Revert to the icon URL as the unique checksum */ - user->csum = g_strdup(user->icon); - } + user->csum = fb_api_user_icon_checksum(user->icon); users = g_slist_prepend(users, user); } diff --git a/facebook/facebook-api.h b/facebook/facebook-api.h index 2da2977..5e17e98 100644 --- a/facebook/facebook-api.h +++ b/facebook/facebook-api.h @@ -341,6 +341,7 @@ typedef struct _FbApiUser FbApiUser; * @FB_API_ERROR_GENERAL: General failure. * @FB_API_ERROR_AUTH: Authentication failure. * @FB_API_ERROR_QUEUE: Queue failure. + * @FB_API_ERROR_NONFATAL: Other non-fatal errors. * * The error codes for the #FB_API_ERROR domain. */ @@ -348,7 +349,8 @@ typedef enum { FB_API_ERROR_GENERAL, FB_API_ERROR_AUTH, - FB_API_ERROR_QUEUE + FB_API_ERROR_QUEUE, + FB_API_ERROR_NONFATAL } FbApiError; /** diff --git a/facebook/facebook-http.c b/facebook/facebook-http.c index da1f631..6234d55 100644 --- a/facebook/facebook-http.c +++ b/facebook/facebook-http.c @@ -528,6 +528,10 @@ fb_http_urlcmp(const gchar *url1, const gchar *url2, gboolean protocol) return url1 == url2; } + if (strstr(url1, url2) != NULL || strstr(url2, url1) != NULL) { + return TRUE; + } + if (!url_set(&purl1, url1) || !url_set(&purl2, url2)) { return g_ascii_strcasecmp(url1, url2) == 0; } diff --git a/facebook/facebook.c b/facebook/facebook.c index 23a8864..dcf4071 100644 --- a/facebook/facebook.c +++ b/facebook/facebook.c @@ -300,7 +300,10 @@ fb_cb_api_error(FbApi *api, GError *error, gpointer data) ic = fb_data_get_connection(fata); fb_util_debug_error("%s", error->message); imcb_error(ic, "%s", error->message); - imc_logout(ic, recon); + + if (!g_error_matches(error, FB_API_ERROR, FB_API_ERROR_NONFATAL)) { + imc_logout(ic, recon); + } } static void @@ -1187,3 +1190,24 @@ init_plugin(void) root_command_add("fbcreate", 0, fb_cmd_fbcreate, 0); root_command_add("fbjoin", 0, fb_cmd_fbjoin, 0); } + + +#ifdef BITLBEE_ABI_VERSION_CODE +G_MODULE_EXPORT struct plugin_info * +init_plugin_info(void); + +G_MODULE_EXPORT struct plugin_info * +init_plugin_info(void) +{ + static struct plugin_info info = { + BITLBEE_ABI_VERSION_CODE, + "facebook", + PACKAGE_VERSION, + "Facebook protocol plugin", + "dequis <dx@dxzone.com.ar> (maintainer), James Geboski <jgeboski@gmail.com> (original author)", + PACKAGE_URL + }; + + return &info; +} +#endif /* BITLBEE_ABI_VERSION_CODE */ |