]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
fix up the autoconf checking for liboauth and other libraries
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index e2b57c050b478a24c5a4782b4608382ae2606202..8feb8da221e32fba5b6d3fc0ac4a11732bf424ef 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -88,6 +88,7 @@ struct session {
        char *hosturl;
        char *hostname;
        char *configfile;
+       char *replyto;
        int bash;
        int interactive;
        int shrink_urls;
@@ -124,6 +125,7 @@ static void display_help(void)
        fprintf(stdout, "  --host HOST\n");
        fprintf(stdout, "  --logfile logfile\n");
        fprintf(stdout, "  --config configfile\n");
+       fprintf(stdout, "  --replyto ID\n");
        fprintf(stdout, "  --shrink-urls\n");
        fprintf(stdout, "  --page PAGENUMBER\n");
        fprintf(stdout, "  --bash\n");
@@ -249,6 +251,7 @@ static void session_free(struct session *session)
 {
        if (!session)
                return;
+       free(session->replyto);
        free(session->password);
        free(session->account);
        free(session->consumer_key);
@@ -307,13 +310,13 @@ static const char *identica_request_token_uri = "http://identi.ca/api/oauth/requ
 static const char *identica_access_token_uri  = "http://identi.ca/api/oauth/access_token";
 static const char *identica_authorize_uri     = "http://identi.ca/api/oauth/authorize?oauth_token=";
 
-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 *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 *mentions_uri = "/mentions.xml";
-static const char *replies_uri = "/replies.xml";
-static const char *group_uri = "/../statusnet/groups/timeline/";
+static const char *replies_uri  = "/replies.xml";
+static const char *group_uri    = "/../statusnet/groups/timeline/";
 
 static CURL *curl_init(void)
 {
@@ -335,6 +338,7 @@ static void parse_statuses(xmlDocPtr doc, xmlNodePtr current)
        xmlChar *text = NULL;
        xmlChar *user = NULL;
        xmlChar *created = NULL;
+       xmlChar *id = NULL;
        xmlNodePtr userinfo;
 
        current = current->xmlChildrenNode;
@@ -344,6 +348,8 @@ static void parse_statuses(xmlDocPtr doc, xmlNodePtr current)
                                created = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);
                        if (!xmlStrcmp(current->name, (const xmlChar *)"text"))
                                text = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);
+                       if (!xmlStrcmp(current->name, (const xmlChar *)"id"))
+                               id = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);
                        if (!xmlStrcmp(current->name, (const xmlChar *)"user")) {
                                userinfo = current->xmlChildrenNode;
                                while (userinfo != NULL) {
@@ -356,19 +362,21 @@ static void parse_statuses(xmlDocPtr doc, xmlNodePtr current)
                                }
                        }
 
-                       if (user && text && created) {
+                       if (user && text && created && id) {
                                if (verbose)
-                                       printf("[%s] (%.16s) %s\n",
-                                               user, created, text);
+                                       printf("[%s] {%s} (%.16s) %s\n",
+                                               user, id, created, text);
                                else
                                        printf("[%s] %s\n",
                                                user, text);
                                xmlFree(user);
                                xmlFree(text);
                                xmlFree(created);
+                               xmlFree(id);
                                user = NULL;
                                text = NULL;
                                created = NULL;
+                               id = NULL;
                        }
                }
                current = current->next;
@@ -562,6 +570,7 @@ static int send_request(struct session *session)
        char *req_url = NULL;
        char *reply = NULL;
        char *postarg = NULL;
+       char *escaped_tweet = NULL;
        int is_post = 0;
 
        if (!session)
@@ -597,6 +606,12 @@ static int send_request(struct session *session)
                                                CURLFORM_COPYCONTENTS, "bti",
                                                CURLFORM_END);
 
+                               if (session->replyto)
+                                       curl_formadd(&formpost, &lastptr,
+                                                    CURLFORM_COPYNAME, "in_reply_to_status_id",
+                                                    CURLFORM_COPYCONTENTS, session->replyto,
+                                                    CURLFORM_END);
+
                                curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
                                slist = curl_slist_append(slist, "Expect:");
                                curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
@@ -604,7 +619,6 @@ static int send_request(struct session *session)
                                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",
@@ -674,9 +688,10 @@ static int send_request(struct session *session)
        } else {
                switch (session->action) {
                        case ACTION_UPDATE:
+                               escaped_tweet = oauth_url_escape(session->tweet);
                                sprintf(endpoint,
                                                "%s%s?status=%s",
-                                               session->hosturl, update_uri, session->tweet);
+                                               session->hosturl, update_uri, escaped_tweet);
                                is_post = 1;
                                break;
                        case ACTION_USER:
@@ -748,6 +763,7 @@ static void parse_configfile(struct session *session)
        char *logfile = NULL;
        char *action = NULL;
        char *user = NULL;
+       char *replyto = NULL;
        int shrink_urls = 0;
 
        config_file = fopen(session->configfile, "r");
@@ -819,6 +835,11 @@ static void parse_configfile(struct session *session)
                        c += 8;
                        if (c[0] != '\0')
                                logfile = strdup(c);
+               } else if (!strncasecmp(c, "replyto", 7) &&
+                          (c[7] == '=')) {
+                       c += 8;
+                       if (c[0] != '\0')
+                               replyto = strdup(c);
                } else if (!strncasecmp(c, "action", 6) &&
                           (c[6] == '=')) {
                        c += 7;
@@ -879,6 +900,8 @@ static void parse_configfile(struct session *session)
        }
        if (logfile)
                session->logfile = logfile;
+       if (replyto)
+               session->replyto = replyto;
        if (action) {
                if (strcasecmp(action, "update") == 0)
                        session->action = ACTION_UPDATE;
@@ -1270,6 +1293,8 @@ int main(int argc, char *argv[], char *envp[])
        static const struct option options[] = {
                { "debug", 0, NULL, 'd' },
                { "verbose", 0, NULL, 'V' },
+               { "account", 1, NULL, 'a' },
+               { "password", 1, NULL, 'p' },
                { "host", 1, NULL, 'H' },
                { "proxy", 1, NULL, 'P' },
                { "action", 1, NULL, 'A' },
@@ -1283,6 +1308,7 @@ int main(int argc, char *argv[], char *envp[])
                { "page", 1, NULL, 'g' },
                { "version", 0, NULL, 'v' },
                { "config", 1, NULL, 'c' },
+               { "replyto", 1, NULL, 'r' },
                { }
        };
        struct session *session;
@@ -1329,7 +1355,7 @@ int main(int argc, char *argv[], char *envp[])
        parse_configfile(session);
 
        while (1) {
-               option = getopt_long_only(argc, argv, "dp:P:H:a:A:u:c:hg:G:snVv",
+               option = getopt_long_only(argc, argv, "dp:P:H:a:A:u:c:hg:G:sr:nVv",
                                          options, NULL);
                if (option == -1)
                        break;
@@ -1340,11 +1366,27 @@ int main(int argc, char *argv[], char *envp[])
                case 'V':
                        verbose = 1;
                        break;
+               case 'a':
+                       if (session->account)
+                               free(session->account);
+                       session->account = strdup(optarg);
+                       dbg("account = %s\n", session->account);
+                       break;
                case 'g':
                        page_nr = atoi(optarg);
                        dbg("page = %d\n", page_nr);
                        session->page = page_nr;
                        break;
+               case 'r':
+                       session->replyto = strdup(optarg);
+                       dbg("in_reply_to_status_id = %s\n", session->replyto);
+                       break;
+               case 'p':
+                       if (session->password)
+                               free(session->password);
+                       session->password = strdup(optarg);
+                       dbg("password = %s\n", session->password);
+                       break;
                case 'P':
                        if (session->proxy)
                                free(session->proxy);