From 1b221e0abd6453e3ca9cf45916ff6d16f94eff2b Mon Sep 17 00:00:00 2001 From: Geert Mulders Date: Tue, 1 Dec 2009 22:08:02 +0100 Subject: Added twitter-module. --- protocols/twitter/twitter_lib.c | 374 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 374 insertions(+) create mode 100644 protocols/twitter/twitter_lib.c (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c new file mode 100644 index 00000000..7ecbfe15 --- /dev/null +++ b/protocols/twitter/twitter_lib.c @@ -0,0 +1,374 @@ +/***************************************************************************\ +* * +* BitlBee - An IRC to IM gateway * +* Simple module to facilitate twitter functionality. * +* * +* Copyright 2009 Geert Mulders * +* * +* This library is free software; you can redistribute it and/or * +* modify it under the terms of the GNU Lesser General Public * +* License as published by the Free Software Foundation, version * +* 2.1. * +* * +* This library is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +* Lesser General Public License for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this library; if not, write to the Free Software Foundation, * +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * +* * +****************************************************************************/ + +#include "twitter_http.h" +#include "twitter.h" +#include "bitlbee.h" +#include "url.h" +#include "misc.h" +#include "base64.h" +#include "xmltree.h" +#include "twitter_lib.h" +#include +#include + +#define TXL_STATUS 1 +#define TXL_ID 1 + +struct twitter_xml_list { + int next_cursor; + GSList *list; + gpointer data; +}; + +struct twitter_xml_user { + char *name; + char *screen_name; +}; + +struct twitter_xml_status { + char *created_at; + char *text; + struct twitter_xml_user *user; + guint64 id; +}; + +void txl_free(struct twitter_xml_list *txl, int type); +void txs_free(struct twitter_xml_status *txs); +void txu_free(struct twitter_xml_user *txu); + +static void twitter_http_get_friends_ids(struct http_request *req); + +/** + * Get the friends ids. + */ +void twitter_get_friends_ids(struct im_connection *ic, int next_cursor) +{ + struct twitter_data *td = ic->proto_data; + + // Primitive, but hey! It works... + char* args[2]; + args[0] = "cursor"; + args[1] = g_strdup_printf ("%d", next_cursor); + twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, args, 2); + + g_free(args[1]); +} + +/** + * Function to help fill a list. + */ +static xt_status twitter_xt_next_cursor( struct xt_node *node, struct twitter_xml_list *txl ) +{ + // Do something with the cursor. + txl->next_cursor = atoi(node->text); + + return XT_HANDLED; +} + +/** + * Fill a list of ids. + */ +static xt_status twitter_xt_get_friends_id_list( struct xt_node *node, struct twitter_xml_list *txl ) +{ + struct xt_node *child; + + // The root node should hold the list of statuses + // Walk over the nodes children. + for( child = node->children ; child ; child = child->next ) + { + if ( g_strcasecmp( "id", child->name ) == 0) + { + // Add the item to the list. + txl->list = g_slist_append (txl->list, g_memdup( node->text, node->text_len + 1 )); + } + else if ( g_strcasecmp( "next_cursor", child->name ) == 0) + { + twitter_xt_next_cursor(child, txl); + } + } + + return XT_HANDLED; +} + +/** + * Callback for getting the friends ids. + */ +static void twitter_http_get_friends_ids(struct http_request *req) +{ + struct im_connection *ic; + struct xt_parser *parser; + struct twitter_xml_list *txl; + + ic = req->data; + + // Check if the HTTP request went well. + if (req->status_code != 200) { + // It didn't go well, output the error and return. + imcb_error(ic, "Could not retrieve friends. HTTP STATUS: %d", req->status_code); + return; + } + + txl = g_new0(struct twitter_xml_list, 1); + txl->list = NULL; + + // Parse the data. + parser = xt_new( NULL, txl ); + xt_feed( parser, req->reply_body, req->body_size ); + twitter_xt_get_friends_id_list(parser->root, txl); + xt_free( parser ); + + if (txl->next_cursor) + twitter_get_friends_ids(ic, txl->next_cursor); + + txl_free(txl, TXL_ID); + g_free(txl); +} + +/** + * Function to fill a twitter_xml_user struct. + * It sets: + * - the name and + * - the screen_name. + */ +static xt_status twitter_xt_get_user( struct xt_node *node, struct twitter_xml_user *txu ) +{ + struct xt_node *child; + + // Walk over the nodes children. + for( child = node->children ; child ; child = child->next ) + { + if ( g_strcasecmp( "name", child->name ) == 0) + { + txu->name = g_memdup( child->text, child->text_len + 1 ); + } + else if (g_strcasecmp( "screen_name", child->name ) == 0) + { + txu->screen_name = g_memdup( child->text, child->text_len + 1 ); + } + } + return XT_HANDLED; +} + +/** + * Function to fill a twitter_xml_status struct. + * It sets: + * - the status text and + * - the created_at timestamp and + * - the status id and + * - the user in a twitter_xml_user struct. + */ +static xt_status twitter_xt_get_status( struct xt_node *node, struct twitter_xml_status *txs ) +{ + struct xt_node *child; + + // Walk over the nodes children. + for( child = node->children ; child ; child = child->next ) + { + if ( g_strcasecmp( "text", child->name ) == 0) + { + txs->text = g_memdup( child->text, child->text_len + 1 ); + } + else if (g_strcasecmp( "created_at", child->name ) == 0) + { + txs->created_at = g_memdup( child->text, child->text_len + 1 ); + } + else if (g_strcasecmp( "user", child->name ) == 0) + { + txs->user = g_new0(struct twitter_xml_user, 1); + twitter_xt_get_user( child, txs->user ); + } + else if (g_strcasecmp( "id", child->name ) == 0) + { + txs->id = g_ascii_strtoull (child->text, NULL, 10); + } + } + return XT_HANDLED; +} + +/** + * Function to fill a twitter_xml_list struct. + * It sets: + * - all es within the element and + * - the next_cursor. + */ +static xt_status twitter_xt_get_status_list( struct xt_node *node, struct twitter_xml_list *txl ) +{ + struct twitter_xml_status *txs; + struct xt_node *child; + + // The root node should hold the list of statuses + // Walk over the nodes children. + for( child = node->children ; child ; child = child->next ) + { + if ( g_strcasecmp( "status", child->name ) == 0) + { + txs = g_new0(struct twitter_xml_status, 1); + twitter_xt_get_status(child, txs); + // Put the item in the front of the list. + txl->list = g_slist_prepend (txl->list, txs); + } + else if ( g_strcasecmp( "next_cursor", child->name ) == 0) + { + twitter_xt_next_cursor(child, txl); + } + } + + return XT_HANDLED; +} + +static void twitter_http_get_home_timeline(struct http_request *req); + +/** + * Get the timeline. + */ +void twitter_get_home_timeline(struct im_connection *ic, int next_cursor) +{ + struct twitter_data *td = ic->proto_data; + + char* args[4]; + args[0] = "cursor"; + args[1] = g_strdup_printf ("%d", next_cursor); + if (td->home_timeline_id) { + args[2] = "since_id"; + args[3] = g_strdup_printf ("%llu", td->home_timeline_id); + } + + twitter_http(TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, td->user, td->pass, args, td->home_timeline_id ? 4 : 2); + + g_free(args[1]); + if (td->home_timeline_id) { + g_free(args[3]); + } +} + +/** + * Callback for getting the home timeline. + */ +static void twitter_http_get_home_timeline(struct http_request *req) +{ + struct im_connection *ic = req->data;; + struct xt_parser *parser; + struct twitter_xml_list *txl; + struct twitter_data *td = ic->proto_data; + + // Check if the HTTP request went well. + if (req->status_code != 200) { + // It didn't go well, output the error and return. + imcb_error(ic, "Could not retrieve home/timeline. HTTP STATUS: %d", req->status_code); + return; + } + + txl = g_new0(struct twitter_xml_list, 1); + txl->list = NULL; + + // Parse the data. + parser = xt_new( NULL, txl ); + xt_feed( parser, req->reply_body, req->body_size ); + // The root node should hold the list of statuses + twitter_xt_get_status_list(parser->root, txl); + xt_free( parser ); + + GSList *l; + struct twitter_xml_status *status; + + imcb_add_buddy( ic, "home_timeline", NULL ); + imcb_buddy_status( ic, "home_timeline", OPT_LOGGED_IN, NULL, NULL ); + + for ( l = txl->list; l ; l = g_slist_next(l) ) + { + status = l->data; + imcb_buddy_msg( ic, "home_timeline", status->text, 0, 0 ); + td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; + } + + // Free the structure. + txl_free(txl, TXL_STATUS); + g_free(txl); +} + +/** + * Free a twitter_xml_list struct. + * type is the type of list the struct holds. + */ +void txl_free(struct twitter_xml_list *txl, int type) +{ + GSList *l; + for ( l = txl->list; l ; l = g_slist_next(l) ) + if (type == TXL_STATUS) + txs_free((struct twitter_xml_status *)l->data); + else if (type == TXL_ID) + g_free(l->data); + g_slist_free(txl->list); +} + +/** + * Frees a twitter_xml_status struct. + */ +void txs_free(struct twitter_xml_status *txs) +{ + g_free(txs->created_at); + g_free(txs->text); + txu_free(txs->user); +} + +/** + * Frees a twitter_xml_user struct. + */ +void txu_free(struct twitter_xml_user *txu) +{ + g_free(txu->name); + g_free(txu->screen_name); +} + +/** + * Callback after sending a new update to twitter. + */ +static void twitter_http_post_status(struct http_request *req) +{ + struct im_connection *ic = req->data; + + // Check if the HTTP request went well. + if (req->status_code != 200) { + // It didn't go well, output the error and return. + imcb_error(ic, "Could not post tweed... HTTP STATUS: %d", req->status_code); + imcb_error(ic, req->reply_body); + return; + } +} + +/** + * Function to POST a new status to twitter. + */ +void twitter_post_status(struct im_connection *ic, char* msg) +{ + struct twitter_data *td = ic->proto_data; + + char* args[2]; + args[0] = "status"; + args[1] = msg; + twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 2); + g_free(args[1]); +} + + -- cgit v1.2.3 From b4dd25398db477b06452be195de14ca352008665 Mon Sep 17 00:00:00 2001 From: Geert Mulders Date: Wed, 2 Dec 2009 19:08:40 +0100 Subject: home/timeline is now displayed in a groupchat instead of private window. --- protocols/twitter/twitter_lib.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 7ecbfe15..d548b5f2 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -271,6 +271,7 @@ static void twitter_http_get_home_timeline(struct http_request *req) struct xt_parser *parser; struct twitter_xml_list *txl; struct twitter_data *td = ic->proto_data; + struct groupchat *gc; // Check if the HTTP request went well. if (req->status_code != 200) { @@ -292,13 +293,43 @@ static void twitter_http_get_home_timeline(struct http_request *req) GSList *l; struct twitter_xml_status *status; - imcb_add_buddy( ic, "home_timeline", NULL ); - imcb_buddy_status( ic, "home_timeline", OPT_LOGGED_IN, NULL, NULL ); + // Create a new groupchat if it does not exsist. + if (!td->home_timeline_gc) + { + td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" ); + // Add the current user to the chat... + imcb_chat_add_buddy( gc, ic->acc->user ); + } + else + { + gc = td->home_timeline_gc; + } for ( l = txl->list; l ; l = g_slist_next(l) ) { status = l->data; - imcb_buddy_msg( ic, "home_timeline", status->text, 0, 0 ); + // TODO Put the next part in a new function.... + + // Ugly hack, to show current user in chat... + if ( g_strcasecmp(status->user->screen_name, ic->acc->user) == 0) + { + char *tmp = g_strdup_printf ("_%s_", status->user->screen_name); + g_free(status->user->screen_name); + status->user->screen_name = tmp; + } + + // Check if the buddy is allready in the buddy list. + if (!user_findhandle( ic, status->user->screen_name )) + { + // The buddy is not in the list, add the buddy... + imcb_add_buddy( ic, status->user->screen_name, NULL ); + imcb_buddy_status( ic, status->user->screen_name, OPT_LOGGED_IN, NULL, NULL ); + } + + // Say it! + imcb_chat_msg (gc, status->user->screen_name, status->text, 0, 0 ); + // Update the home_timeline_id to hold the highest id, so that by the next request + // we won't pick up the updates allready in the list. td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; } -- cgit v1.2.3 From 62d2cfb0b7b5e7f3eda9ca13b1877d3ad74fcd5e Mon Sep 17 00:00:00 2001 From: Geert Mulders Date: Thu, 25 Mar 2010 22:31:27 +0100 Subject: Added option to get tweeds either through groupchat or privmes. --- protocols/twitter/twitter_lib.c | 369 ++++++++++++++++++++++++++++++++-------- 1 file changed, 295 insertions(+), 74 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index d548b5f2..f07897ed 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -33,9 +33,13 @@ #include #define TXL_STATUS 1 -#define TXL_ID 1 +#define TXL_USER 2 +#define TXL_ID 3 + +static void twitter_imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at ); struct twitter_xml_list { + int type; int next_cursor; GSList *list; gpointer data; @@ -53,9 +57,54 @@ struct twitter_xml_status { guint64 id; }; -void txl_free(struct twitter_xml_list *txl, int type); -void txs_free(struct twitter_xml_status *txs); -void txu_free(struct twitter_xml_user *txu); +/** + * Frees a twitter_xml_user struct. + */ +static void txu_free(struct twitter_xml_user *txu) +{ + g_free(txu->name); + g_free(txu->screen_name); +} + + +/** + * Frees a twitter_xml_status struct. + */ +static void txs_free(struct twitter_xml_status *txs) +{ + g_free(txs->created_at); + g_free(txs->text); + txu_free(txs->user); +} + +/** + * Free a twitter_xml_list struct. + * type is the type of list the struct holds. + */ +static void txl_free(struct twitter_xml_list *txl) +{ + GSList *l; + for ( l = txl->list; l ; l = g_slist_next(l) ) + if (txl->type == TXL_STATUS) + txs_free((struct twitter_xml_status *)l->data); + else if (txl->type == TXL_ID) + g_free(l->data); + g_slist_free(txl->list); +} + +/** + * Add a buddy if it is not allready added, set the status to logged in. + */ +static void twitter_add_buddy(struct im_connection *ic, char *name) +{ + // Check if the buddy is allready in the buddy list. + if (!user_findhandle( ic, name )) + { + // The buddy is not in the list, add the buddy and set the status to logged in. + imcb_add_buddy( ic, name, NULL ); + imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL ); + } +} static void twitter_http_get_friends_ids(struct http_request *req); @@ -92,6 +141,9 @@ static xt_status twitter_xt_next_cursor( struct xt_node *node, struct twitter_xm static xt_status twitter_xt_get_friends_id_list( struct xt_node *node, struct twitter_xml_list *txl ) { struct xt_node *child; + + // Set the list type. + txl->type = TXL_ID; // The root node should hold the list of statuses // Walk over the nodes children. @@ -122,6 +174,10 @@ static void twitter_http_get_friends_ids(struct http_request *req) ic = req->data; + // Check if the connection is still active. + if( !g_slist_find( twitter_connections, ic ) ) + return; + // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. @@ -141,7 +197,7 @@ static void twitter_http_get_friends_ids(struct http_request *req) if (txl->next_cursor) twitter_get_friends_ids(ic, txl->next_cursor); - txl_free(txl, TXL_ID); + txl_free(txl); g_free(txl); } @@ -170,6 +226,66 @@ static xt_status twitter_xt_get_user( struct xt_node *node, struct twitter_xml_u return XT_HANDLED; } +/** + * Function to fill a twitter_xml_list struct. + * It sets: + * - all s from the element. + */ +static xt_status twitter_xt_get_users( struct xt_node *node, struct twitter_xml_list *txl ) +{ + struct twitter_xml_user *txu; + struct xt_node *child; + + // Set the type of the list. + txl->type = TXL_USER; + + // The root node should hold the list of users + // Walk over the nodes children. + for( child = node->children ; child ; child = child->next ) + { + if ( g_strcasecmp( "user", child->name ) == 0) + { + txu = g_new0(struct twitter_xml_user, 1); + twitter_xt_get_user(child, txu); + // Put the item in the front of the list. + txl->list = g_slist_prepend (txl->list, txu); + } + } + + return XT_HANDLED; +} + +/** + * Function to fill a twitter_xml_list struct. + * It calls twitter_xt_get_users to get the s from a element. + * It sets: + * - the next_cursor. + */ +static xt_status twitter_xt_get_user_list( struct xt_node *node, struct twitter_xml_list *txl ) +{ + struct xt_node *child; + + // Set the type of the list. + txl->type = TXL_USER; + + // The root node should hold a users element + // Walk over the nodes children. + for( child = node->children ; child ; child = child->next ) + { + if ( g_strcasecmp( "users", child->name ) == 0) + { + twitter_xt_get_users(child, txl); + } + else if ( g_strcasecmp( "next_cursor", child->name ) == 0) + { + twitter_xt_next_cursor(child, txl); + } + } + + return XT_HANDLED; +} + + /** * Function to fill a twitter_xml_status struct. * It sets: @@ -217,6 +333,9 @@ static xt_status twitter_xt_get_status_list( struct xt_node *node, struct twitte struct twitter_xml_status *txs; struct xt_node *child; + // Set the type of the list. + txl->type = TXL_STATUS; + // The root node should hold the list of statuses // Walk over the nodes children. for( child = node->children ; child ; child = child->next ) @@ -262,16 +381,71 @@ void twitter_get_home_timeline(struct im_connection *ic, int next_cursor) } } +/** + * Function that is called to see the statuses in a groupchat window. + */ +static void twitter_groupchat(struct im_connection *ic, GSList *list) +{ + struct twitter_data *td = ic->proto_data; + GSList *l = NULL; + struct twitter_xml_status *status; + struct groupchat *gc; + + // Create a new groupchat if it does not exsist. + if (!td->home_timeline_gc) + { + td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" ); + // Add the current user to the chat... + imcb_chat_add_buddy( gc, ic->acc->user ); + } + else + { + gc = td->home_timeline_gc; + } + + for ( l = list; l ; l = g_slist_next(l) ) + { + status = l->data; + twitter_add_buddy(ic, status->user->screen_name); + // Say it! + twitter_imcb_chat_msg (gc, status->user->screen_name, status->text, 0, 0 ); + // Update the home_timeline_id to hold the highest id, so that by the next request + // we won't pick up the updates allready in the list. + td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; + } +} + +/** + * Function that is called to see statuses as private messages. + */ +static void twitter_private_message_chat(struct im_connection *ic, GSList *list) +{ + struct twitter_data *td = ic->proto_data; + GSList *l = NULL; + struct twitter_xml_status *status; + + for ( l = list; l ; l = g_slist_next(l) ) + { + status = l->data; + imcb_buddy_msg( ic, status->user->screen_name, status->text, 0, 0 ); + // Update the home_timeline_id to hold the highest id, so that by the next request + // we won't pick up the updates allready in the list. + td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; + } +} + /** * Callback for getting the home timeline. */ static void twitter_http_get_home_timeline(struct http_request *req) { - struct im_connection *ic = req->data;; + struct im_connection *ic = req->data; struct xt_parser *parser; struct twitter_xml_list *txl; - struct twitter_data *td = ic->proto_data; - struct groupchat *gc; + + // Check if the connection is still active. + if( !g_slist_find( twitter_connections, ic ) ) + return; // Check if the HTTP request went well. if (req->status_code != 200) { @@ -282,94 +456,92 @@ static void twitter_http_get_home_timeline(struct http_request *req) txl = g_new0(struct twitter_xml_list, 1); txl->list = NULL; - + // Parse the data. parser = xt_new( NULL, txl ); xt_feed( parser, req->reply_body, req->body_size ); // The root node should hold the list of statuses twitter_xt_get_status_list(parser->root, txl); xt_free( parser ); - - GSList *l; - struct twitter_xml_status *status; - // Create a new groupchat if it does not exsist. - if (!td->home_timeline_gc) - { - td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" ); - // Add the current user to the chat... - imcb_chat_add_buddy( gc, ic->acc->user ); - } + // See if the user wants to see the messages in a groupchat window or as private messages. + if (set_getbool( &ic->acc->set, "use_groupchat" )) + twitter_groupchat(ic, txl->list); else - { - gc = td->home_timeline_gc; - } - - for ( l = txl->list; l ; l = g_slist_next(l) ) - { - status = l->data; - // TODO Put the next part in a new function.... - - // Ugly hack, to show current user in chat... - if ( g_strcasecmp(status->user->screen_name, ic->acc->user) == 0) - { - char *tmp = g_strdup_printf ("_%s_", status->user->screen_name); - g_free(status->user->screen_name); - status->user->screen_name = tmp; - } - - // Check if the buddy is allready in the buddy list. - if (!user_findhandle( ic, status->user->screen_name )) - { - // The buddy is not in the list, add the buddy... - imcb_add_buddy( ic, status->user->screen_name, NULL ); - imcb_buddy_status( ic, status->user->screen_name, OPT_LOGGED_IN, NULL, NULL ); - } - - // Say it! - imcb_chat_msg (gc, status->user->screen_name, status->text, 0, 0 ); - // Update the home_timeline_id to hold the highest id, so that by the next request - // we won't pick up the updates allready in the list. - td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; - } + twitter_private_message_chat(ic, txl->list); // Free the structure. - txl_free(txl, TXL_STATUS); + txl_free(txl); g_free(txl); } /** - * Free a twitter_xml_list struct. - * type is the type of list the struct holds. + * Callback for getting (twitter)friends... + * + * Be afraid, be very afraid! This function will potentially add hundreds of "friends". "Who has + * hundreds of friends?" you wonder? You probably not, since you are reading the source of + * BitlBee... Get a life and meet new people! */ -void txl_free(struct twitter_xml_list *txl, int type) +static void twitter_http_get_statuses_friends(struct http_request *req) { - GSList *l; + struct im_connection *ic = req->data; + struct xt_parser *parser; + struct twitter_xml_list *txl; + + // Check if the connection is still active. + if( !g_slist_find( twitter_connections, ic ) ) + return; + + // Check if the HTTP request went well. + if (req->status_code != 200) { + // It didn't go well, output the error and return. + imcb_error(ic, "Could not retrieve home/timeline. HTTP STATUS: %d", req->status_code); + return; + } + + txl = g_new0(struct twitter_xml_list, 1); + txl->list = NULL; + + // Parse the data. + parser = xt_new( NULL, txl ); + xt_feed( parser, req->reply_body, req->body_size ); + + // Get the user list from the parsed xml feed. + twitter_xt_get_user_list(parser->root, txl); + xt_free( parser ); + + GSList *l = NULL; + struct twitter_xml_user *user; + // Add the users as buddies. for ( l = txl->list; l ; l = g_slist_next(l) ) - if (type == TXL_STATUS) - txs_free((struct twitter_xml_status *)l->data); - else if (type == TXL_ID) - g_free(l->data); - g_slist_free(txl->list); -} + { + user = l->data; + twitter_add_buddy(ic, user->screen_name); + } -/** - * Frees a twitter_xml_status struct. - */ -void txs_free(struct twitter_xml_status *txs) -{ - g_free(txs->created_at); - g_free(txs->text); - txu_free(txs->user); + // if the next_cursor is set to something bigger then 0 there are more friends to gather. + if (txl->next_cursor > 0) + twitter_get_statuses_friends(ic, txl->next_cursor); + + // Free the structure. + txl_free(txl); + g_free(txl); } /** - * Frees a twitter_xml_user struct. + * Get the friends. */ -void txu_free(struct twitter_xml_user *txu) +void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor) { - g_free(txu->name); - g_free(txu->screen_name); + struct twitter_data *td = ic->proto_data; + + char* args[2]; + args[0] = "cursor"; + args[1] = g_strdup_printf ("%d", next_cursor); + + twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, args, 2); + + g_free(args[1]); } /** @@ -379,6 +551,10 @@ static void twitter_http_post_status(struct http_request *req) { struct im_connection *ic = req->data; + // Check if the connection is still active. + if( !g_slist_find( twitter_connections, ic ) ) + return; + // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. @@ -399,7 +575,52 @@ void twitter_post_status(struct im_connection *ic, char* msg) args[0] = "status"; args[1] = msg; twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 2); - g_free(args[1]); +// g_free(args[1]); } +/** + * Function to POST a new message to twitter. + */ +void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg) +{ + struct twitter_data *td = ic->proto_data; + + char* args[4]; + args[0] = "screen_name"; + args[1] = who; + args[2] = "text"; + args[3] = msg; + // Use the same callback as for twitter_post_status, since it does basically the same. + twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 4); +// g_free(args[1]); +// g_free(args[3]); +} + + +/** + * This function "overwrites" the imcb_chat_msg function. Because in the original the logged in user is filtered out. + */ +static void twitter_imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at ) +{ + struct im_connection *ic = c->ic; + char *wrapped; + user_t *u; + + u = user_findhandle( ic, who ); + if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) + || ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) + strip_html( msg ); + + wrapped = word_wrap( msg, 425 ); + if( c && u ) + { + irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, "", wrapped ); + } + else + { + imcb_log( ic, "Message from/to conversation %s@%p (unknown conv/user): %s", who, c, wrapped ); + } + g_free( wrapped ); +} + -- cgit v1.2.3 From 2abceca711403e8e3308213954b4477ceecd4282 Mon Sep 17 00:00:00 2001 From: Geert Mulders Date: Tue, 6 Apr 2010 19:25:51 +0200 Subject: Updates made as a result to the comments on the review. --- protocols/twitter/twitter_lib.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index f07897ed..d4e07c42 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -64,6 +64,7 @@ static void txu_free(struct twitter_xml_user *txu) { g_free(txu->name); g_free(txu->screen_name); + g_free(txu); } @@ -75,6 +76,7 @@ static void txs_free(struct twitter_xml_status *txs) g_free(txs->created_at); g_free(txs->text); txu_free(txs->user); + g_free(txs); } /** @@ -130,7 +132,7 @@ void twitter_get_friends_ids(struct im_connection *ic, int next_cursor) static xt_status twitter_xt_next_cursor( struct xt_node *node, struct twitter_xml_list *txl ) { // Do something with the cursor. - txl->next_cursor = atoi(node->text); + txl->next_cursor = node->text != NULL ? atoi(node->text) : -1; return XT_HANDLED; } @@ -152,7 +154,7 @@ static xt_status twitter_xt_get_friends_id_list( struct xt_node *node, struct tw if ( g_strcasecmp( "id", child->name ) == 0) { // Add the item to the list. - txl->list = g_slist_append (txl->list, g_memdup( node->text, node->text_len + 1 )); + txl->list = g_slist_append (txl->list, g_memdup( child->text, child->text_len + 1 )); } else if ( g_strcasecmp( "next_cursor", child->name ) == 0) { @@ -186,7 +188,6 @@ static void twitter_http_get_friends_ids(struct http_request *req) } txl = g_new0(struct twitter_xml_list, 1); - txl->list = NULL; // Parse the data. parser = xt_new( NULL, txl ); @@ -450,7 +451,7 @@ static void twitter_http_get_home_timeline(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not retrieve home/timeline. HTTP STATUS: %d", req->status_code); + imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ". HTTP STATUS: %d", req->status_code); return; } @@ -487,6 +488,8 @@ static void twitter_http_get_statuses_friends(struct http_request *req) struct im_connection *ic = req->data; struct xt_parser *parser; struct twitter_xml_list *txl; + GSList *l = NULL; + struct twitter_xml_user *user; // Check if the connection is still active. if( !g_slist_find( twitter_connections, ic ) ) @@ -495,7 +498,7 @@ static void twitter_http_get_statuses_friends(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not retrieve home/timeline. HTTP STATUS: %d", req->status_code); + imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL " HTTP STATUS: %d", req->status_code); return; } @@ -510,8 +513,6 @@ static void twitter_http_get_statuses_friends(struct http_request *req) twitter_xt_get_user_list(parser->root, txl); xt_free( parser ); - GSList *l = NULL; - struct twitter_xml_user *user; // Add the users as buddies. for ( l = txl->list; l ; l = g_slist_next(l) ) { @@ -558,8 +559,7 @@ static void twitter_http_post_status(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not post tweed... HTTP STATUS: %d", req->status_code); - imcb_error(ic, req->reply_body); + imcb_error(ic, "Could not post tweet... HTTP STATUS: %d", req->status_code); return; } } -- cgit v1.2.3 From 0519b0a42b5e0ed09f796a92aa7bd3b7d3f06b9d Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 7 Apr 2010 00:54:00 +0100 Subject: Killed unused twitter_urldecode() and silence some compiler warnings. --- protocols/twitter/twitter_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index d4e07c42..53cbe643 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -371,7 +371,7 @@ void twitter_get_home_timeline(struct im_connection *ic, int next_cursor) args[1] = g_strdup_printf ("%d", next_cursor); if (td->home_timeline_id) { args[2] = "since_id"; - args[3] = g_strdup_printf ("%llu", td->home_timeline_id); + args[3] = g_strdup_printf ("%llu", (long long unsigned int) td->home_timeline_id); } twitter_http(TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, td->user, td->pass, args, td->home_timeline_id ? 4 : 2); -- cgit v1.2.3 From d5690197326bad1090dbb9f6bfc95470b479fe6b Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 7 Apr 2010 01:27:51 +0100 Subject: A little more cleanup. --- protocols/twitter/twitter_lib.c | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 53cbe643..50f614a7 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -36,8 +36,6 @@ #define TXL_USER 2 #define TXL_ID 3 -static void twitter_imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at ); - struct twitter_xml_list { int type; int next_cursor; @@ -100,7 +98,7 @@ static void txl_free(struct twitter_xml_list *txl) static void twitter_add_buddy(struct im_connection *ic, char *name) { // Check if the buddy is allready in the buddy list. - if (!user_findhandle( ic, name )) + if (!imcb_find_buddy( ic, name )) { // The buddy is not in the list, add the buddy and set the status to logged in. imcb_add_buddy( ic, name, NULL ); @@ -408,8 +406,13 @@ static void twitter_groupchat(struct im_connection *ic, GSList *list) { status = l->data; twitter_add_buddy(ic, status->user->screen_name); + // Say it! - twitter_imcb_chat_msg (gc, status->user->screen_name, status->text, 0, 0 ); + if (g_strcasecmp(td->user, status->user->screen_name) == 0) + imcb_chat_log (gc, "Your Tweet: %s", status->text); + else + imcb_chat_msg (gc, status->user->screen_name, status->text, 0, 0 ); + // Update the home_timeline_id to hold the highest id, so that by the next request // we won't pick up the updates allready in the list. td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; @@ -596,31 +599,3 @@ void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg) // g_free(args[1]); // g_free(args[3]); } - - -/** - * This function "overwrites" the imcb_chat_msg function. Because in the original the logged in user is filtered out. - */ -static void twitter_imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at ) -{ - struct im_connection *ic = c->ic; - char *wrapped; - user_t *u; - - u = user_findhandle( ic, who ); - if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) - || ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) - strip_html( msg ); - - wrapped = word_wrap( msg, 425 ); - if( c && u ) - { - irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, "", wrapped ); - } - else - { - imcb_log( ic, "Message from/to conversation %s@%p (unknown conv/user): %s", who, c, wrapped ); - } - g_free( wrapped ); -} - -- cgit v1.2.3 From 1014caba0ae2c737e35b8f51cafe77c1967e6b67 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 7 Apr 2010 01:46:38 +0100 Subject: In groupchat mode, make contacts show up in the room instead of in &bitlbee. And clean up the room when disabling the Twitter account. --- protocols/twitter/twitter_lib.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 50f614a7..3bcb59ca 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -97,12 +97,17 @@ static void txl_free(struct twitter_xml_list *txl) */ static void twitter_add_buddy(struct im_connection *ic, char *name) { + struct twitter_data *td = ic->proto_data; + // Check if the buddy is allready in the buddy list. if (!imcb_find_buddy( ic, name )) { // The buddy is not in the list, add the buddy and set the status to logged in. imcb_add_buddy( ic, name, NULL ); - imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL ); + if (set_getbool( &ic->acc->set, "use_groupchat" )) + imcb_chat_add_buddy( td->home_timeline_gc, name ); + else + imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL ); } } -- cgit v1.2.3 From 08579a1e871216a7bd7e50315894b6aeed6354ea Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Thu, 8 Apr 2010 01:42:11 +0100 Subject: Parse timestamps in tweets. --- protocols/twitter/twitter_lib.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 3bcb59ca..9ca4ead6 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -21,6 +21,9 @@ * * ****************************************************************************/ +/* For strptime(): */ +#define _XOPEN_SOURCE + #include "twitter_http.h" #include "twitter.h" #include "bitlbee.h" @@ -49,7 +52,7 @@ struct twitter_xml_user { }; struct twitter_xml_status { - char *created_at; + time_t created_at; char *text; struct twitter_xml_user *user; guint64 id; @@ -71,7 +74,6 @@ static void txu_free(struct twitter_xml_user *txu) */ static void txs_free(struct twitter_xml_status *txs) { - g_free(txs->created_at); g_free(txs->text); txu_free(txs->user); g_free(txs); @@ -311,7 +313,13 @@ static xt_status twitter_xt_get_status( struct xt_node *node, struct twitter_xml } else if (g_strcasecmp( "created_at", child->name ) == 0) { - txs->created_at = g_memdup( child->text, child->text_len + 1 ); + struct tm parsed; + + /* Very sensitive to changes to the formatting of + this field. :-( Also assumes the timezone used + is UTC since C time handling functions suck. */ + if( strptime( child->text, "%a %b %d %H:%M:%S %z %Y", &parsed ) != NULL ) + txs->created_at = mktime_utc( &parsed ); } else if (g_strcasecmp( "user", child->name ) == 0) { @@ -416,7 +424,7 @@ static void twitter_groupchat(struct im_connection *ic, GSList *list) if (g_strcasecmp(td->user, status->user->screen_name) == 0) imcb_chat_log (gc, "Your Tweet: %s", status->text); else - imcb_chat_msg (gc, status->user->screen_name, status->text, 0, 0 ); + imcb_chat_msg (gc, status->user->screen_name, status->text, 0, status->created_at ); // Update the home_timeline_id to hold the highest id, so that by the next request // we won't pick up the updates allready in the list. @@ -436,7 +444,7 @@ static void twitter_private_message_chat(struct im_connection *ic, GSList *list) for ( l = list; l ; l = g_slist_next(l) ) { status = l->data; - imcb_buddy_msg( ic, status->user->screen_name, status->text, 0, 0 ); + imcb_buddy_msg( ic, status->user->screen_name, status->text, 0, status->created_at ); // Update the home_timeline_id to hold the highest id, so that by the next request // we won't pick up the updates allready in the list. td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id; -- cgit v1.2.3 From cca06921729ecd1ab4beaecfef001a218e5d0010 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 9 Apr 2010 01:40:38 +0100 Subject: Added imcb_chat_nick_hint() and use it in the Twitter module to get saner channel names. This also closes bug #577, making the Skype module a bit nicer. --- protocols/twitter/twitter_lib.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 9ca4ead6..93f71f3b 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -406,7 +406,10 @@ static void twitter_groupchat(struct im_connection *ic, GSList *list) // Create a new groupchat if it does not exsist. if (!td->home_timeline_gc) { + char *name_hint = g_strdup_printf( "Twitter_%s", ic->acc->user ); td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" ); + imcb_chat_name_hint( gc, name_hint ); + g_free( name_hint ); // Add the current user to the chat... imcb_chat_add_buddy( gc, ic->acc->user ); } -- cgit v1.2.3 From 3e69802454295ffbfbbbe9bca4fcd226b5b63b28 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 13 Apr 2010 14:51:05 +0200 Subject: Use full name information of Twitter buddies. --- protocols/twitter/twitter_lib.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 93f71f3b..e297f6b2 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -97,7 +97,7 @@ static void txl_free(struct twitter_xml_list *txl) /** * Add a buddy if it is not allready added, set the status to logged in. */ -static void twitter_add_buddy(struct im_connection *ic, char *name) +static void twitter_add_buddy(struct im_connection *ic, char *name, const char *fullname) { struct twitter_data *td = ic->proto_data; @@ -106,6 +106,7 @@ static void twitter_add_buddy(struct im_connection *ic, char *name) { // The buddy is not in the list, add the buddy and set the status to logged in. imcb_add_buddy( ic, name, NULL ); + imcb_rename_buddy( ic, name, fullname ); if (set_getbool( &ic->acc->set, "use_groupchat" )) imcb_chat_add_buddy( td->home_timeline_gc, name ); else @@ -421,7 +422,7 @@ static void twitter_groupchat(struct im_connection *ic, GSList *list) for ( l = list; l ; l = g_slist_next(l) ) { status = l->data; - twitter_add_buddy(ic, status->user->screen_name); + twitter_add_buddy(ic, status->user->screen_name, status->user->name); // Say it! if (g_strcasecmp(td->user, status->user->screen_name) == 0) @@ -536,7 +537,7 @@ static void twitter_http_get_statuses_friends(struct http_request *req) for ( l = txl->list; l ; l = g_slist_next(l) ) { user = l->data; - twitter_add_buddy(ic, user->screen_name); + twitter_add_buddy(ic, user->screen_name, user->name); } // if the next_cursor is set to something bigger then 0 there are more friends to gather. -- cgit v1.2.3 From 3bd4a9327bb2c7c662e6d385b3bf6903ca8ca09a Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 13 Apr 2010 19:36:16 +0200 Subject: Suppress HTTP error messages unless we get five or more in a row. --- protocols/twitter/twitter_lib.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index e297f6b2..36871e93 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -179,8 +179,10 @@ static void twitter_http_get_friends_ids(struct http_request *req) struct im_connection *ic; struct xt_parser *parser; struct twitter_xml_list *txl; + struct twitter_data *td; ic = req->data; + td = ic->proto_data; // Check if the connection is still active. if( !g_slist_find( twitter_connections, ic ) ) @@ -189,8 +191,12 @@ static void twitter_http_get_friends_ids(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not retrieve friends. HTTP STATUS: %d", req->status_code); + if (++td->http_fails >= 5) + imcb_error(ic, "Could not retrieve friends. HTTP STATUS: %d", req->status_code); + return; + } else { + td->http_fails = 0; } txl = g_new0(struct twitter_xml_list, 1); @@ -461,6 +467,7 @@ static void twitter_private_message_chat(struct im_connection *ic, GSList *list) static void twitter_http_get_home_timeline(struct http_request *req) { struct im_connection *ic = req->data; + struct twitter_data *td = ic->proto_data; struct xt_parser *parser; struct twitter_xml_list *txl; @@ -469,9 +476,24 @@ static void twitter_http_get_home_timeline(struct http_request *req) return; // Check if the HTTP request went well. - if (req->status_code != 200) { + if (req->status_code == 200) + { + td->http_fails = 0; + if (!ic->flags & OPT_LOGGED_IN) + imcb_connected(ic); + } + else if (req->status_code == 401) + { + imcb_error( ic, "Authentication failure" ); + imc_logout( ic, FALSE ); + return; + } + else + { // It didn't go well, output the error and return. - imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ". HTTP STATUS: %d", req->status_code); + if (++td->http_fails >= 5) + imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ". HTTP STATUS: %d", req->status_code); + return; } @@ -506,6 +528,7 @@ static void twitter_http_get_home_timeline(struct http_request *req) static void twitter_http_get_statuses_friends(struct http_request *req) { struct im_connection *ic = req->data; + struct twitter_data *td = ic->proto_data; struct xt_parser *parser; struct twitter_xml_list *txl; GSList *l = NULL; @@ -518,8 +541,12 @@ static void twitter_http_get_statuses_friends(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL " HTTP STATUS: %d", req->status_code); + if (++td->http_fails >= 5) + imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL " HTTP STATUS: %d", req->status_code); + return; + } else { + td->http_fails = 0; } txl = g_new0(struct twitter_xml_list, 1); -- cgit v1.2.3 From 37aa3172c7e9ec6ba7b5985ed60c41c621e8e7b9 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Apr 2010 00:09:40 +0200 Subject: Small Valgrind noise fix. (Check if the conn is still alive before getting its private data.) --- protocols/twitter/twitter_lib.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'protocols/twitter/twitter_lib.c') diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 36871e93..081612ac 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -182,11 +182,12 @@ static void twitter_http_get_friends_ids(struct http_request *req) struct twitter_data *td; ic = req->data; - td = ic->proto_data; // Check if the connection is still active. if( !g_slist_find( twitter_connections, ic ) ) return; + + td = ic->proto_data; // Check if the HTTP request went well. if (req->status_code != 200) { @@ -467,13 +468,15 @@ static void twitter_private_message_chat(struct im_connection *ic, GSList *list) static void twitter_http_get_home_timeline(struct http_request *req) { struct im_connection *ic = req->data; - struct twitter_data *td = ic->proto_data; + struct twitter_data *td; struct xt_parser *parser; struct twitter_xml_list *txl; // Check if the connection is still active. if( !g_slist_find( twitter_connections, ic ) ) return; + + td = ic->proto_data; // Check if the HTTP request went well. if (req->status_code == 200) @@ -528,7 +531,7 @@ static void twitter_http_get_home_timeline(struct http_request *req) static void twitter_http_get_statuses_friends(struct http_request *req) { struct im_connection *ic = req->data; - struct twitter_data *td = ic->proto_data; + struct twitter_data *td; struct xt_parser *parser; struct twitter_xml_list *txl; GSList *l = NULL; @@ -537,7 +540,9 @@ static void twitter_http_get_statuses_friends(struct http_request *req) // Check if the connection is still active. if( !g_slist_find( twitter_connections, ic ) ) return; - + + td = ic->proto_data; + // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. -- cgit v1.2.3