diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-11-20 00:20:10 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-11-20 00:20:10 +0000 | 
| commit | 5aa96fc81a66224d9218e54d70944b1ef3d26e2d (patch) | |
| tree | a2871702fc0bb84fb8399ad7948656b7d2d1cfa0 /protocols/twitter/twitter_lib.c | |
| parent | b0064647d06d4169f2b49f4f527ce05af43aacff (diff) | |
Some code for handling disconnect/event messages.
Diffstat (limited to 'protocols/twitter/twitter_lib.c')
| -rw-r--r-- | protocols/twitter/twitter_lib.c | 41 | 
1 files changed, 41 insertions, 0 deletions
| diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 57c84f24..ff1d9f22 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -824,8 +824,11 @@ static void twitter_http_stream(struct http_request *req)  		twitter_http_stream(req);  } +static gboolean twitter_stream_handle_event(struct im_connection *ic, json_value *o); +  static gboolean twitter_stream_handle_object(struct im_connection *ic, json_value *o)  { +	struct twitter_data *td = ic->proto_data;  	struct twitter_xml_status *txs = g_new0(struct twitter_xml_status, 1);  	json_value *c; @@ -842,11 +845,49 @@ static gboolean twitter_stream_handle_object(struct im_connection *ic, json_valu  		txs_free(txs);  		g_slist_free(output);  		return TRUE; +	} else if ((c = json_o_get(o, "event")) && c->type == json_string) { +		twitter_stream_handle_event(ic, o); +		return TRUE; +	} else if ((c = json_o_get(o, "disconnect")) && c->type == json_object) { +		/* HACK: Because we're inside an event handler, we can't just +		   disconnect here. Instead, just change the HTTP status string +		   into a Twitter status string. */ +		char *reason = json_o_strdup(c, "reason"); +		if (reason) { +			g_free(td->stream->status_string); +			td->stream->status_string = reason; +		} +		return TRUE;  	}  	txs_free(txs);  	return FALSE;  } +static gboolean twitter_stream_handle_event(struct im_connection *ic, json_value *o) +{ +	struct twitter_data *td = ic->proto_data; +	json_value *source = json_o_get(o, "source"); +	json_value *target = json_o_get(o, "target"); +	const char *type = json_o_str(o, "event"); +	 +	if (!type || !source || source->type != json_object +	          || !target || target->type != json_object) { +		return FALSE; +	} +	 +	if (strcmp(type, "follow") == 0) { +		struct twitter_xml_user *us = twitter_xt_get_user(source); +		struct twitter_xml_user *ut = twitter_xt_get_user(target); +		if (strcmp(us->screen_name, td->user) == 0) { +			twitter_add_buddy(ic, ut->screen_name, ut->name); +		} +		txu_free(us); +		txu_free(ut); +	} +	 +	return TRUE; +} +  gboolean twitter_open_stream(struct im_connection *ic)  {  	struct twitter_data *td = ic->proto_data; | 
