diff options
author | Marius Halden <marius.h@lden.org> | 2016-03-19 22:22:57 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2016-04-12 17:17:03 +0200 |
commit | cd643a1462c79b9a0bdbfa426b68f639f8de01e8 (patch) | |
tree | de7a383d660b7b0181b0e955fe22dc82d08457c6 /facebook/facebook.c | |
parent | e38e05d88c33d38d39b373ce2f171e13202f9c93 (diff) | |
download | bitlbee-facebook-cd643a1462c79b9a0bdbfa426b68f639f8de01e8.tar.gz bitlbee-facebook-cd643a1462c79b9a0bdbfa426b68f639f8de01e8.tar.bz2 bitlbee-facebook-cd643a1462c79b9a0bdbfa426b68f639f8de01e8.tar.xz |
Keep track of last message received
Diffstat (limited to 'facebook/facebook.c')
-rw-r--r-- | facebook/facebook.c | 71 |
1 files changed, 55 insertions, 16 deletions
diff --git a/facebook/facebook.c b/facebook/facebook.c index dd624b6..3c4a909 100644 --- a/facebook/facebook.c +++ b/facebook/facebook.c @@ -26,10 +26,13 @@ #define OPT_SELFMESSAGE 0 #endif -typedef enum { - FB_PTRBIT_NEW_BUDDY, - FB_PTRBIT_UNREAD_MSG -} FbPtrBit; +typedef struct { + struct { + gint new_buddy : 1, + unread_msg : 1; + } flags; + FbApiMessage last_message; +} FbBuddyData; static void fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data); @@ -73,7 +76,7 @@ fb_groupchat_new(struct im_connection *ic, FbId tid, const gchar *name) } gc = imcb_chat_new(ic, stid); - gc->data = GINT_TO_POINTER(FALSE); + gc->data = g_new0(FbBuddyData, 1); fb_data_add_groupchat(fata, gc); @@ -206,6 +209,7 @@ fb_cb_api_contacts(FbApi *api, GSList *users, gboolean complete, gpointer data) FbApiUser *user; FbData *fata = data; FbId muid; + FbBuddyData *fbd; gchar uid[FB_ID_STRMAX]; gint sync; GSList *l; @@ -232,7 +236,8 @@ fb_cb_api_contacts(FbApi *api, GSList *users, gboolean complete, gpointer data) imcb_rename_buddy(ic, uid, user->name); bu = imcb_buddy_by_handle(ic, uid); - FB_UTIL_PTRBIT_SET(bu->data, FB_PTRBIT_NEW_BUDDY, TRUE); + fbd = bu->data; + fbd->flags.new_buddy = TRUE; } if (!complete) { @@ -249,8 +254,9 @@ fb_cb_api_contacts(FbApi *api, GSList *users, gboolean complete, gpointer data) continue; } - if (FB_UTIL_PTRBIT_GET(bu->data, FB_PTRBIT_NEW_BUDDY)) { - FB_UTIL_PTRBIT_SET(bu->data, FB_PTRBIT_NEW_BUDDY, FALSE); + fbd = bu->data; + if (fbd->flags.new_buddy) { + fbd->flags.new_buddy = FALSE; } else { imcb_remove_buddy(ic, bu->handle, NULL); } @@ -361,6 +367,7 @@ fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data) bee_user_t *bu; FbApiMessage *msg; FbData *fata = data; + FbBuddyData *fbd; gboolean mark; gboolean selfmess; gchar *str; @@ -416,13 +423,24 @@ fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data) } if (msg->tid == 0) { + fbd = bu->data; if (mark) { fb_api_read(api, msg->uid, FALSE); } else { - FB_UTIL_PTRBIT_SET(bu->data, FB_PTRBIT_UNREAD_MSG, TRUE); + fbd->flags.unread_msg = TRUE; + } + + if (msg->tstamp <= fbd->last_message.tstamp || + (msg->tstamp == fbd->last_message.tstamp && + g_strcmp0(msg->text, fbd->last_message.text) == 0)) + { + continue; } imcb_buddy_msg(ic, uid, (gchar *) msg->text, flags, tstamp); + g_free(fbd->last_message.text); + fbd->last_message = *msg; + fbd->last_message.text = g_strdup(msg->text); continue; } @@ -438,13 +456,25 @@ fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data) } if (gc != NULL) { + fbd = gc->data; if (mark) { fb_api_read(api, msg->tid, TRUE); } else { - gc->data = GINT_TO_POINTER(TRUE); + fbd->flags.unread_msg = TRUE; + } + + if (msg->tstamp < fbd->last_message.tstamp || + (msg->tstamp == fbd->last_message.tstamp && + msg->uid == fbd->last_message.uid && + g_strcmp0(msg->text, fbd->last_message.text) == 0)) + { + continue; } imcb_chat_msg(gc, uid, (gchar *) msg->text, flags, tstamp); + g_free(fbd->last_message.text); + fbd->last_message = *msg; + fbd->last_message.text = g_strdup(msg->text); } } } @@ -777,10 +807,10 @@ fb_buddy_msg(struct im_connection *ic, char *to, char *message, int flags) if (set_getbool(&acct->set, "mark_read_reply") && (bu != NULL) && - FB_UTIL_PTRBIT_GET(bu->data, FB_PTRBIT_UNREAD_MSG)) + (((FbBuddyData *)bu->data)->flags.unread_msg)) { fb_api_read(api, uid, FALSE); - FB_UTIL_PTRBIT_SET(bu->data, FB_PTRBIT_UNREAD_MSG, FALSE); + ((FbBuddyData *)by->data)->flags.unread_msg = FALSE; } fb_api_message(api, uid, FALSE, message); @@ -863,6 +893,10 @@ static void fb_chat_leave(struct groupchat *gc) { FbData *fata = gc->ic->proto_data; + FbBuddyData *fbd = gc->data; + + g_free(fbd->last_message.text); + g_free(gc->data); fb_data_remove_groupchat(fata, gc); imcb_chat_free(gc); @@ -875,16 +909,18 @@ fb_chat_msg(struct groupchat *gc, char *message, int flags) FbApi *api; FbData *fata = gc->ic->proto_data; FbId tid; + FbBuddyData *fbd; api = fb_data_get_api(fata); tid = FB_ID_FROM_STR(gc->title); fb_api_message(api, tid, TRUE, message); + fbd = gc->data; if (set_getbool(&acct->set, "mark_read_reply") && - GPOINTER_TO_INT(gc->data)) + (fbd->flags.unread_msg)) { fb_api_read(api, tid, TRUE); - gc->data = GINT_TO_POINTER(TRUE); + fbd->flags.unread_msg = FALSE; } } @@ -925,13 +961,16 @@ fb_away_states(struct im_connection *ic) static void fb_buddy_data_add(struct bee_user *bu) { - bu->data = GINT_TO_POINTER(0); + bu->data = g_new0(FbBuddyData, 1); } static void fb_buddy_data_free(struct bee_user *bu) { - bu->data = NULL; + FbBuddyData *fbd = bu->data; + + g_free(fbd->last_message.text); + g_free(bu->data); } static account_t * |