LINUX.ORG.RU
ФорумAdmin

Выполнять задачи по событиям календаря

 , , , ,


2

4

Хотелось бы тулзу, которой бы можно было скормить caldav url, а она бы на каждое событие дергала скрипт и скармливала ему ics.

Есть ли такое или что-то из чего можно это навелосипедить с минимальным количеством кода?

★★★★★

Сделал простой скрипт на perl + iCal::Parser, который запускается по крону раз в час и шлёт события.

iCal::Parser умеет разворачивать повторяющиеся события и обновлять отдельные вхождения, т.е. почти всё, что было нужно.

#!/usr/bin/perl -w

#
# Шлет события текущего часа из vcalendar-файла на почту
# Usage:
#   $0 <vcalendar-file> <email>
#

use utf8;
use iCal::Parser;
use DateTime;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;

my $from = "owncloud@example.com";

if(scalar @ARGV < 2)
{
	print "$0 <ics-file> <email>\n";
	exit 1;
}

my $now = DateTime->now(time_zone => 'local');
my $email = $ARGV[1];
my $parser=iCal::Parser->new();
my $hash;
$hash=$parser->parse($ARGV[0]);
my $events = $hash->{events}->{$now->year}->{$now->month}->{$now->day};

foreach $uid (keys %$events)
{
	my $event = $events->{$uid};
	if(defined $event->{'VALARM'})
	{
		my $dt = $event->{'DTSTART'};
		if($now->hour == $dt->hour)
		{
			print "sending ".$event->{'SUMMARY'}."\n";

			my $subj = $event->{'SUMMARY'};
			$subj = "" if !defined $subj;
			$subj =~ s/\\,/,/g;

			my $body = $event->{'DESCRIPTION'};
			$body = "" if !defined $body;
			$body =~ s/\\,/,/g;

			my $loc = $event->{'LOCATION'};
			$loc = "" if !defined $loc;
			$loc =~ s/\\,/,/g;

			my $message = Email::Simple->create(
			  header => [
			    From    => $from,
			    To      => $email,
			    Subject => '[reminder]'.$subj,
			  ],
			  body => "Description:\n".$body."\nLocation:\n".$loc,
			);
			sendmail($message);
		}
	}
}
sergej ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.