#!/usr/bin/perl -w # $Id$ # -*- perl -*- vim: ft=perl sw=4 sts=4 # Brief usage instructions: # Create a ~/.sct6rc that has SID=yourssn and PIN=yourpin # You'll need to change the url below if you go anywhere but TAMUK. # Update: This tool now only outputs in XML. For other formats, convert # with schedproc use strict; use Date::Calc::Object qw(Day_of_Week Decode_Day_of_Week Decode_Month Week_of_Year Monday_of_Week Day_of_Week_Abbreviation Delta_Days Add_Delta_Days Nth_Weekday_of_Month_Year Gmtime Mktime); use Date::Calendar::Profiles qw($Profiles); use Date::Calendar::Year; use HTML::TableExtract; use LWP::UserAgent; use XML::Simple; use vars qw($ua %opts %faculty); my ($response); $opts{'holidays'} = { # %{$Profiles->{'US-TX'}}, "Martin Luther King Day" => "3/Mon/Jan", "Good Friday" => "-2", "Spring Break Monday" => \&Spring_Break, "Spring Break Tuesday" => \&Spring_Break, "Spring Break Wednesday" => \&Spring_Break, "Spring Break Thursday" => \&Spring_Break, "Spring Break Friday" => \&Spring_Break, "Spring Break Saturday" => \&Spring_Break, "Study Day" => "4/Thu/Apr", # ? "Memorial Day" => "5/Mon/May", "Independence Day" => \&US_Independence, "Labor Day" => \&US_Labor, #"Columbus Day" => "2/Mon/Oct", "Thanksgiving Day" => "4/Thu/Nov", "Thanksgiving Friday" => \&Thanksgiving_Friday, }; sub Spring_Break { my($year,$label) = @_; $label =~ s/^Spring Break //; return( Add_Delta_Days( Nth_Weekday_of_Month_Year($year,1,1,1), 7*(11-1) # This is for the 11th Monday of the year +Decode_Day_of_Week($label)-1) ); } sub Thanksgiving_Friday { my($year,$label) = @_; return( Add_Delta_Days(Nth_Weekday_of_Month_Year($year,11,4,4), 1) ); } sub US_Independence # Fourth of July { my($year,$label) = @_; return( &Date::Calendar::Profiles::Nearest_Workday($year,7,4) ); } sub US_Labor # First Monday after the first Sunday in September { my($year,$label) = @_; return( Add_Delta_Days( Nth_Weekday_of_Month_Year($year,9,7,1), +1) ); } my $config = $ENV{HOME} . "/.sct6rc"; if (($ARGV[0] || "") eq '-F') { shift; $config = shift; } my $arg = ""; $arg = shift if (defined($ARGV[0]) && $ARGV[0] =~ /^-\w$/); if (-r $config) { open CONFIG, $config; while() { s/\#.*//; next unless m/^([^=]*)=(.*)/; $opts{$1}=$2; } close CONFIG; } my $domain = $opts{'domain'} || "as1.tamuk.edu:9003"; my $url = "https://$domain/pls/PROD/"; $url = $opts{'url'} if(defined($opts{'url'})); $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; $ua->cookie_jar( {} ); $response = $ua->get("${url}twbkwbis.P_WWWLogin") or die "$!"; $response = $ua->post("${url}twbkwbis.P_ValLogin", { sid => $opts{SID}, PIN => $opts{PIN} }) or die "$!"; my %hiddenjunk; { my $content = $response->content; while($content =~ //gi) { $hiddenjunk{$1} = $2; } } $hiddenjunk{usage_btn} = "Continue"; $response = $ua->post("${url}twbkwbis.P_FirstMenu", \%hiddenjunk); die $response->status_line unless $response->is_success; $response = $ua->get("${url}bwskflib.P_SelDefTerm"); # Valid terms die $response->status_line unless $response->is_success; my @terms = grep {s/^