diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-11-25 17:43:13 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-11-25 17:43:13 +0000 | 
| commit | 29f72b7a4b4fa960b6fccb45243fa3f5d87a99bf (patch) | |
| tree | 8d7f463c5cfd9d4914ed65e9ad72884e6e1bada7 /protocols/twitter/twitter_lib.c | |
| parent | 7f557d53d986c5f688c5781fea04a46464e5b491 (diff) | |
Finally cleaned up the show-tweet functions.
Diffstat (limited to 'protocols/twitter/twitter_lib.c')
| -rw-r--r-- | protocols/twitter/twitter_lib.c | 145 | 
1 files changed, 68 insertions, 77 deletions
| diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 1b7f382a..b888a730 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -462,6 +462,7 @@ static struct twitter_xml_status *twitter_xt_get_status(const json_value *node)  	JSON_O_FOREACH (node, k, v) {  		if (strcmp("text", k) == 0 && v->type == json_string) {  			txs->text = g_memdup(v->u.string.ptr, v->u.string.length + 1); +			strip_html(txs->text);  		} else if (strcmp("retweeted_status", k) == 0 && v->type == json_object) {  			rt = v;  		} else if (strcmp("created_at", k) == 0 && v->type == json_string) { @@ -519,6 +520,7 @@ static struct twitter_xml_status *twitter_xt_get_dm(const json_value *node)  	JSON_O_FOREACH (node, k, v) {  		if (strcmp("text", k) == 0 && v->type == json_string) {  			txs->text = g_memdup(v->u.string.ptr, v->u.string.length + 1); +			strip_html(txs->text);  		} else if (strcmp("created_at", k) == 0 && v->type == json_string) {  			struct tm parsed; @@ -566,7 +568,7 @@ static char* expand_entities(char* text, const json_value *entities) {  				continue;  			*pos = '\0'; -			new = g_strdup_printf("%s%s <%s>%s", text, kort, +			new = g_strdup_printf("%s%s <%s>%s", text, kort,  			                      disp, pos + strlen(kort));  			g_free(text); @@ -658,96 +660,85 @@ static char *twitter_msg_add_id(struct im_connection *ic,  /**   * Function that is called to see the statuses in a groupchat window.   */ -static void twitter_groupchat(struct im_connection *ic, GSList * list) +static void twitter_status_show_chat(struct im_connection *ic, struct twitter_xml_status *status)  {  	struct twitter_data *td = ic->proto_data; -	GSList *l = NULL; -	struct twitter_xml_status *status;  	struct groupchat *gc; -	guint64 last_id = 0; +	gboolean me = g_strcasecmp(td->user, status->user->screen_name) == 0; +	char *msg;  	// Create a new groupchat if it does not exsist.  	gc = twitter_groupchat_init(ic); -	for (l = list; l; l = g_slist_next(l)) { -		char *msg; - -		status = l->data; -		if (status->user == NULL || status->text == NULL || last_id == status->id) -			continue; - -		last_id = status->id; - -		strip_html(status->text); - -		if (set_getbool(&ic->acc->set, "strip_newlines")) -			strip_newlines(status->text); - -		msg = twitter_msg_add_id(ic, status, ""); - -		// Say it! -		if (g_strcasecmp(td->user, status->user->screen_name) == 0) { -			imcb_chat_log(gc, "You: %s", msg ? msg : status->text); -		} else { -			twitter_add_buddy(ic, status->user->screen_name, status->user->name); - -			imcb_chat_msg(gc, status->user->screen_name, -				      msg ? msg : status->text, 0, status->created_at); -		} - -		g_free(msg); - -		// Update the timeline_id to hold the highest id, so that by the next request -		// we won't pick up the updates already in the list. -		td->timeline_id = MAX(td->timeline_id, status->id); +	if (!me) +		/* MUST be done before twitter_msg_add_id() to avoid #872. */ +		twitter_add_buddy(ic, status->user->screen_name, status->user->name); +	msg = twitter_msg_add_id(ic, status, ""); +	 +	// Say it! +	if (me) { +		imcb_chat_log(gc, "You: %s", msg ? msg : status->text); +	} else { +		imcb_chat_msg(gc, status->user->screen_name, +			      msg ? msg : status->text, 0, status->created_at);  	} + +	g_free(msg);  }  /**   * Function that is called to see statuses as private messages.   */ -static void twitter_private_message_chat(struct im_connection *ic, GSList * list) +static void twitter_status_show_msg(struct im_connection *ic, struct twitter_xml_status *status)  {  	struct twitter_data *td = ic->proto_data; -	GSList *l = NULL; -	struct twitter_xml_status *status;  	char from[MAX_STRING] = ""; -	guint64 last_id = 0; +	char *prefix = NULL, *text = NULL; +	gboolean me = g_strcasecmp(td->user, status->user->screen_name) == 0;  	if (td->flags & TWITTER_MODE_ONE) {  		g_snprintf(from, sizeof(from) - 1, "%s_%s", td->prefix, ic->acc->user);  		from[MAX_STRING - 1] = '\0';  	} -	for (l = list; l; l = g_slist_next(l)) { -		char *prefix = NULL, *text = NULL; - -		status = l->data; -		if (status->user == NULL || status->text == NULL || last_id == status->id) -			continue; - -		last_id = status->id; +	if (td->flags & TWITTER_MODE_ONE) +		prefix = g_strdup_printf("\002<\002%s\002>\002 ", +		                         status->user->screen_name); +	else if (!me) +		twitter_add_buddy(ic, status->user->screen_name, status->user->name); +	else +		prefix = g_strdup("You: "); -		strip_html(status->text); -		if (td->flags & TWITTER_MODE_ONE) -			prefix = g_strdup_printf("\002<\002%s\002>\002 ", -			                         status->user->screen_name); -		else -			twitter_add_buddy(ic, status->user->screen_name, status->user->name); +	text = twitter_msg_add_id(ic, status, prefix ? prefix : ""); -		text = twitter_msg_add_id(ic, status, prefix ? prefix : ""); +	imcb_buddy_msg(ic, +	               *from ? from : status->user->screen_name, +	               text ? text : status->text, 0, status->created_at); -		imcb_buddy_msg(ic, -		               *from ? from : status->user->screen_name, -		               text ? text : status->text, 0, status->created_at); +	g_free(text); +	g_free(prefix); +} -		// Update the timeline_id to hold the highest id, so that by the next request -		// we won't pick up the updates already in the list. -		td->timeline_id = MAX(td->timeline_id, status->id); +static void twitter_status_show(struct im_connection *ic, struct twitter_xml_status *status) +{ +	struct twitter_data *td = ic->proto_data; +	 +	if (status->user == NULL || status->text == NULL) +		return; +	 +	/* Grrrr. Would like to do this during parsing, but can't access +	   settings from there. */ +	if (set_getbool(&ic->acc->set, "strip_newlines")) +		strip_newlines(status->text); +	 +	if (td->flags & TWITTER_MODE_CHAT) +		twitter_status_show_chat(ic, status); +	else +		twitter_status_show_msg(ic, status); -		g_free(text); -		g_free(prefix); -	} +	// Update the timeline_id to hold the highest id, so that by the next request +	// we won't pick up the updates already in the list. +	td->timeline_id = MAX(td->timeline_id, status->id);  }  static gboolean twitter_stream_handle_object(struct im_connection *ic, json_value *o); @@ -847,7 +838,7 @@ static gboolean twitter_stream_handle_status(struct im_connection *ic, struct tw  	for (i = 0; i < TWITTER_LOG_LENGTH; i++) {  		if (td->log[i].id == txs->id) { -			/* Got a duplicate (RT, surely). Drop it. */ +			/* Got a duplicate (RT, probably). Drop it. */  			txs_free(txs);  			return TRUE;  		} @@ -864,10 +855,9 @@ static gboolean twitter_stream_handle_status(struct im_connection *ic, struct tw  		return TRUE;  	} -	GSList *output = g_slist_append(NULL, txs); -	twitter_groupchat(ic, output); +	twitter_status_show(ic, txs);  	txs_free(txs); -	g_slist_free(output); +	  	return TRUE;  } @@ -950,9 +940,12 @@ void twitter_flush_timeline(struct im_connection *ic)  	int show_old_mentions = set_getint(&ic->acc->set, "show_old_mentions");  	struct twitter_xml_list *home_timeline = td->home_timeline_obj;  	struct twitter_xml_list *mentions = td->mentions_obj; +	guint64 last_id = 0;  	GSList *output = NULL;  	GSList *l; +	imcb_connected(ic); +	  	if (!(td->flags & TWITTER_GOT_TIMELINE)) {  		return;  	} @@ -976,17 +969,15 @@ void twitter_flush_timeline(struct im_connection *ic)  			output = g_slist_insert_sorted(output, l->data, twitter_compare_elements);  		}  	} -	 -	if (!(ic->flags & OPT_LOGGED_IN)) -		imcb_connected(ic);  	// See if the user wants to see the messages in a groupchat window or as private messages. -	if (td->flags & TWITTER_MODE_CHAT) -		twitter_groupchat(ic, output); -	else -		twitter_private_message_chat(ic, output); - -	g_slist_free(output); +	while (output) { +		struct twitter_xml_status *txs = output->data; +		if (txs->id != last_id) +			twitter_status_show(ic, txs); +		last_id = txs->id; +		output = g_slist_remove(output, txs); +	}  	txl_free(home_timeline);  	txl_free(mentions); | 
