]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
Support for replying to notices
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index 4bf6a6c2a98b7a32b9edb556d841202988916e08..ae32c377d89d97f6398d8c434ef9aa0f12cbd3da 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -83,6 +83,7 @@ struct session {
        char *hosturl;
        char *hostname;
        char *configfile;
+       char *replyto;
        int bash;
        int interactive;
        int shrink_urls;
@@ -118,6 +119,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");
@@ -243,6 +245,7 @@ static void session_free(struct session *session)
 {
        if (!session)
                return;
+       free(session->replyto);
        free(session->password);
        free(session->account);
        free(session->tweet);
@@ -317,6 +320,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;
@@ -326,6 +330,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) {
@@ -338,19 +344,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;
@@ -462,6 +470,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);
@@ -1061,6 +1075,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;
@@ -1109,7 +1124,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;
@@ -1131,6 +1146,10 @@ int main(int argc, char *argv[], char *envp[])
                        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);