Holiday and exam support for MHC schedule
[tpope-extra.git] / perl / sctweb
index df51173d19423311aa38f32bc9e50ce8ab5fcb85..2cbedd6a2675ec0a6d3a5964b1c42ce149dbac13 100755 (executable)
@@ -44,10 +44,25 @@ sub generate_id {
     return $id;
 }
 
+sub off_for_holidays {
+    $_[3] =~ /(\d\d\d\d)(\d\d)(\d\d)-(\d\d\d\d)(\d\d)(\d\d)/;
+    my $days = (timegm(0,0,0,$6,$5-1,$4) - timegm(0,0,0,$3,$2-1,$1))/3600/24;
+    my @firstday = localtime timelocal(0,0,0,$3,$2-1,$1);
+    my $firstday = sprintf("%04d%02d%02d",($firstday[5]+1900),($firstday[4]+1),$firstday[3]);
+    open(HOLIDAY, "today --category=holiday --date=$firstday+$days|") or return undef;
+    my @holidays=();
+    while(<HOLIDAY>) {
+       next unless /^(\d\d)\/(\d\d) ([A-Z][a-z][a-z])/;
+       my $day=$1.$2;
+       push (@holidays, "!".($firstday[5]+1900).$day) if ($_[1] =~ /\b$3\b/);
+    }
+    return wantarray ? @holidays : "@holidays";
+}
+
 sub off_for_exams {
     $_[3] =~ /\d{8}-(\d\d\d\d)(\d\d)(\d\d)/;
     my @finalday = localtime timelocal(0,0,0,$3,$2-1,$1);
-    return undef unless ($finalday[6] == 0);
+    return wantarray ? () : undef unless ($finalday[6] == 0);
     my $beginning="(08:00-09:15|11:00-12:15|14:00-15:15|17:00-18:15|17:30-18:45|20:00-21:15|20:30-21:45)";
     my $ending   ="(06:30-07:45|09:30-10:45|12:30-13:45|15:30-16:45|18:30-19:45|19:00-20:15)";
     if($_[1] eq "Mon Wed") {
@@ -67,7 +82,7 @@ sub off_for_exams {
            return "!" . ($1-5);
        }
     } else {
-       return "";
+       return wantarray ? () : "";
     }
 }
 
@@ -111,19 +126,82 @@ sub get_schedule_terms {
     return @terms;
 }
 
+sub print_mhc_header {
+my $header = "# Autogenerated by sctweb ".localtime()."\n";
+$header .= <<EOF
+
+X-SC-Subject: New Years Day
+X-SC-Category: Holiday
+X-SC-Cond: 1 Jan
+
+X-SC-Subject: Martin Luther King, Jr. Day
+X-SC-Category: Holiday
+X-SC-Cond: 3rd Mon Jan
+X-SC-Duration: 19861102-
+
+X-SC-Subject: Presidents Day
+X-SC-Category: Holiday
+X-SC-Cond: 3rd Mon Feb
+X-SC-Duration: 17760704-
+
+X-SC-Subject: Memorial Day
+X-SC-Category: Holiday
+X-SC-Cond: Last Mon May
+X-SC-Duration: 17760704-
+
+X-SC-Subject: Independence Day
+X-SC-Category: Holiday
+X-SC-Cond: 4 Jul
+X-SC-Duration: 17760704-
+
+X-SC-Subject: Labor Day
+X-SC-Category: Holiday
+X-SC-Cond: 1st Mon Sep
+
+X-SC-Subject: Columbus Day
+X-SC-Category: Holiday
+X-SC-Cond: 2nd Mon Oct
+
+X-SC-Subject: Veterans Day
+X-SC-Category: Holiday
+X-SC-Cond: 11 Nov
+
+X-SC-Subject: Thanksgiving
+X-SC-Category: Holiday
+X-SC-Cond: 4th Thu Nov
+
+X-SC-Subject: Christmas
+X-SC-Category: Holiday
+X-SC-Cond: 25 Dec
+
+EOF
+;
+    if(defined($_[0])) {
+       open SCHEDULE, (">" . $_[0]);
+       print SCHEDULE $header;
+       close SCHEDULE;
+    } else {
+       print $header;
+    }
+}
+
 sub do_mhc_schedule {
+    $| = 1;
     my @readheaders = ("Section ID/Title", "Days", "Time", "Start/EndDates", "Site/Building/Room");
     my %days = (M => "Mon", T => "Tue", W => "Wed", R => "Thu", F => "Fri", S => "Sat");
     my $te = new HTML::TableExtract( headers => [ @readheaders ] );
-    my (@terms, $row);
+    my (@terms, $row, $file);
+    $file = shift unless (!defined $_[0] or $_[0] =~ /^\d/);
     @terms = get_schedule_terms();
-    foreach(@ARGV || @terms) {
+    print_mhc_header($file);
+    foreach(@_ || @terms) {
        $response = $ua->get("$url&tserve_tip_write=||WID|SID|PIN|Term&tserve_trans_config=" . ($opts{cfg} || "rstusch" || "rgrades") . ".cfg&Term=".($_) );
        die $response->status_line unless $response->is_success;
        $te->parse($response->content);
     }
+    open(STDOUT, ">>" . $file) if(defined($file));
     print "# MHC school schedule\n";
-    print "# Autogenerated by sctweb ".localtime()."\n";
+    #print "# Autogenerated by sctweb ".localtime()."\n";
     foreach $ts ($te->table_states) {
        foreach $row ($ts->rows) {
            map { s/\xa0//g; s/\n/-/g; $_} @$row;
@@ -142,7 +220,16 @@ sub do_mhc_schedule {
            $row->[3] =~ s/(\d\d)-(\d\d)-(\d\d)/20$3$1$2/g;
            $row->[4] =~ s/ON CAMPUS-//g;
            $row->[4] =~ s/-/ /g;
-           my $day = off_for_exams(@$row);
+           my @day = (off_for_holidays(@$row),off_for_exams(@$row));
+           #my $day = join(" ",off_for_holidays(@$row),off_for_exams(@$row));
+           my $day = "";
+           #print "@day*\n";
+           #$day = join(" ",@day) if (@day);
+#          if(defined($day)) {
+#              $day .= " ".off_for_holidays(@$row);
+#          } else {
+#              $day = off_for_holidays(@$row);
+#          }
            print "\n";
            print "# $id\n";
            print "X-SC-Subject: ", $row->[0], "\n";
@@ -150,7 +237,7 @@ sub do_mhc_schedule {
            print "X-SC-Cond: ", $row->[1], "\n";
            print "X-SC-Time: ", $row->[2], "\n";
            print "X-SC-Duration: ", $row->[3], "\n";
-           print("X-SC-Day: ", $day, "\n") if(defined($day));
+           print("X-SC-Day: ", "@day", "\n") if(exists $day[0]);
            print "X-SC-Location: ", $row->[4], "\n";
        }
     }
@@ -223,14 +310,26 @@ sub do_html_grades {
     print "</table>\n";
 }
 
+sub do_transcripts {
+    $response = $ua->get("$url&tserve_tip_write=||WID|SID|PIN&tserve_trans_config=rtranscr.cfg&CareerReqNum=1");
+    foreach (split /\n/, $response->content) {
+       next unless s/^\&nbsp;//;
+       s/<\/?[Hh]\d>//g;
+       print "$_\n";
+    }
+}
+
 if (defined($ARGV[0]) && $ARGV[0] eq "-g") {
     shift;
     do_html_grades;
 } elsif (defined($ARGV[0]) && $ARGV[0] eq "-s") {
     shift;
     do_html_schedule;
-} else {
-    do_mhc_schedule;
+} elsif (defined($ARGV[0]) && $ARGV[0] eq "-m") {
+    shift;
+    do_mhc_schedule(@ARGV);
+} elsif (defined($ARGV[0]) && $ARGV[0] eq "-t") {
+    do_transcripts;
 }
 
 $ua->get("$url&tserve_trans_config=alogout.cfg"); # Logout