X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/f66ed0bdb6f8c7cb2347df19dc4843a4253540f9..4ebf8fe74926a8eb79b68fbf5acf82ce7e900255:/bti.c diff --git a/bti.c b/bti.c index abf436c..8243ad7 100644 --- a/bti.c +++ b/bti.c @@ -51,9 +51,11 @@ enum host { }; enum action { - ACTION_UPDATE = 0, - ACTION_PUBLIC = 1, - ACTION_FRIENDS = 2, + ACTION_UPDATE = 0, + ACTION_FRIENDS = 1, + ACTION_USER = 2, + ACTION_REPLIES = 4, + ACTION_PUBLIC = 8 }; struct session { @@ -64,6 +66,7 @@ struct session { char *time; char *homedir; char *logfile; + char *user; int bash; enum host host; enum action action; @@ -77,18 +80,20 @@ struct bti_curl_buffer { static void display_help(void) { - fprintf(stdout, "bti - send tweet to twitter\n"); + fprintf(stdout, "bti - send tweet to twitter or identi.ca\n"); fprintf(stdout, "Version: " BTI_VERSION "\n"); fprintf(stdout, "Usage:\n"); fprintf(stdout, " bti [options]\n"); fprintf(stdout, "options are:\n"); fprintf(stdout, " --account accountname\n"); fprintf(stdout, " --password password\n"); + fprintf(stdout, " --action action\n"); + fprintf(stdout, " ('update', 'friends', 'public', 'replies' or 'user')\n"); + fprintf(stdout, " --user screenname\n"); fprintf(stdout, " --proxy PROXY:PORT\n"); fprintf(stdout, " --host HOST\n"); fprintf(stdout, " --logfile logfile\n"); fprintf(stdout, " --bash\n"); - fprintf(stdout, " --action action\n"); fprintf(stdout, " --debug\n"); fprintf(stdout, " --version\n"); fprintf(stdout, " --help\n"); @@ -119,6 +124,7 @@ static void session_free(struct session *session) free(session->proxy); free(session->time); free(session->homedir); + free(session->user); free(session); } @@ -150,13 +156,17 @@ static void bti_curl_buffer_free(struct bti_curl_buffer *buffer) free(buffer); } +static const char *twitter_user_url = "http://twitter.com/statuses/user_timeline/"; static const char *twitter_update_url = "https://twitter.com/statuses/update.xml"; static const char *twitter_public_url = "http://twitter.com/statuses/public_timeline.xml"; static const char *twitter_friends_url = "https://twitter.com/statuses/friends_timeline.xml"; +static const char *twitter_replies_url = "http://twitter.com/statuses/replies.xml"; +static const char *identica_user_url = "http://identi.ca/api/statuses/user_timeline/"; static const char *identica_update_url = "http://identi.ca/api/statuses/update.xml"; static const char *identica_public_url = "http://identi.ca/api/statuses/public_timeline.xml"; static const char *identica_friends_url = "http://identi.ca/api/statuses/friends_timeline.xml"; +static const char *identica_replies_url = "http://identi.ca/api/statuses/replies.xml"; static CURL *curl_init(void) { @@ -261,8 +271,7 @@ size_t curl_callback(void *buffer, size_t size, size_t nmemb, void *userp) curl_buf->data = temp; memcpy(&curl_buf->data[curl_buf->length], (char *)buffer, buffer_size); curl_buf->length += buffer_size; - if ((curl_buf->action == ACTION_FRIENDS) || - (curl_buf->action == ACTION_PUBLIC)) + if (curl_buf->action) parse_timeline(curl_buf->data); dbg("%s\n", curl_buf->data); @@ -274,6 +283,8 @@ static int send_request(struct session *session) { char user_password[500]; char data[500]; + /* is there usernames longer than 22 chars? */ + char user_url[70]; struct bti_curl_buffer *curl_buf; CURL *curl = NULL; CURLcode res; @@ -334,6 +345,33 @@ static int send_request(struct session *session) } curl_easy_setopt(curl, CURLOPT_USERPWD, user_password); + break; + case ACTION_USER: + switch (session->host) { + case HOST_TWITTER: + sprintf(user_url, "%s%s.xml", twitter_user_url, session->user); + curl_easy_setopt(curl, CURLOPT_URL, user_url); + break; + case HOST_IDENTICA: + sprintf(user_url, "%s%s.xml", identica_user_url, session->user); + curl_easy_setopt(curl, CURLOPT_URL, user_url); + break; + } + + break; + case ACTION_REPLIES: + snprintf(user_password, sizeof(user_password), "%s:%s", + session->account, session->password); + switch (session->host) { + case HOST_TWITTER: + curl_easy_setopt(curl, CURLOPT_URL, twitter_replies_url); + break; + case HOST_IDENTICA: + curl_easy_setopt(curl, CURLOPT_URL, identica_replies_url); + break; + } + curl_easy_setopt(curl, CURLOPT_USERPWD, user_password); + break; case ACTION_PUBLIC: switch (session->host) { @@ -384,6 +422,7 @@ static void parse_configfile(struct session *session) char *proxy = NULL; char *logfile = NULL; char *action = NULL; + char *user = NULL; char *file; /* config file is ~/.bti */ @@ -445,6 +484,11 @@ static void parse_configfile(struct session *session) c += 7; if (c[0] != '\0') action = strdup(c); + } else if (!strncasecmp(c, "user", 4) && + (c[4] == '=')) { + c += 5; + if (c[0] != '\0') + user = strdup(c); } } while (!feof(config_file)); @@ -471,10 +515,17 @@ static void parse_configfile(struct session *session) session->action = ACTION_UPDATE; if (strcasecmp(action, "friends") == 0) session->action = ACTION_FRIENDS; + if (strcasecmp(action, "user") == 0) + session->action = ACTION_USER; + if (strcasecmp(action, "replies") == 0) + session->action = ACTION_REPLIES; if (strcasecmp(action, "public") == 0) session->action = ACTION_PUBLIC; free(action); } + if (user) { + session->user = user; + } /* Free buffer and close file. */ free(line); @@ -511,19 +562,31 @@ static void log_session(struct session *session, int retval) break; } - if (session->action == ACTION_UPDATE) { + switch (session->action) { + case ACTION_UPDATE: if (retval) fprintf(log_file, "%s: host=%s tweet failed\n", session->time, host); else fprintf(log_file, "%s: host=%s tweet=%s\n", session->time, host, session->tweet); - } else if (session->action == ACTION_FRIENDS) { + break; + case ACTION_FRIENDS: fprintf(log_file, "%s: host=%s retrieving friends timeline\n", session->time, host); - } else if (session->action == ACTION_PUBLIC) { + break; + case ACTION_USER: + fprintf(log_file, "%s: host=%s retrieving %s's timeline\n", + session->time, host, session->user); + break; + case ACTION_REPLIES: + fprintf(log_file, "%s: host=%s retrieving replies\n", + session->time, host); + break; + case ACTION_PUBLIC: fprintf(log_file, "%s: host=%s retrieving public timeline\n", session->time, host); + break; } fclose(log_file); @@ -538,6 +601,7 @@ int main(int argc, char *argv[], char *envp[]) { "host", 1, NULL, 'H' }, { "proxy", 1, NULL, 'P' }, { "action", 1, NULL, 'A' }, + { "user", 1, NULL, 'u' }, { "logfile", 1, NULL, 'L' }, { "help", 0, NULL, 'h' }, { "bash", 0, NULL, 'b' }, @@ -583,7 +647,7 @@ int main(int argc, char *argv[], char *envp[]) parse_configfile(session); while (1) { - option = getopt_long_only(argc, argv, "dqe:p:P:H:a:A:h", + option = getopt_long_only(argc, argv, "dqe:p:P:H:a:A:u:h", options, NULL); if (option == -1) break; @@ -614,10 +678,20 @@ int main(int argc, char *argv[], char *envp[]) session->action = ACTION_UPDATE; if (strcasecmp(optarg, "friends") == 0) session->action = ACTION_FRIENDS; + if (strcasecmp(optarg, "user") == 0) + session->action = ACTION_USER; + if (strcasecmp(optarg, "replies") == 0) + session->action = ACTION_REPLIES; if (strcasecmp(optarg, "public") == 0) session->action = ACTION_PUBLIC; dbg("action = %d\n", session->action); break; + case 'u': + if (session->user) + free(session->user); + session->user = strdup(optarg); + dbg("user = %s\n", session->user); + break; case 'L': if (session->logfile) free(session->logfile); @@ -676,6 +750,9 @@ int main(int argc, char *argv[], char *envp[]) dbg("tweet = %s\n", session->tweet); } + if (!session->user) + session->user = session->account; + dbg("account = %s\n", session->account); dbg("password = %s\n", session->password); dbg("host = %d\n", session->host);