#! /usr/bin/perl # $Id: mksched-ics.pl,v 1.1 2006/10/03 19:46:22 jzap Exp $ &main; exit; sub main { &init; &read_files; print "BEGIN:VCALENDAR\n", "VERSION:2.0\n", "METHOD:PUBLISH\n", "PRODID:nhl.jzap.com\n"; &do_games; print "\n", "END:VCALENDAR\n"; } sub read_files { open F, "sched.txt"; while( ) { next unless /^sharks/i; push @sched, $_; } close F; $ngm = @sched; open F, "sched-tv.txt"; while( ) { s/\s+$//; split /\s*\t\s*/; next unless $_[ 1] =~ /^[0-9]+$/; next unless @_ >= 5; $sched_tv[ $ntv++] = $_[ 5]; } close F; $ntv = @sched_tv; die "ngm=$ngm ntv=$ntv not equal" unless $ngm == $ntv; } sub do_games { $duration_min = 150; # game length (150m = 2h30m) $alarm_min = 90; # pre-game pop-up reminders # $game_num = 1; # includes pre-season games # @game_abc = qw( A B C); # pre-season game designations $game_num = 1; # does not include pre-season games # @game_abc = qw( A B C); # pre-season game designations for( $i = 0; $i < @sched; $i++) { $_ = $sched[ $i]; ($teams, $date, $time) = split /\s*\t\s*/; $teams =~ s/vs[.]/vs /i; ($sharks, $atvs, $opponent) = split( ' ', $teams, 3); $opponent =~ s/[ .]+/_/g; ($MM, $DD, $YYYY) = split( /\//, $date); ($hh, $mm, $ss, $ampm) = split( /[ :]+/, $time); $hh -= 12 if $hh >= 12; # 0 <= $hh <= 11 $hh += 12 if $ampm =~ /pm/i; # 0 <= $hh <= 23 # standard time starts 2006 Oct 29, Sunday # daylight savings time starts 2007 March 11, Sunday $is_std_time = $MM == 10 && $DD >= 29 || $MM > 10 || $MM < 3 || $MM == 3 && $DD < 11 || 0; # convert pst/pdt to gmt $hh += 8; # pst $hh -= 1 unless $is_std_time; if( $hh >= 24) { $hh -= 24; $DD += 1; $mday_max = $mday_max[ $MM]; $mday_max += 1 if $MM == 2 && $YYYY % 4 == 0; if( $DD > $mday_max) { $DD = 1; $MM += 1; if( $MM > 12) { $MM = 1; $YYYY += 1; } } } $YYYYMMDD = sprintf( "%04d%02d%02d", $YYYY, $MM, $DD); $hhmmss = sprintf( "%02d%02d%02d", $hh, $mm, $ss); # get team abbreviation $opp_lcase = $opponent; $opp_lcase =~ tr/A-Z/a-z/; $opp_abbr = $team_abbr{ $opp_lcase}; $opponent =~ s/_/ /g; if( $atvs =~ /vs/i) { $game_str = $game_num <= @game_abc ? sprintf( "Gm%s: ", $game_abc[ $game_num++ - 1]) : sprintf( "Gm%d: ", $game_num++ - @game_abc); $sjs = 'SAN JOSE SHARKS'; $san_abbr = 'SAN'; $av = 'v'; $opp_abbr =~ tr/a-z/A-Z/; $location = 'Shark Tank'; } else { $game_str = ''; $sjs = 'San Jose Sharks'; $san_abbr = 'san'; $av = '@'; $location = $opponent; } $tv = @sched_tv[ $i]; $location .= " ($tv)" if length $tv > 0; print "\n", "BEGIN:VEVENT\n", "SUMMARY:$game_str$san_abbr $av $opp_abbr\n", "DESCRIPTION:$game_str$sjs $atvs $opponent\n", "DTSTART:${YYYYMMDD}T${hhmmss}Z\n", "DURATION:PT${duration_min}M\n", "LOCATION:$location\n", "UID:SanJoseSharks$YYYYMMDD$hhmmss\n"; print "BEGIN:VALARM\n", "TRIGGER:-PT${alarm_min}M\n", "ACTION:DISPLAY\n", "DESCRIPTION:$game_str$sjs $atvs $opponent\n", "END:VALARM\n" if $av eq 'v'; print "END:VEVENT\n"; } } sub init { # maximum day of each month # [0]=0, [1..12]=max @mday_max = ( 0, # jan feb mar apr 31, 28, 31, 30, # may jun jul aug 31, 30, 31, 31, # sep oct nov dec 30, 31, 30, 31, ); %team_abbr = ( 'anaheim' => 'ana', 'ana' => 'ana', 'ducks' => 'ana', 'mighty.ducks' => 'ana', 'mighty_ducks' => 'ana', 'atlanta' => 'atl', 'atl' => 'atl', 'thrashers' => 'atl', 'boston' => 'bos', 'bos' => 'bos', 'bruins' => 'bos', 'buffalo' => 'buf', 'buf' => 'buf', 'sabres' => 'buf', 'carolina' => 'car', 'car' => 'car', 'hurricanes' => 'car', 'columbus' => 'cbj', 'cbj' => 'cbj', 'clb' => 'cbj', 'clm' => 'cbj', 'cls' => 'cbj', 'cob' => 'cbj', 'bluejackets' => 'cbj', 'blue.jackets' => 'cbj', 'blue_jackets' => 'cbj', 'calgary' => 'cgy', 'cal' => 'cgy', 'cgy' => 'cgy', 'flames' => 'cgy', 'chicago' => 'chi', 'blackhawks' => 'chi', 'chi' => 'chi', 'colorado' => 'col', 'col' => 'col', 'avalanche' => 'col', 'dallas' => 'dal', 'dal' => 'dal', 'stars' => 'dal', 'detroit' => 'det', 'det' => 'det', 'redwings' => 'det', 'red.wings' => 'det', 'red_wings' => 'det', 'edmonton' => 'edm', 'edm' => 'edm', 'oilers' => 'edm', 'florida' => 'fla', 'fla' => 'fla', 'flo' => 'fla', 'panthers' => 'fla', 'losangeles' => 'los', 'los.angeles' => 'los', 'los_angeles' => 'los', 'la' => 'los', 'lak' => 'los', 'los' => 'los', 'kings' => 'los', 'minnesota' => 'min', 'min' => 'min', 'wild' => 'min', 'montreal' => 'mon', 'mon' => 'mon', 'mtl' => 'mon', 'canadiens' => 'mon', 'nashville' => 'nas', 'nas' => 'nas', 'nsh' => 'nas', 'predators' => 'nas', 'newjersey' => 'njd', 'new.jersey' => 'njd', 'new_jersey' => 'njd', 'nj' => 'njd', 'njd' => 'njd', 'devils' => 'njd', 'nyislanders' => 'nyi', 'ny.islanders' => 'nyi', 'ny_islanders' => 'nyi', 'nyislnders' => 'nyi', 'nyi' => 'nyi', 'islanders' => 'nyi', 'nyrangers' => 'nyr', 'ny.rangers' => 'nyr', 'ny_rangers' => 'nyr', 'nyr' => 'nyr', 'rangers' => 'nyr', 'ottawa' => 'ott', 'ott' => 'ott', 'sens' => 'ott', 'senators' => 'ott', 'philadelphia' => 'phi', 'philadelph' => 'phi', 'phi' => 'phi', 'flyers' => 'phi', 'phoenix' => 'pho', 'pho' => 'pho', 'phx' => 'pho', 'coyotes' => 'pho', 'pittsburgh' => 'pit', 'pit' => 'pit', 'pgh' => 'pit', 'penguins' => 'pit', 'sanjose' => 'san', 'san.jose' => 'san', 'san_jose' => 'san', 'san' => 'san', 'sj' => 'san', 'sjs' => 'san', 'sharks' => 'san', 'stlouis' => 'stl', 'st.louis' => 'stl', 'st_louis' => 'stl', 'stl' => 'stl', 'blues' => 'stl', 'tampabay' => 'tam', 'tampa.bay' => 'tam', 'tampa_bay' => 'tam', 'tam' => 'tam', 'tb' => 'tam', 'tbl' => 'tam', 'lightning' => 'tam', 'toronto' => 'tor', 'tor' => 'tor', 'mapleleafs' => 'tor', 'maple.leafs' => 'tor', 'maple_leafs' => 'tor', 'vancouver' => 'van', 'van' => 'van', 'canucks' => 'van', 'washington' => 'was', 'was' => 'was', 'wsh' => 'was', 'capitals' => 'was', ); }