Changeset 297

Show
Ignore:
Timestamp:
04/16/06 01:17:57 (3 years ago)
Author:
ogawa
Message:

Now supports YAML-type config.
Now correctly handles one-day or banner events.

Location:
cybozu2ical/trunk
Files:
1 added
1 modified

Legend:

Unmodified
Added
Removed
  • cybozu2ical/trunk/cybozu2ical.pl

    r296 r297  
    55 
    66use strict; 
    7 use vars qw($URL $USER $PASS); 
    8  
    9 $URL = 'http://www.example.com/cbag/ag.cgi'; 
    10 $USER = 'user'; 
    11 $PASS = 'pass'; 
    12  
     7use YAML; 
    138use LWP::UserAgent; 
    149use Encode; 
     
    1611use Data::ICal; 
    1712use Data::ICal::Entry::Event; 
     13use Data::ICal::Entry::TimeZone; 
     14use Data::ICal::Entry::TimeZone::Standard; 
    1815use Date::ICal; 
     16 
     17our $VERSION = '0.01'; 
     18 
     19my $cfg = YAML::LoadFile($ARGV[0] || 'config.yaml'); 
    1920 
    2021my $ua = LWP::UserAgent->new(); 
    2122 
    22 my $res = $ua->post($URL . '?page=SyncCalendar', { 
     23my $res = $ua->post($cfg->{cybozu_url} . '?page=SyncCalendar', { 
    2324    _System => 'login', 
    2425    _Login => '1', 
    25     _Account => $USER, 
    26     Password => $PASS, 
     26    _Account => $cfg->{username}, 
     27    Password => $cfg->{password}, 
    2728    'csv' => 1, 
    2829    'notimecard' => 1, 
    2930}); 
    3031 
    31 die "Cannot access Cyboze Office 6 ($URL)." unless $res->is_success; 
     32die "Cannot access Cybozu Office 6 (" . $cfg->{cybozu_url} . ")." 
     33    unless $res->is_success; 
    3234 
    3335my $content = $res->content; 
     
    3739my $csv = Text::CSV_XS->new({ binary => 1 }); 
    3840 
    39 my $calendar = Data::ICal->new(); 
     41my $vcalendar = Data::ICal->new(); 
     42$vcalendar->add_properties( 
     43    prodid => 'Cybozu2ICal', 
     44    version => $VERSION, 
     45    calscale => 'GREGORIAN', 
     46    method => 'PUBLISH' 
     47); 
     48 
     49# current timestamp 
     50my $dtstamp = Date::ICal->new(epoch => time)->ical; 
    4051 
    4152while ($#lines != -1) { 
     
    4455        or die 'failed to parse CSV input.'; 
    4556    my @fields = $csv->fields; 
    46     next if $#fields != 13; # num. of fields 
     57    next if $#fields < 13; # num. of fields 
     58 
     59    my $epoch = $fields[1]; 
     60    $epoch =~ s/ts\.//; 
     61    my $created = Date::ICal->new(epoch => $epoch)->ical; 
    4762 
    4863    my @d = split("/", $fields[3]); 
    49     my %param = ( year => $d[0], month => $d[1], day => $d[2] );  
    50     if ($fields[5] !~ /^:$/) { 
    51         my @t = split(":", $fields[5]); 
    52         $param{hour} = $t[0]; 
    53         $param{min} = $t[1]; 
    54         $param{sec} = $t[2] || 0; 
    55     } 
    56     my $dtstart = Date::ICal->new(%param); 
     64    my @t = split(":", $fields[5]); 
     65    my $date = Date::ICal->new( 
     66        year => $d[0], month => $d[1], day => $d[2], 
     67        hour => $t[0] || 0, min => $t[1] || 0, sec => $t[2] || 0 
     68    ); 
     69    my $dtstart = $date->ical(offset => '+0900'); 
     70    $dtstart =~ s/T000000// if $fields[5] =~ /^:$/; 
    5771 
    5872    my @d = split("/", $fields[4]); 
    59     my %param = ( year => $d[0], month => $d[1], day => $d[2] );  
    60     if ($fields[6] !~ /^:$/) { 
    61         my @t = split(":", $fields[6]); 
    62         $param{hour} = $t[0]; 
    63         $param{min} = $t[1]; 
    64         $param{sec} = $t[2] || 0; 
    65     } 
    66     my $dtend = Date::ICal->new(%param); 
     73    my @t = split(":", $fields[6]); 
     74    my $date = Date::ICal->new( 
     75        year => $d[0], month => $d[1], day => $d[2], 
     76        hour => $t[0] || 0, min => $t[1] || 0, sec => $t[2] || 0 
     77    ); 
     78    $date += 'P1D' if $fields[6] =~ /^:$/; # full-day or multiple-days events 
     79    my $dtend = $date->ical(offset => '+0900'); 
     80    $dtend =~ s/T000000// if $fields[6] =~ /^:$/; 
    6781 
    68     my $event = Data::ICal::Entry::Event->new(); 
    69     $event->add_properties( 
    70                            summary => $fields[12] || '', 
    71                            description => $fields[13] || $fields[12] || '', 
    72                            dtstart => $dtstart->ical, 
    73                            dtend => $dtend->ical, 
    74                            ); 
    75     $calendar->add_entry($event); 
     82    my $vevent = Data::ICal::Entry::Event->new(); 
     83    $vevent->add_properties( 
     84        summary => $fields[12] || '', 
     85        description => $fields[13] || $fields[12] || '', 
     86        dtstart => $dtstart, 
     87        dtend => $dtend, 
     88        dtstamp => $dtstamp, 
     89        created => $created 
     90    ); 
     91 
     92    $vcalendar->add_entry($vevent); 
    7693} 
    7794 
    78 print $calendar->as_string; 
     95my $vtimezone = Data::ICal::Entry::TimeZone->new(); 
     96$vtimezone->add_properties(tzid => 'Asia/Tokyo'); 
     97 
     98my $standard = Data::ICal::Entry::TimeZone::Standard->new(); 
     99$standard->add_properties( 
     100    tzoffsetfrom => '+0900', 
     101    tzoffsetto => '+0900', 
     102    tzname => 'JST', 
     103    dtstart => '19700101T000000' 
     104); 
     105 
     106$vtimezone->add_entry($standard); 
     107$vcalendar->add_entry($vtimezone); 
     108 
     109print $vcalendar->as_string; 
    79110 
    801111;