aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-06-24 01:43:15 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-06-24 01:43:15 +0100
commitd6aa6dd53c3352305508ffbf62d26f59dd19b777 (patch)
tree4331e9fa6ede5fd19ffa9fc939d0ec96a48feed0
parent90ba4161e5c24306233bc4627d1cde39a54006cf (diff)
Load the whole Twitter contact list at login time if mode=chat/many,
instead of adding contacts as they post tweets. Also in mode=chat, populate the channel *before* adding the user to it, avoiding a flood of joins.
-rw-r--r--protocols/twitter/twitter.c33
-rw-r--r--protocols/twitter/twitter.h8
-rw-r--r--protocols/twitter/twitter_lib.c49
3 files changed, 64 insertions, 26 deletions
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index db893e17..ca57e51e 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -39,11 +39,6 @@ gboolean twitter_main_loop(gpointer data, gint fd, b_input_condition cond)
if (!g_slist_find( twitter_connections, ic ))
return 0;
- // If the user uses multiple private message windows we need to get the
- // users buddies.
- if (g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "many") == 0)
- twitter_get_statuses_friends(ic, -1);
-
// Do stuff..
twitter_get_home_timeline(ic, -1);
@@ -55,7 +50,7 @@ static void twitter_main_loop_start( struct im_connection *ic )
{
struct twitter_data *td = ic->proto_data;
- imcb_log( ic, "Connecting to Twitter" );
+ imcb_log( ic, "Getting initial statuses" );
// Run this once. After this queue the main loop function.
twitter_main_loop(ic, -1, 0);
@@ -65,6 +60,23 @@ static void twitter_main_loop_start( struct im_connection *ic )
td->main_loop_id = b_timeout_add(60000, twitter_main_loop, ic);
}
+static void twitter_oauth_start( struct im_connection *ic );
+
+void twitter_login_finish( struct im_connection *ic )
+{
+ struct twitter_data *td = ic->proto_data;
+
+ if( set_getbool( &ic->acc->set, "oauth" ) && !td->oauth_info )
+ twitter_oauth_start( ic );
+ else if( g_strcasecmp( set_getstr( &ic->acc->set, "mode" ), "one" ) != 0 &&
+ !( td->flags & TWITTER_HAVE_FRIENDS ) )
+ {
+ imcb_log( ic, "Getting contact list" );
+ twitter_get_statuses_friends( ic, -1 );
+ }
+ else
+ twitter_main_loop_start( ic );
+}
static const struct oauth_service twitter_oauth =
{
@@ -127,7 +139,7 @@ static gboolean twitter_oauth_callback( struct oauth_info *info )
g_free( ic->acc->pass );
ic->acc->pass = oauth_to_string( info );
- twitter_main_loop_start( ic );
+ twitter_login_finish( ic );
}
return TRUE;
@@ -210,10 +222,9 @@ static void twitter_login( account_t *acc )
imcb_add_buddy( ic, name, NULL );
imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL );
- if( td->oauth_info || !set_getbool( &acc->set, "oauth" ) )
- twitter_main_loop_start( ic );
- else
- twitter_oauth_start( ic );
+ imcb_log( ic, "Connecting" );
+
+ twitter_login_finish( ic );
}
/**
diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h
index 614919f9..e61d32be 100644
--- a/protocols/twitter/twitter.h
+++ b/protocols/twitter/twitter.h
@@ -32,6 +32,11 @@
#define debug( text... )
#endif
+typedef enum
+{
+ TWITTER_HAVE_FRIENDS = 1,
+} twitter_flags_t;
+
struct twitter_data
{
char* user;
@@ -41,6 +46,7 @@ struct twitter_data
gint main_loop_id;
struct groupchat *home_timeline_gc;
gint http_fails;
+ twitter_flags_t flags;
gboolean url_ssl;
int url_port;
@@ -55,4 +61,6 @@ struct twitter_data
*/
GSList *twitter_connections;
+void twitter_login_finish( struct im_connection *ic );
+
#endif //_TWITTER_H
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index 585bdd43..fb7a6af9 100644
--- a/protocols/twitter/twitter_lib.c
+++ b/protocols/twitter/twitter_lib.c
@@ -58,6 +58,8 @@ struct twitter_xml_status {
guint64 id;
};
+static void twitter_groupchat_init(struct im_connection *ic);
+
/**
* Frees a twitter_xml_user struct.
*/
@@ -432,6 +434,19 @@ void twitter_get_home_timeline(struct im_connection *ic, int next_cursor)
}
}
+static void twitter_groupchat_init(struct im_connection *ic)
+{
+ char *name_hint;
+ struct groupchat *gc;
+ struct twitter_data *td = ic->proto_data;
+
+ td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" );
+
+ name_hint = g_strdup_printf( "Twitter_%s", ic->acc->user );
+ imcb_chat_name_hint( gc, name_hint );
+ g_free( name_hint );
+}
+
/**
* Function that is called to see the statuses in a groupchat window.
*/
@@ -444,18 +459,11 @@ 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...
+ twitter_groupchat_init(ic);
+
+ gc = td->home_timeline_gc;
+ if (!gc->joined)
imcb_chat_add_buddy( gc, ic->acc->user );
- }
- else
- {
- gc = td->home_timeline_gc;
- }
for ( l = list; l ; l = g_slist_next(l) )
{
@@ -603,15 +611,23 @@ static void twitter_http_get_statuses_friends(struct http_request *req)
td = ic->proto_data;
// Check if the HTTP request went well.
- if (req->status_code != 200) {
+ if (req->status_code == 401)
+ {
+ imcb_error( ic, "Authentication failure" );
+ imc_logout( ic, FALSE );
+ return;
+ } else if (req->status_code != 200) {
// It didn't go well, output the error and return.
- if (++td->http_fails >= 5)
- imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL ": %s", twitter_parse_error(req));
-
+ imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL ": %s", twitter_parse_error(req));
+ imc_logout( ic, TRUE );
return;
} else {
td->http_fails = 0;
}
+
+ if( !td->home_timeline_gc &&
+ g_strcasecmp( set_getstr( &ic->acc->set, "mode" ), "chat" ) == 0 )
+ twitter_groupchat_init( ic );
txl = g_new0(struct twitter_xml_list, 1);
txl->list = NULL;
@@ -638,6 +654,9 @@ static void twitter_http_get_statuses_friends(struct http_request *req)
// Free the structure.
txl_free(txl);
g_free(txl);
+
+ td->flags |= TWITTER_HAVE_FRIENDS;
+ twitter_login_finish(ic);
}
/**