Skip to content

Instantly share code, notes, and snippets.

@carlfranz
Last active August 18, 2019 16:07
Show Gist options
  • Select an option

  • Save carlfranz/a34440675430ad21acdcb702f175f6f7 to your computer and use it in GitHub Desktop.

Select an option

Save carlfranz/a34440675430ad21acdcb702f175f6f7 to your computer and use it in GitHub Desktop.
Google Calendar ICAL format - Events generator tool script
#!/usr/bin/perl
# BEGIN:VCALENDAR
# VERSION:2.0
# PRODID:-//hacksw/handcal//NONSGML v1.0//EN
# BEGIN:VEVENT
# DTSTART:20190708T090000+0200
# DTEND:20190708T130000+0200
# SUMMARY:customerkik91
# END:VEVENT
# END:VCALENDAR
use 5.010;
use strict;
use warnings;
our $VERSION = 1.0;
use Data::Dumper;
use DateTime;
use Carp qw( croak );
use Readonly;
################################# VARIABLES ###################################
# Data
my $customer = 'mycustomer';
my $from = '24/05/2019';
my $to = '25/05/2019';
################################ PROGRAM ######################################
# Generate an ICAL
#
# - name of the event = $customer
# - event start date = $from
# - event end date = $to
#
# Two events will be generated for every date one from 9 AM to 1 PM and the
# othe from 2 PM to 6 PM
#
my $date_from = parse_date($from);
my $date_to = parse_date($to);
my $dt1 = DateTime->new($date_from);
my $dt2 = DateTime->new($date_to);
say header() or croak;
my @results = @{ dates( $dt1, $dt2 ) }; # dereferencing!
for my $date (@results) {
my $dt_start = $date->{'dt_start'};
my $dt_end = $date->{'dt_end'};
my $event = qq|BEGIN:VEVENT\n|;
$event = qq|${event}DTSTART:${dt_start}\n|;
$event = qq|${event}DTEND:${dt_end}\n|;
$event = qq|${event}SUMMARY:${customer}\n|;
$event = qq|${event}END:VEVENT|;
say $event or croak;
}
say footer() or croak;
sub header {
my $header = qq|BEGIN:VCALENDAR\nVERSION:2.0|;
$header = qq|$header\nPRODID:-//hacksw/handcal//NONSGML v1.0//EN|;
return $header;
}
sub footer {
my $footer = 'END:VCALENDAR';
return $footer;
}
################################ MODULE #######################################
# Parse a date from standard time 31/12/2019 and returns a DateTime object
# or croaks
#
sub parse_date {
my $str = shift;
my %parsed_date;
my $local_tz = DateTime::TimeZone->new( name => 'local' );
if ( $str =~ qr/(\d{1,2})\/(\d{1,2})\/(\d{4})/mpsx ) {
%parsed_date = ( day => $1, month => $2, year => $3 );
}
else {
croak("Unable to parse date \"$str\"");
}
return \%parsed_date;
}
################################ MODULE #######################################
# Generate an array of dates from 'start' to 'end' formatted MM/DD/YYYY
#
sub dates {
my $start = shift;
my $end = shift;
my @retval = ();
Readonly::Array my @HOURS => ( { b => 9, e => 13 }, { b => 14, e => 18 } );
my $duration = $end->delta_days($start); # difference
while ( $duration->in_units('days') > 0 ) {
foreach my $hour (@HOURS) {
$start->set_time_zone('local');
$start->set_hour( $hour->{'b'} );
my $dt_start = $start->strftime('%Y%m%dT%H%M%S%z');
$start->set_hour( $hour->{'e'} );
my $dt_end = $start->strftime('%Y%m%dT%H%M%S%z');
my $el = {
dt_start => $dt_start,
dt_end => $dt_end
};
push @retval, $el;
}
$duration = $end->subtract_datetime($start);
$start->add( days => 1 );
}
return \@retval;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment