char *hosturl;
char *hostname;
char *configfile;
+ char *replyto;
int bash;
int interactive;
int shrink_urls;
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");
{
if (!session)
return;
+ free(session->replyto);
free(session->password);
free(session->account);
free(session->consumer_key);
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)
{
xmlChar *text = NULL;
xmlChar *user = NULL;
xmlChar *created = NULL;
+ xmlChar *id = NULL;
xmlNodePtr userinfo;
current = current->xmlChildrenNode;
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) {
}
}
- 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;
char *req_url = NULL;
char *reply = NULL;
char *postarg = NULL;
+ char *escaped_tweet = NULL;
int is_post = 0;
if (!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);
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",
} 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:
char *logfile = NULL;
char *action = NULL;
char *user = NULL;
+ char *replyto = NULL;
int shrink_urls = 0;
config_file = fopen(session->configfile, "r");
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;
}
if (logfile)
session->logfile = logfile;
+ if (replyto)
+ session->replyto = replyto;
if (action) {
if (strcasecmp(action, "update") == 0)
session->action = ACTION_UPDATE;
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' },
{ "page", 1, NULL, 'g' },
{ "version", 0, NULL, 'v' },
{ "config", 1, NULL, 'c' },
+ { "replyto", 1, NULL, 'r' },
{ }
};
struct session *session;
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;
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);