Meetup-API

 view release on metacpan or  search on metacpan

examples/events-to-ical.pl  view on Meta::CPAN


GetOptions(
    'c|calendar=s' => \my $davcalendar,
    's|server=s'   => \my $davserver,
    'g|group=s'    => \my $groupname,
    'sync-file=s'  => \my $sync_file,

    'attendee=s'   => \my $attendee,

    'x|exclude=s'  => \my @exclude,

    'f|force'      => \my $force,
    'n|dry-run'    => \my $dryrun,
    'v|verbose'    => \my $verbose,
    'help!' => \my $opt_help,
    'version!' => \my $opt_version,
) or pod2usage(-verbose => 1) && exit;

pod2usage(-verbose => 1) && exit if $opt_help;
if( $opt_version ) {
    print $VERSION;
    exit;
};

$groupname ||= 'Perl-User-Groups-Rhein-Main';
$davcalendar ||= 'Default';
$attendee ||= 'corion@corion.net';

my $today = strftime '%Y-%m-%dT00:00:01', localtime;
my $syncToken;
if( $sync_file and -r $sync_file ) {
    open my $fh, '<', $sync_file
        or die "Couldn't open '$sync_file': $!";
    binmode $fh;
    $syncToken = <$fh>;
    $syncToken =~ s!\s+$!!;
};
my $meetup = Meetup::API->new();

$meetup->read_credentials;

my $events = $meetup->group_events($groupname)->get;

sub verbose(@msg) {
    if( $verbose ) {
    #no warnings 'wide';
        print "$_\n" for @msg
    };
}

sub add_event {
    my( $caldav, $calendar, $event ) = @_;
    if( ! $dryrun ) {
        my $data = meetup_to_icalendar( $event, self => $attendee );
        my $handle = $caldav->NewEvent( $calendar, $data);
    } else {
        print "Would add event\n";
    };
}

sub update_event {
    my( $caldav, $href, $event ) = @_;
    if( ! $dryrun ) {
        my $data = meetup_to_icalendar( $event, self => $attendee );
        my $handle = $caldav->UpdateEvent( $href, $data);
    } else {
        print "Would update event\n";
    };
}

sub as_ical( $caldavArgs ) {
    Net::CalDAVTalk->new(url => 'https://example.com')->_argsToVCalendar($caldavArgs)->{entries}->[0]
}

sub ical_prop( $ical, $property ) {
    if( my $p = $ical->property($property)) {
        $p->[0]->value
    } else {
        undef
    }
}

sub entry_is_different( $dav, $meetup, %upstream ) {
#warn "--- meetup";
    my $meetup_ical = as_ical( meetup_to_icalendar( $meetup ));
#warn "--- caldav";
    my $dav_ical = as_ical( $dav );
    #die;

    my %differences;

    my %data = (
        'ical'   => $dav_ical,
        'meetup' => $meetup_ical,
    );
    my %other = (
        'ical'   => 'meetup',
        'meetup' => 'ical',
    );

    for my $attribute (qw( dtstart location )) {
        my $upstream_moniker   = $upstream{ $attribute } || 'meetup';
        my $downstream_moniker = $other{ $upstream_moniker };

        my $upstream = ical_prop( $data{ $upstream_moniker }, $attribute );
        my $local    = ical_prop( $data{ $downstream_moniker }, $attribute );

        # Exclude whitespace changes
        for ($local,$upstream) {
            s!\s+! !g if defined $_;
        };

        if( $local ne $upstream ) {
            #$Data::Dumper::Useqq = 1;
            #warn "Meetup " . Dumper $upstream;
            #warn "DAV    " . Dumper $local;
            verbose( "$attribute has changed from '$local' ($downstream_moniker) to '$upstream' ($upstream_moniker)");
            $differences{ $attribute } = $upstream;
        }
    };



( run in 0.614 second using v1.01-cache-2.11-cpan-f0ff5d10edf )