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 )