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 )