From d4971e091c3880503c5e9fe8dadae480aadb8db3 Mon Sep 17 00:00:00 2001 From: Amir Mohammad Saied Date: Mon, 4 May 2009 10:54:26 +0430 Subject: [PATCH] Support for custom bti installations Now one can pass the URL of a custom laconica installation as value of host (the both previous "twitter" and "identica" are still valid though). The passed URL should be the base path of where API endpoints are located. e.g., identica' baseurl is: http://identi.ca/api/statuses And twit.tv's army (which is a laconica instance) is: http://army.twit.tv/api/statuses --- bti.c | 118 +++++++++++++++++++++++----------------------------------- 1 file changed, 47 insertions(+), 71 deletions(-) diff --git a/bti.c b/bti.c index 749e0a1..0f58d70 100644 --- a/bti.c +++ b/bti.c @@ -52,16 +52,17 @@ static int debug; enum host { - HOST_TWITTER = 0, + HOST_TWITTER = 0, HOST_IDENTICA = 1, + HOST_CUSTOM = 2 }; enum action { - ACTION_UPDATE = 0, + ACTION_UPDATE = 0, ACTION_FRIENDS = 1, - ACTION_USER = 2, + ACTION_USER = 2, ACTION_REPLIES = 4, - ACTION_PUBLIC = 8, + ACTION_PUBLIC = 8, ACTION_UNKNOWN = 16 }; @@ -74,6 +75,7 @@ struct session { char *homedir; char *logfile; char *user; + char *hosturl; int bash; int shrink_urls; int dry_run; @@ -139,6 +141,7 @@ static void session_free(struct session *session) free(session->time); free(session->homedir); free(session->user); + free(session->hosturl); free(session); } @@ -170,17 +173,14 @@ 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 *twitter_host = "http://twitter.com/statuses"; +static const char *identica_host = "http://identi.ca/api/statuses"; -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 const char *user_uri = "/user_timeline/"; +static const char *update_uri = "/update.xml"; +static const char *public_uri = "/public_timeline.xml"; +static const char *friends_uri = "/friends_timeline.xml"; +static const char *replies_uri = "/replies.xml"; static CURL *curl_init(void) { @@ -297,10 +297,9 @@ static size_t curl_callback(void *buffer, size_t size, size_t nmemb, static int send_request(struct session *session) { + char endpoint[100]; 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; @@ -337,75 +336,38 @@ static int send_request(struct session *session) curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); slist = curl_slist_append(slist, "Expect:"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); - switch (session->host) { - case HOST_TWITTER: - curl_easy_setopt(curl, CURLOPT_URL, - twitter_update_url); - break; - case HOST_IDENTICA: - curl_easy_setopt(curl, CURLOPT_URL, - identica_update_url); - break; - } + + sprintf(endpoint, "%s%s", session->hosturl, update_uri); + curl_easy_setopt(curl, CURLOPT_URL, endpoint); curl_easy_setopt(curl, CURLOPT_USERPWD, user_password); break; case ACTION_FRIENDS: snprintf(user_password, sizeof(user_password), "%s:%s", session->account, session->password); - switch (session->host) { - case HOST_TWITTER: - sprintf(user_url, "%s?page=%d", twitter_friends_url, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - case HOST_IDENTICA: - sprintf(user_url, "%s?page=%d", identica_friends_url, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - } + sprintf(endpoint, "%s%s?page=%d", session->hosturl, + friends_uri, session->page); + curl_easy_setopt(curl, CURLOPT_URL, endpoint); curl_easy_setopt(curl, CURLOPT_USERPWD, user_password); break; case ACTION_USER: - switch (session->host) { - case HOST_TWITTER: - sprintf(user_url, "%s%s.xml?page=%d", twitter_user_url, session->user, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - case HOST_IDENTICA: - sprintf(user_url, "%s%s.xml?page=%d", identica_user_url, session->user, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - } + sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl, user_uri, + session->user, session->page); + curl_easy_setopt(curl, CURLOPT_URL, endpoint); break; case ACTION_REPLIES: snprintf(user_password, sizeof(user_password), "%s:%s", session->account, session->password); - switch (session->host) { - case HOST_TWITTER: - sprintf(user_url, "%s?page=%d", twitter_replies_url, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - case HOST_IDENTICA: - sprintf(user_url, "%s?page=%d", identica_replies_url, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - } + sprintf(endpoint, "%s%s?page=%d", session->hosturl, replies_uri, session->page); + curl_easy_setopt(curl, CURLOPT_URL, endpoint); curl_easy_setopt(curl, CURLOPT_USERPWD, user_password); break; case ACTION_PUBLIC: - switch (session->host) { - case HOST_TWITTER: - sprintf(user_url, "%s?page=%d", twitter_public_url, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - case HOST_IDENTICA: - sprintf(user_url, "%s?page=%d", identica_public_url, session->page); - curl_easy_setopt(curl, CURLOPT_URL, user_url); - break; - } + sprintf(endpoint, "%s%s?page=%d", session->hosturl, public_uri, session->page); + curl_easy_setopt(curl, CURLOPT_URL, endpoint); break; default: @@ -533,10 +495,16 @@ static void parse_configfile(struct session *session) if (account) session->account = account; if (host) { - if (strcasecmp(host, "twitter") == 0) + if (strcasecmp(host, "twitter") == 0) { session->host = HOST_TWITTER; - if (strcasecmp(host, "identica") == 0) + session->hosturl = strdup(twitter_host); + } else if (strcasecmp(host, "identica") == 0) { session->host = HOST_IDENTICA; + session->hosturl = strdup(identica_host); + } else { + session->host = HOST_CUSTOM; + session->hosturl = strdup(host); + } free(host); } if (proxy) { @@ -596,7 +564,7 @@ static void log_session(struct session *session, int retval) host = "identi.ca"; break; default: - host = "unknown"; + host = session->hosturl; break; } @@ -1031,10 +999,18 @@ int main(int argc, char *argv[], char *envp[]) session->shrink_urls = 1; break; case 'H': - if (strcasecmp(optarg, "twitter") == 0) + if (session->hosturl) + free(session->hosturl); + if (strcasecmp(optarg, "twitter") == 0) { session->host = HOST_TWITTER; - if (strcasecmp(optarg, "identica") == 0) + session->hosturl = strdup(twitter_host); + } else if (strcasecmp(optarg, "identica") == 0) { session->host = HOST_IDENTICA; + session->hosturl = strdup(identica_host); + } else { + session->host = HOST_CUSTOM; + session->hosturl = strdup(optarg); + } dbg("host = %d\n", session->host); break; case 'b': -- 2.39.5