aboutsummaryrefslogtreecommitdiffstats
path: root/facebook/facebook.c
diff options
context:
space:
mode:
Diffstat (limited to 'facebook/facebook.c')
-rw-r--r--facebook/facebook.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/facebook/facebook.c b/facebook/facebook.c
index 15dd6c6..fb7e2b6 100644
--- a/facebook/facebook.c
+++ b/facebook/facebook.c
@@ -202,16 +202,32 @@ fb_cb_sync_contacts(gpointer data, gint fd, b_input_condition cond)
}
static void
+fb_sync_contacts_add_timeout(FbData *fata)
+{
+ gint sync;
+ struct im_connection *ic = fb_data_get_connection(fata);
+ account_t *acct = ic->acc;
+
+ sync = set_getint(&acct->set, "sync_interval");
+
+ if (sync < 1) {
+ set_setint(&acct->set, "sync_interval", 1);
+ sync = 1;
+ }
+
+ sync *= 60 * 1000;
+ fb_data_add_timeout(fata, "sync-contacts", sync, fb_cb_sync_contacts,
+ fata);
+}
+
+static void
fb_cb_api_contacts(FbApi *api, GSList *users, gboolean complete, gpointer data)
{
- account_t *acct;
- bee_user_t *bu;
FbApiUser *user;
FbData *fata = data;
FbId muid;
FbBuddyData *fbd;
gchar uid[FB_ID_STRMAX];
- gint sync;
GSList *l;
GValue val = G_VALUE_INIT;
struct im_connection *ic;
@@ -244,40 +260,44 @@ fb_cb_api_contacts(FbApi *api, GSList *users, gboolean complete, gpointer data)
return;
}
- l = ic->bee->users;
+ if (!(ic->flags & OPT_LOGGED_IN)) {
+ imcb_log(ic, "Connecting");
+ fb_api_connect(api, FALSE);
+ }
- while (l != NULL) {
- bu = l->data;
- l = l->next;
+ fb_sync_contacts_add_timeout(fata);
+}
- if (bu->ic != ic) {
- continue;
- }
+static void
+fb_cb_api_contacts_delta(FbApi *api, GSList *added, GSList *removed, gpointer data)
+{
+ bee_user_t *bu;
+ FbApiUser *user;
+ FbData *fata = data;
+ gchar uid[FB_ID_STRMAX];
+ GSList *l;
+ struct im_connection *ic;
- fbd = bu->data;
- if (fbd->flags.new_buddy) {
- fbd->flags.new_buddy = FALSE;
- } else {
- imcb_remove_buddy(ic, bu->handle, NULL);
- }
- }
+ ic = fb_data_get_connection(fata);
- if (!(ic->flags & OPT_LOGGED_IN)) {
- imcb_log(ic, "Connecting");
- fb_api_connect(api, FALSE);
+ for (l = added; l != NULL; l = l->next) {
+ user = l->data;
+ FB_ID_TO_STR(user->uid, uid);
+
+ imcb_add_buddy(ic, uid, NULL);
+ imcb_buddy_nick_hint(ic, uid, user->name);
+ imcb_rename_buddy(ic, uid, user->name);
}
- acct = ic->acc;
- sync = set_getint(&acct->set, "sync_interval");
+ for (l = removed; l != NULL; l = l->next) {
+ bu = imcb_buddy_by_handle(ic, l->data);
- if (sync < 5) {
- set_setint(&acct->set, "sync_interval", 5);
- sync = 5;
+ if (bu) {
+ imcb_remove_buddy(ic, bu->handle, NULL);
+ }
}
- sync *= 60 * 1000;
- fb_data_add_timeout(fata, "sync-contacts", sync, fb_cb_sync_contacts,
- fata);
+ fb_sync_contacts_add_timeout(fata);
}
static void
@@ -745,7 +765,7 @@ fb_init(account_t *acct)
set_add(&acct->set, "mark_read", "false", fb_eval_mark_read, acct);
set_add(&acct->set, "mark_read_reply", "false", set_eval_bool, acct);
set_add(&acct->set, "show_unread", "false", set_eval_bool, acct);
- set_add(&acct->set, "sync_interval", "30", set_eval_int, acct);
+ set_add(&acct->set, "sync_interval", "5", set_eval_int, acct);
}
static void
@@ -777,6 +797,10 @@ fb_login(account_t *acc)
G_CALLBACK(fb_cb_api_contacts),
fata);
g_signal_connect(api,
+ "contacts-delta",
+ G_CALLBACK(fb_cb_api_contacts_delta),
+ fata);
+ g_signal_connect(api,
"error",
G_CALLBACK(fb_cb_api_error),
fata);