<?php $emacs=0;

/*
 * To use define a file called creds that contains the following:
 *
 *   define('USERNAME',your-username);
 *   define('PASSWORD',your-password);
 *   define('EMAIL',your-email);
 *
 * then upload it to your site and pass in the ?eg parameter, such as:
 *
 *   http://jeffpalm.com/twitterrss/?eg
 *
 * or if you're brave you can pass in your username/password as GET
 * parameters, such as
 *
 *   http://jeffpalm.com/twitterrss/?username=your-username&password=your-password
 *
 * You can trust me, but I'm not sure about a man-in-the-middle or
 * anyone else sniffing traffic.
 */

if (!isset($_REQUEST['eg']) && !(isset($_REQUEST['username']) || isset($_REQUEST['u'])) 
    && !(isset(
$_REQUEST['password']) || isset($_REQUEST['p']))) {
  include 
'about.php';
  return;
 }

include 
'creds.php';

// ----------------------------------------------------------------------
// Functions
// ----------------------------------------------------------------------

function makeRequest($username,$password) {
  
$s curl_init();
  
$header = array();
  
$header []= 'Authorization: Basic ' base64_encode($username ':' $password);
  
curl_setopt($s,CURLOPT_URL,'http://twitter.com/statuses/friends_timeline.xml'); 
  
curl_setopt($s,CURLOPT_HTTPHEADER,$header);
  
curl_setopt($sCURLOPT_CONNECTTIMEOUT30);
  
curl_setopt($sCURLOPT_TIMEOUT30);
  
curl_setopt($sCURLOPT_RETURNTRANSFER1);
  
$res curl_exec($s);
  
curl_close($s);
  return 
$res;
}

// <pubDate>Wed, 02 Oct 2002 08:00:00 EST</pubDate>
function rssDate($dayOfWeek=0,$dayOfMonth=0,$month=0,$year=0,$hours=0,$mins=0,$secs=0) {
  if (!
$dayOfWeek) {
    return 
date('D, d M Y H:i:s');
  }
  return 
$dayOfWeek ', ' $dayOfMonth ' ' $month ' ' 
    
.    $year ' ' $hours ':' $mins ':' $secs ' GMT';
}

function 
startRSS($username) {

  
$title $username '\'s twitter';
  
$baseURL 'http://twitter.com/' $username;
  
$description $username '\'s public timeline';
  
$email EMAIL;

  return 
'<rss xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:hewsWeb="http://www.hewsweb.org" '
    
.    'xmlns:asgard="http://asgard.jrc.it" xmlns:dc="http://purl.org/dc/elements/1.1/" '
    
.    'xmlns:gdas="http://gdas.jrc.it" xmlns:geo="http://www.w3.org/2003/01/geo/"><channel>'
    
.    '<title>'         $title       '</title>'
    
.    '<link>'          $baseURL     '</link>' 
    
.    '<lastBuildDate>' rssDate()    . '</lastBuildDate>'
    
.    '<pubDate>'       rssDate()    . '</pubDate>'
    
.    '<description>'   $description '</description>'
    
.    '<webMaster>'     $email       '</webMaster>' "\n";
}

function 
endRSS() {
  return 
'</channel></rss>';
}

function 
ordinal($num) {
  
$num preg_replace('/^0+/','',$num);
  if (
preg_match('/1$/',$num)) {
    
$suffix 'st';
  } else if (
preg_match('/2$/',$num)) {
    
$suffix 'nd';
  } else if (
preg_match('/3$/',$num)) {
    
$suffix 'rd';
  } else {
    
$suffix 'th';
  }
  return 
$num $suffix;
}

// ----------------------------------------------------------------------
// Main
// ----------------------------------------------------------------------

if (isset($_REQUEST['eg'])) {
  
$username USERNAME;
  
$password PASSWORD;
 } else {
  
$username $_REQUEST['username'];
  if (!
$username$username $_REQUEST['u'];
  
$password $_REQUEST['password'];
  if (!
$password$password $_REQUEST['p'];
 }


$res makeRequest($username,$password);

header('Content-type: text/plain');
echo 
startRSS($username);
$lines preg_split("/\n/",$res);
foreach (
$lines as $line) {
  
// <created_at>Tue Jun 02 05:32:18 +0000 2009</created_at>
  
if (!$date && 
      
preg_match('/<created_at>(\w{3}) (\w{3}) (\d+) (\d\d?):(\d\d?):(\d\d?) \+\d{4} (\d{4})/',$line,$out)) {
    
$date rssDate($out[1],$out[3],$out[2],$out[7],$out[4],$out[5],$out[6]);
    
$hours preg_replace('/^0/','',$out[4]);
    if (
$hours == '0') {
      
$hours 12;
      
$amPm 'am';
    } else if (
$hours 12) {
      
$hours -= 12;
      
$amPm 'pm';
    } else {
      
$amPm 'am';
    }
    
$time $hours ':' $out[5] . $amPm;
    
$smallDate $out[2] . ' ' ordinal($out[3]);
  }
  if (
preg_match('/<id>([^<]+)</',$line,$out)) {
    
$id $out[1];
  }
  if (
preg_match('/<text>([^<]*)</',$line,$out)) {
    
$description $out[1];
  }
  if (
preg_match('/<name>([^<]+)</',$line,$out)) {
    
$name $out[1];
  }
  if (
preg_match('/<screen_name>([^<]+)</',$line,$out)) {
    
$screenName $out[1];
  }
  if (
preg_match("/<\/status>/",$line)) {
    
$title $screenName ' @ ' $time ' on ' $smallDate;;
    
$description .= '<br/><br/> -- ' $name
    
$link 'http://twitter.com/' $username '/status/' $id;
    
$xml '<item>'
      
'<title>'       $title       '</title>'
      
'<description>' $description '</description>'
      
'<link>'        $link        '</link>'
      
'<pubDate>'     $date        '</pubDate>'
      
'</item>' "\n";
    echo 
$xml;
    
$title         NULL;
    
$date          NULL;
    
$description   NULL;
    
$url           NULL;
    
$link          NULL;
  }
}
echo 
endRSS();
  
?>