/[debian]/bti/branches/upstream/current/bti.c
ViewVC logotype

Diff of /bti/branches/upstream/current/bti.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1711 by gregoa, Tue Apr 14 16:06:53 2009 UTC revision 1712 by gregoa, Wed May 6 20:50:41 2009 UTC
# Line 52  Line 52 
52  static int debug;  static int debug;
53    
54  enum host {  enum host {
55          HOST_TWITTER = 0,          HOST_TWITTER  = 0,
56          HOST_IDENTICA = 1,          HOST_IDENTICA = 1,
57            HOST_CUSTOM   = 2
58  };  };
59    
60  enum action {  enum action {
61          ACTION_UPDATE = 0,          ACTION_UPDATE  = 0,
62          ACTION_FRIENDS = 1,          ACTION_FRIENDS = 1,
63          ACTION_USER = 2,          ACTION_USER    = 2,
64          ACTION_REPLIES = 4,          ACTION_REPLIES = 4,
65          ACTION_PUBLIC = 8,          ACTION_PUBLIC  = 8,
66          ACTION_UNKNOWN = 16          ACTION_UNKNOWN = 16
67  };  };
68    
# Line 74  struct session { Line 75  struct session {
75          char *homedir;          char *homedir;
76          char *logfile;          char *logfile;
77          char *user;          char *user;
78            char *hosturl;
79          int bash;          int bash;
80          int shrink_urls;          int shrink_urls;
81          int dry_run;          int dry_run;
# Line 139  static void session_free(struct session Line 141  static void session_free(struct session
141          free(session->time);          free(session->time);
142          free(session->homedir);          free(session->homedir);
143          free(session->user);          free(session->user);
144            free(session->hosturl);
145          free(session);          free(session);
146  }  }
147    
# Line 170  static void bti_curl_buffer_free(struct Line 173  static void bti_curl_buffer_free(struct
173          free(buffer);          free(buffer);
174  }  }
175    
176  static const char *twitter_user_url    = "http://twitter.com/statuses/user_timeline/";  static const char *twitter_host  = "http://twitter.com/statuses";
177  static const char *twitter_update_url  = "https://twitter.com/statuses/update.xml";  static const char *identica_host = "https://identi.ca/api/statuses";
178  static const char *twitter_public_url  = "http://twitter.com/statuses/public_timeline.xml";  
179  static const char *twitter_friends_url = "https://twitter.com/statuses/friends_timeline.xml";  static const char *user_uri    = "/user_timeline/";
180  static const char *twitter_replies_url = "http://twitter.com/statuses/replies.xml";  static const char *update_uri  = "/update.xml";
181    static const char *public_uri  = "/public_timeline.xml";
182  static const char *identica_user_url    = "http://identi.ca/api/statuses/user_timeline/";  static const char *friends_uri = "/friends_timeline.xml";
183  static const char *identica_update_url  = "http://identi.ca/api/statuses/update.xml";  static const char *replies_uri = "/replies.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";  
184    
185  static CURL *curl_init(void)  static CURL *curl_init(void)
186  {  {
# Line 201  static void parse_statuses(xmlDocPtr doc Line 201  static void parse_statuses(xmlDocPtr doc
201  {  {
202          xmlChar *text = NULL;          xmlChar *text = NULL;
203          xmlChar *user = NULL;          xmlChar *user = NULL;
204            xmlChar *created = NULL;
205          xmlNodePtr userinfo;          xmlNodePtr userinfo;
206    
207          current = current->xmlChildrenNode;          current = current->xmlChildrenNode;
208          while (current != NULL) {          while (current != NULL) {
209                  if (current->type == XML_ELEMENT_NODE) {                  if (current->type == XML_ELEMENT_NODE) {
210                            if (!xmlStrcmp(current->name, (const xmlChar *)"created_at"))
211                                    created = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);
212                          if (!xmlStrcmp(current->name, (const xmlChar *)"text"))                          if (!xmlStrcmp(current->name, (const xmlChar *)"text"))
213                                  text = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);                                  text = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);
214                          if (!xmlStrcmp(current->name, (const xmlChar *)"user")) {                          if (!xmlStrcmp(current->name, (const xmlChar *)"user")) {
# Line 219  static void parse_statuses(xmlDocPtr doc Line 222  static void parse_statuses(xmlDocPtr doc
222                                          userinfo = userinfo->next;                                          userinfo = userinfo->next;
223                                  }                                  }
224                          }                          }
225                          if (user && text) {  
226                                  printf("[%s] %s\n", user, text);                          if (user && text && created) {
227                                    printf("[%s] (%.16s) %s\n",
228                                            user, created, text);
229                                  xmlFree(user);                                  xmlFree(user);
230                                  xmlFree(text);                                  xmlFree(text);
231                                    xmlFree(created);
232                                  user = NULL;                                  user = NULL;
233                                  text = NULL;                                  text = NULL;
234                                    created = NULL;
235                          }                          }
236                  }                  }
237                  current = current->next;                  current = current->next;
# Line 297  static size_t curl_callback(void *buffer Line 304  static size_t curl_callback(void *buffer
304    
305  static int send_request(struct session *session)  static int send_request(struct session *session)
306  {  {
307            char endpoint[100];
308          char user_password[500];          char user_password[500];
309          char data[500];          char data[500];
         /* is there usernames longer than 22 chars? */  
         char user_url[70];  
310          struct bti_curl_buffer *curl_buf;          struct bti_curl_buffer *curl_buf;
311          CURL *curl = NULL;          CURL *curl = NULL;
312          CURLcode res;          CURLcode res;
# Line 337  static int send_request(struct session * Line 343  static int send_request(struct session *
343                  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);                  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
344                  slist = curl_slist_append(slist, "Expect:");                  slist = curl_slist_append(slist, "Expect:");
345                  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);                  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
346                  switch (session->host) {                  
347                  case HOST_TWITTER:                  sprintf(endpoint, "%s%s", session->hosturl, update_uri);
348                          curl_easy_setopt(curl, CURLOPT_URL,                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                                          twitter_update_url);  
                         break;  
                 case HOST_IDENTICA:  
                         curl_easy_setopt(curl, CURLOPT_URL,  
                                          identica_update_url);  
                         break;  
                 }  
349                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
350    
351                  break;                  break;
352          case ACTION_FRIENDS:          case ACTION_FRIENDS:
353                  snprintf(user_password, sizeof(user_password), "%s:%s",                  snprintf(user_password, sizeof(user_password), "%s:%s",
354                           session->account, session->password);                           session->account, session->password);
355                  switch (session->host) {                  sprintf(endpoint, "%s%s?page=%d", session->hosturl,
356                  case HOST_TWITTER:                          friends_uri, session->page);
357                          sprintf(user_url, "%s?page=%d", twitter_friends_url, session->page);                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                         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;  
                 }  
358                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
359    
360                  break;                  break;
361          case ACTION_USER:          case ACTION_USER:
362                  switch (session->host) {                  sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl, user_uri,
363                  case HOST_TWITTER:                                  session->user, session->page);
364                          sprintf(user_url, "%s%s.xml?page=%d", twitter_user_url, session->user, session->page);                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                         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;  
                 }  
365    
366                  break;                  break;
367          case ACTION_REPLIES:          case ACTION_REPLIES:
368                  snprintf(user_password, sizeof(user_password), "%s:%s",                  snprintf(user_password, sizeof(user_password), "%s:%s",
369                           session->account, session->password);                           session->account, session->password);
370                  switch (session->host) {                  sprintf(endpoint, "%s%s?page=%d", session->hosturl, replies_uri, session->page);
371                  case HOST_TWITTER:                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                         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;  
                 }  
372                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
373    
374                  break;                  break;
375          case ACTION_PUBLIC:          case ACTION_PUBLIC:
376                  switch (session->host) {                  sprintf(endpoint, "%s%s?page=%d", session->hosturl, public_uri, session->page);
377                  case HOST_TWITTER:                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                         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;  
                 }  
378    
379                  break;                  break;
380          default:          default:
# Line 533  static void parse_configfile(struct sess Line 502  static void parse_configfile(struct sess
502          if (account)          if (account)
503                  session->account = account;                  session->account = account;
504          if (host) {          if (host) {
505                  if (strcasecmp(host, "twitter") == 0)                  if (strcasecmp(host, "twitter") == 0) {
506                          session->host = HOST_TWITTER;                          session->host = HOST_TWITTER;
507                  if (strcasecmp(host, "identica") == 0)                          session->hosturl = strdup(twitter_host);
508                    } else if (strcasecmp(host, "identica") == 0) {
509                          session->host = HOST_IDENTICA;                          session->host = HOST_IDENTICA;
510                            session->hosturl = strdup(identica_host);
511                    } else {
512                            session->host = HOST_CUSTOM;
513                            session->hosturl = strdup(host);
514                    }
515                  free(host);                  free(host);
516          }          }
517          if (proxy) {          if (proxy) {
# Line 596  static void log_session(struct session * Line 571  static void log_session(struct session *
571                  host = "identi.ca";                  host = "identi.ca";
572                  break;                  break;
573          default:          default:
574                  host = "unknown";                  host = session->hosturl;
575                  break;                  break;
576          }          }
577    
# Line 1031  int main(int argc, char *argv[], char *e Line 1006  int main(int argc, char *argv[], char *e
1006                          session->shrink_urls = 1;                          session->shrink_urls = 1;
1007                          break;                          break;
1008                  case 'H':                  case 'H':
1009                          if (strcasecmp(optarg, "twitter") == 0)                          if (session->hosturl)
1010                                    free(session->hosturl);
1011                            if (strcasecmp(optarg, "twitter") == 0) {
1012                                  session->host = HOST_TWITTER;                                  session->host = HOST_TWITTER;
1013                          if (strcasecmp(optarg, "identica") == 0)                                  session->hosturl = strdup(twitter_host);
1014                            } else if (strcasecmp(optarg, "identica") == 0) {
1015                                  session->host = HOST_IDENTICA;                                  session->host = HOST_IDENTICA;
1016                                    session->hosturl = strdup(identica_host);
1017                            } else {
1018                                    session->host = HOST_CUSTOM;
1019                                    session->hosturl = strdup(optarg);
1020                            }
1021                          dbg("host = %d\n", session->host);                          dbg("host = %d\n", session->host);
1022                          break;                          break;
1023                  case 'b':                  case 'b':

Legend:
Removed from v.1711  
changed lines
  Added in v.1712

  ViewVC Help
Powered by ViewVC 1.1.26