App-gcal
view release on metacpan or search on metacpan
lib/App/gcal.pm view on Meta::CPAN
use strict;
use warnings;
package App::gcal;
{
$App::gcal::VERSION = '1.121460';
}
use Class::ReturnValue;
use Data::ICal;
use DateTime::TimeZone;
# ABSTRACT: Command Line Interface interface to Google Calendar.
# cache the timezone lookup
my $localTZ = DateTime::TimeZone->new( name => 'local' );
my $gcal;
# entry point
sub run {
my ( $args, $username, $password ) = @_;
# loop over args
for my $arg (@$args) {
my $cal;
if ( ( -e $arg ) && ( -r $arg ) ) {
# looks like a file
$cal = _process_file($arg);
}
else {
# give to ICal::QuickAdd
$cal = _process_text($arg);
}
if ($cal) {
_save_to_gcal( $cal, $username, $password );
}
else {
print STDERR $cal->error_message . "\n";
}
}
}
# process an ics file
sub _process_file {
my ($file) = @_;
my $calendar = Data::ICal->new( filename => $file );
unless ($calendar) {
return _error("error parsing $file");
}
return $calendar;
}
# process a text event
sub _process_text {
my ($text) = @_;
my $error_msg = 'error parsing text';
unless ($text) {
return _error($error_msg);
}
require ICal::Format::Natural;
my $calendar = ICal::Format::Natural::ical_format_natural($text);
unless ( $calendar->isa('Data::ICal') ) {
return _error($error_msg);
}
return $calendar;
}
# save event to Google Calendar
sub _save_to_gcal {
my ( $cal, $username, $password ) = @_;
unless ($gcal) {
unless ( $username && $password ) {
# get login and password from .netrc
require Net::Netrc;
my $netrc = Net::Netrc->lookup('google.com');
unless ($netrc) {
die(
'Error. Could not find your credentials in your .netrc file'
);
}
$username = $netrc->login;
$password = $netrc->password;
}
# login
require Net::Google::Calendar;
$gcal = Net::Google::Calendar->new;
$gcal->login( $username, $password );
}
for my $entry ( @{ $cal->entries } ) {
# create gcal event
my $event = _create_new_gcal_event($entry);
# save
my $tmp = $gcal->add_entry($event);
die "Couldn't add event: $@\n" unless defined $tmp;
}
}
# converts Data::ICal to Net::Google::Calendar::Entry
sub _create_new_gcal_event {
my ($entry) = @_;
require Net::Google::Calendar::Entry;
require DateTime::Format::ICal;
my $event = Net::Google::Calendar::Entry->new();
$event->title( $entry->property('summary')->[0]->value );
# ensure the times are in the local timezone
my $dtstart = DateTime::Format::ICal->parse_datetime(
$entry->property('dtstart')->[0]->value );
$dtstart->set_time_zone($localTZ);
my $dtend = DateTime::Format::ICal->parse_datetime(
$entry->property('dtend')->[0]->value );
$dtend->set_time_zone($localTZ);
$event->when( $dtstart, $dtend );
( run in 1.663 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )