]> 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 201d56fc0858d292896fbec02af510259a1df90b..ae32c377d89d97f6398d8c434ef9aa0f12cbd3da 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -82,6 +82,8 @@ struct session {
        char *group;
        char *hosturl;
        char *hostname;
+       char *configfile;
+       char *replyto;
        int bash;
        int interactive;
        int shrink_urls;
@@ -116,6 +118,8 @@ static void display_help(void)
        fprintf(stdout, "  --proxy PROXY:PORT\n");
        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");
@@ -234,7 +238,6 @@ static struct session *session_alloc(void)
        session = zalloc(sizeof(*session));
        if (!session)
                return NULL;
-       session_readline_init(session);
        return session;
 }
 
@@ -242,7 +245,7 @@ static void session_free(struct session *session)
 {
        if (!session)
                return;
-       session_readline_cleanup(session);
+       free(session->replyto);
        free(session->password);
        free(session->account);
        free(session->tweet);
@@ -253,6 +256,7 @@ static void session_free(struct session *session)
        free(session->group);
        free(session->hosturl);
        free(session->hostname);
+       free(session->configfile);
        free(session);
 }
 
@@ -316,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;
@@ -325,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) {
@@ -337,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;
@@ -461,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);
@@ -553,12 +568,7 @@ static void parse_configfile(struct session *session)
        char *file;
        int shrink_urls = 0;
 
-       /* config file is ~/.bti  */
-       file = alloca(strlen(session->homedir) + 7);
-
-       sprintf(file, "%s/.bti", session->homedir);
-
-       config_file = fopen(file, "r");
+       config_file = fopen(session->configfile, "r");
 
        /* No error if file does not exist or is unreadable.  */
        if (config_file == NULL)
@@ -710,7 +720,8 @@ static void log_session(struct session *session, int retval)
                                session->time, session->hostname);
                else
                        fprintf(log_file, "%s: host=%s tweet=%s\n",
-                               session->time, session->hostname, session->tweet);
+                               session->time, session->hostname,
+                               session->tweet);
                break;
        case ACTION_FRIENDS:
                fprintf(log_file, "%s: host=%s retrieving friends timeline\n",
@@ -1063,6 +1074,8 @@ int main(int argc, char *argv[], char *envp[])
                { "dry-run", 0, NULL, 'n' },
                { "page", 1, NULL, 'g' },
                { "version", 0, NULL, 'v' },
+               { "config", 1, NULL, 'c' },
+               { "replyto", 1, NULL, 'r' },
                { }
        };
        struct session *session;
@@ -1089,8 +1102,13 @@ int main(int argc, char *argv[], char *envp[])
        session->time = strdup(ctime(&t));
        session->time[strlen(session->time)-1] = 0x00;
 
+       /* Get the home directory so we can try to find a config file */
        session->homedir = strdup(getenv("HOME"));
 
+       /* set up a default config file location (traditionally ~/.bti) */
+       session->configfile = zalloc(strlen(session->homedir) + 7);
+       sprintf(session->configfile, "%s/.bti", session->homedir);
+
        curl_global_init(CURL_GLOBAL_ALL);
 
        /* Set environment variables first, before reading command line options
@@ -1106,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: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;
@@ -1128,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);
@@ -1202,6 +1224,18 @@ int main(int argc, char *argv[], char *envp[])
                case 'b':
                        session->bash = 1;
                        break;
+               case 'c':
+                       if (session->configfile)
+                               free(session->configfile);
+                       session->configfile = strdup(optarg);
+                       dbg("configfile = %s\n", session->configfile);
+
+                       /*
+                        * read the config file now.  Yes, this could override previously
+                        * set options from the command line, but the user asked for it...
+                        */
+                       parse_configfile(session);
+                       break;
                case 'h':
                        display_help();
                        goto exit;
@@ -1217,6 +1251,7 @@ int main(int argc, char *argv[], char *envp[])
                }
        }
 
+       session_readline_init(session);
        /*
         * Show the version to make it easier to determine what
         * is going on here
@@ -1280,6 +1315,7 @@ int main(int argc, char *argv[], char *envp[])
 
        if (session->page == 0)
                session->page = 1;
+       dbg("config file = %s\n", session->configfile);
        dbg("account = %s\n", session->account);
        dbg("password = %s\n", session->password);
        dbg("host = %d\n", session->host);
@@ -1302,6 +1338,7 @@ int main(int argc, char *argv[], char *envp[])
 
        log_session(session, retval);
 exit:
+       session_readline_cleanup(session);
        session_free(session);
        return retval;;
 }