Saturday, January 19, 2013

Avocado.io, iCal update

I've actually been using this one, so here is an update. The codes a little cleaner, and only one error is thrown, lol. Link to the old one


<?php

define("_AVOCADO_API_URL_BASE", "https://avocado.io/api/");
define("_AVOCADO_API_URL_LOGIN", _AVOCADO_API_URL_BASE . "authentication/login");
define("_AVOCADO_API_URL_COUPLE", _AVOCADO_API_URL_BASE . "couple");
define("_AVOCADO_COOKIE_NAME", "user_email");
define("_AVOCADO_USER_AGENT", "Avocado Test Api Client v.1.0");

$date = $argv[1];
$military = $argv[2] * 60;
$military_two = $military * 60;
$name = $argv[3];
if (preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $date)) { 
 $seconds = strtotime($date);
 $minutes_to_add = (($seconds - time()) / 60) + $military;

 $avocadotime =($seconds+ $military_two) * 1000;


 $milliseconds = $avocadotime;
 $two_more_milli = $avocadotime + 12000;
 $two_more = $minutes_to_add + 2;

 $appscript = ">>END
set now to (current date)
 set eStart to now + $minutes_to_add * minutes
 set eEnd to now + $two_more * minutes
 set eName to \" $name \"
 set alarmTime to 0 -- alarm at the exact moment of the event

 tell application \"iCal\"
  set newEvent to make new event at end of events of calendar \"Home\" with properties {summary:eName, start date:eStart, end date:eEnd}
   make new display alarm at end of display alarms of newEvent with properties {trigger interval:alarmTime}
   end tell
END";
}
`osascript $appscript`;


$api = new AvocadoAPI();
$api->updateFromCommandLineInput();
$api->createReminder($milliseconds, $two_more_milli, $name);
class AvocadoAPI {
  var $couple,
      $authManager;

  function AvocadoAPI() {
    $this->authManager = new AvocadoAuthManager();
  }

  function updateFromCommandLineInput() {
    $this->authManager->updateAuthFromCommandLineInput();
    $this->updateCouple();

    # Check that the response from the Avocado API was valid.
    if ($this->couple == null) {
      print "FAILED.  Signature was tested and failed. Try again and check the auth information.\n";
    } else {
      print "SUCCESS.\n\nBelow is your Avocado API signature:\n" .
        $this->authManager->signature . "\n";
    }
  }
  function getCouple(){
//  $qry_str = "?avosig=".$this->authManager->signature;
  $ch = curl_init();

  // Set query data here with the URL
  curl_setopt($ch, CURLOPT_URL, _AVOCADO_API_URL_BASE."calendar");
//  $this->signCurlRequest($ch);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, '3');
  $content = trim(curl_exec($ch));
  curl_close($ch);
  $content = json_decode($content);
  print_r($content);
  }
  function createReminder($milliseconds, $two_more_milli, $name){
//  $qry_str = "?avosig=".$this->authManager->signature;
   $ch = curl_init(_AVOCADO_API_URL_BASE."calendar");
  $fields = array (
  "start" => urlencode($milliseconds),
  "end" => urlencode($two_more_milli),
  "title" => $name,
  "location" => '',
  "description" => $name,
  "timezone" => "America/Chicago"
  );
    curl_setopt($ch, CURLOPT_POSTFIELDS,  $fields);
 curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, _AVOCADO_USER_AGENT);
 $this->signCurlRequest($ch);

  $returndata = curl_exec ($ch);
    $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 curl_close($ch);

//  $content = json_decode($content);
//  print_r($content);
 echo $returndata;
    $this->createdReminder = $response_code == 200 ? json_decode($returndata) : null;
 echo $this->createdReminder;
  }

  
  function updateCouple() {
    # Send the POST request.
    $ch = curl_init(_AVOCADO_API_URL_COUPLE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  //  $this->signCurlRequest($ch);
    $output = curl_exec($ch);
    $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    # Use the HTTP response code to test if a valid API request was made.
    $this->couple = $response_code == 200 ? json_decode($output) : null;
  }

  function signCurlRequest($ch) {
    curl_setopt($ch, CURLOPT_COOKIE, _AVOCADO_COOKIE_NAME . "=" . $this->authManager->cookie);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-AvoSig: " . $this->authManager->signature));
    curl_setopt($ch, CURLOPT_USERAGENT, _AVOCADO_USER_AGENT);
  }
}


class AvocadoAuthManager {
  var $cookie,
      $developer_id,
      $developer_key,
      $email,
      $password,
      $signature;

  function AvocadoAuthManager() {}

  function updateAuthFromCommandLineInput() {
    # Ask the user for all of the necessary authentication info
    $this->email = 'dustycarver@gmail.com';
    $this->password = 'pandabear';
    $this->developer_id = 43;
    $this->developer_key = '2EWP5Rp8vbBxYRFhwZLldd3JPXrZ1HurTM3GUV3yqpPsqmuEnL8lIpI1MxbyzXqT';
    $this->updateSignature();
  }

  function updateSignature() {
    # Get a new cookie by logging into Avocado.
    $this->updateLoginCookie();

    # Hash the user token.
    $hashed_user_token = hash("sha256", $this->cookie . $this->developer_key);

    # Store the new signature.
    $this->signature = $this->developer_id . ":" . $hashed_user_token;
  }

  function updateLoginCookie() {
    $fields = array(
      'email'=>urlencode($this->email),
      'password'=>urlencode($this->password)
    );

    # Send the POST request.
    $ch = curl_init(_AVOCADO_API_URL_LOGIN);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS,  get_querystring_from_array($fields));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, _AVOCADO_USER_AGENT);
    $header = substr(curl_exec($ch), 0, curl_getinfo($ch, CURLINFO_HEADER_SIZE));
    curl_close($ch);

    # Store the cookie for use in later API requests.
    $this->cookie = get_cookie_from_header($header, _AVOCADO_COOKIE_NAME);
  }
}


#-----------------------------------------------------
# Mama's little helpers: functions we needed for this.
#-----------------------------------------------------

function get_querystring_from_array($fields) {
  $fields_string = null;
  foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
  rtrim($fields_string, '&');
  return $fields_string;
}

function get_cookie_from_header($header, $cookie_name) {
  preg_match('/^Set-Cookie: ' . $cookie_name . '=(.*?);/m', $header, $cookie_array);
  return $cookie_array[1];
}

function get_input_silently($msg){
  # NOTE: stty only works on *nix systems.
  system('stty -echo');
  $input = get_input("Password");
  system('stty echo');
  print "\n";
  return $input;
}

function get_input($msg){
  fwrite(STDOUT, "$msg: ");
  return trim(fgets(STDIN));
}

?>

No comments: