diff options
Diffstat (limited to 'protocols/twitter/twitter.c')
-rw-r--r-- | protocols/twitter/twitter.c | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index ca279b8f..a2f2325c 100644 --- a/protocols/twitter/twitter.c +++ b/protocols/twitter/twitter.c @@ -185,6 +185,8 @@ static void twitter_init( account_t *acc ) def_oauth = "false"; } + s = set_add( &acc->set, "auto_reply_timeout", "10800", set_eval_int, acc ); + s = set_add( &acc->set, "base_url", def_url, NULL, acc ); s->flags |= ACC_SET_OFFLINE_ONLY; @@ -426,13 +428,7 @@ static void twitter_handle_command( struct im_connection *ic, char *message ) guint64 id; if( cmd[1] ) - { - char *end = NULL; - - id = g_ascii_strtoull( cmd[1], &end, 10 ); - if( end == NULL ) - id = 0; - } + id = g_ascii_strtoull( cmd[1], NULL, 10 ); else id = td->last_status_id; @@ -443,12 +439,44 @@ static void twitter_handle_command( struct im_connection *ic, char *message ) g_free( cmds ); return; } + else if( g_strcasecmp( cmd[0], "follow" ) == 0 && cmd[1] ) + { + twitter_add_buddy( ic, cmd[1], NULL ); + g_free( cmds ); + return; + } + else if( g_strcasecmp( cmd[0], "unfollow" ) == 0 && cmd[1] ) + { + twitter_remove_buddy( ic, cmd[1], NULL ); + g_free( cmds ); + return; + } + else if( g_strcasecmp( cmd[0], "rt" ) == 0 && cmd[1] ) + { + struct twitter_user_data *tud; + bee_user_t *bu; + guint64 id; + + if( ( bu = bee_user_by_handle( ic->bee, ic, cmd[1] ) ) && + ( tud = bu->data ) && tud->last_id ) + id = tud->last_id; + else + id = g_ascii_strtoull( cmd[1], NULL, 10 ); + + td->last_status_id = 0; + if( id ) + twitter_status_retweet( ic, id ); + + g_free( cmds ); + return; + } else if( g_strcasecmp( cmd[0], "post" ) == 0 ) { message += 5; } { + guint64 in_reply_to = 0; char *s, *new = NULL; bee_user_t *bu; @@ -465,13 +493,22 @@ static void twitter_handle_command( struct im_connection *ic, char *message ) if( ( bu = bee_user_by_handle( ic->bee, ic, cmd[0] ) ) ) { + struct twitter_user_data *tud = bu->data; + new = g_strdup_printf( "@%s %s", bu->handle, message + ( s - cmd[0] ) + 2 ); message = new; + + if( time( NULL ) < tud->last_time + + set_getint( &ic->acc->set, "auto_reply_timeout" ) ) + in_reply_to = tud->last_id; } } - twitter_post_status( ic, message ); + /* If the user runs undo between this request and its response + this would delete the second-last Tweet. Prevent that. */ + td->last_status_id = 0; + twitter_post_status( ic, message, in_reply_to ); g_free( new ); } g_free( cmds ); |