diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-08-08 14:42:57 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-08-08 14:42:57 +0100 |
commit | b8906261293b34d8c792bd1f48df10144a8a8f10 (patch) | |
tree | 22cb15d6c5081b1d310721f625c1a82282039d0b /protocols/twitter/twitter.c | |
parent | 203a2d2e8857e4c83f8f5e1a89de03ea08538cb2 (diff) |
Add a few more commands (including RT) and the ability to send replies.
That's it for now, this is already not very pretty, but just offers the bare
basic functionality.
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 ); |