aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2016-04-29 18:08:12 +0200
committerMarius Halden <marius.h@lden.org>2016-05-07 14:31:03 +0200
commitdd0eee9269a1bb68f4b1979f6185f28401489464 (patch)
treece267e858f206eeb16ea995166288db256e38763 /protocols
parent2539b8a01a4e63a8ced42fd6d5f97671be39b446 (diff)
Use separate dedupe-log for filter stream and normal stream
Diffstat (limited to 'protocols')
-rw-r--r--protocols/twitter/twitter.c2
-rw-r--r--protocols/twitter/twitter.h2
-rw-r--r--protocols/twitter/twitter_lib.c40
3 files changed, 33 insertions, 11 deletions
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index 2483cbf7..5694c1b6 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -683,7 +683,9 @@ static void twitter_login(account_t * acc)
td->log_length = (td->long_ids) ? TWITTER_LONG_LOG_LENGTH : TWITTER_SHORT_LOG_LENGTH;
td->log = g_new0(struct twitter_log_data, td->log_length);
+ td->filter_log = g_new0(struct twitter_log_data, td->log_length);
td->log_id = -1;
+ td->filter_log_id = -1;
s = set_getstr(&ic->acc->set, "mode");
if (g_strcasecmp(s, "one") == 0) {
diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h
index a8ad424b..61afa4bb 100644
--- a/protocols/twitter/twitter.h
+++ b/protocols/twitter/twitter.h
@@ -86,6 +86,8 @@ struct twitter_data {
/* set show_ids */
struct twitter_log_data *log;
int log_id;
+ struct twitter_log_data *filter_log;
+ int filter_log_id;
gboolean long_ids;
int log_length;
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index 44f0182d..c04e83ca 100644
--- a/protocols/twitter/twitter_lib.c
+++ b/protocols/twitter/twitter_lib.c
@@ -898,35 +898,51 @@ static char *twitter_msg_add_id(struct im_connection *ic,
}
}
- td->log_id = (td->log_id + 1) % td->log_length;
- td->log[td->log_id].id = txs->id;
- td->log[td->log_id].bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name);
+ if (txs->from_filter) {
+ td->filter_log_id = (td->filter_log_id + 1) % td->log_length;
+ td->filter_log[td->filter_log_id].id = txs->id;
+ td->filter_log[td->filter_log_id].bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name);
+ } else {
+ td->log_id = (td->log_id + 1) % td->log_length;
+ td->log[td->log_id].id = txs->id;
+ td->log[td->log_id].bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name);
+ }
/* This is all getting hairy. :-( If we RT'ed something ourselves,
remember OUR id instead so undo will work. In other cases, the
original tweet's id should be remembered for deduplicating. */
if (g_strcasecmp(txs->user->screen_name, td->user) == 0) {
- td->log[td->log_id].id = txs->rt_id;
- /* More useful than NULL. */
- td->log[td->log_id].bu = &twitter_log_local_user;
+ if (txs->from_filter) {
+ td->filter_log[td->filter_log_id].id = txs->rt_id;
+ /* More useful than NULL. */
+ td->filter_log[td->filter_log_id].bu = &twitter_log_local_user;
+ } else {
+ td->log[td->log_id].id = txs->rt_id;
+ /* More useful than NULL. */
+ td->log[td->log_id].bu = &twitter_log_local_user;
+ }
}
if (set_getbool(&ic->acc->set, "show_ids")) {
if (reply_to != -1) {
if (td->long_ids) {
return g_strdup_printf("\002[\002%04x->%04x\002]\002 %s%s",
- td->log_id, reply_to, prefix, txs->text);
+ txs->from_filter ? td->filter_log_id : td->log_id,
+ reply_to, prefix, txs->text);
} else {
return g_strdup_printf("\002[\002%02x->%02x\002]\002 %s%s",
- td->log_id, reply_to, prefix, txs->text);
+ txs->from_filter ? td->filter_log_id : td->log_id,
+ reply_to, prefix, txs->text);
}
} else {
if (td->long_ids) {
return g_strdup_printf("\002[\002%04x\002]\002 %s%s",
- td->log_id, prefix, txs->text);
+ txs->from_filter ? td->filter_log_id : td->log_id,
+ prefix, txs->text);
} else {
return g_strdup_printf("\002[\002%02x\002]\002 %s%s",
- td->log_id, prefix, txs->text);
+ txs->from_filter ? td->filter_log_id : td->log_id,
+ prefix, txs->text);
}
}
} else {
@@ -1205,10 +1221,12 @@ static gboolean twitter_stream_handle_object(struct im_connection *ic, json_valu
static gboolean twitter_stream_handle_status(struct im_connection *ic, struct twitter_xml_status *txs)
{
struct twitter_data *td = ic->proto_data;
+ struct twitter_log_data *tl;
int i;
+ tl = txs->from_filter ? td->filter_log : td->log;
for (i = 0; i < td->log_length; i++) {
- if (td->log[i].id == txs->id) {
+ if (tl[i].id == txs->id) {
/* Got a duplicate (RT, probably). Drop it. */
return TRUE;
}