#!/usr/bin/perl use Getopt::Std; use Schedule::Class; use Time::ParseDate; use POSIX qw( strftime ); use Config::Tiny; use Lojban::Detri; # lojban date/time stuff use strict; my $debug = 1; my %opts; # load the cfg file my $Conf = Config::Tiny->new(); $Conf = Config::Tiny->read("/etc/schedules.conf"); my $basedir = $Conf->{_}->{'basedir'}; my @dow = ('N','M','T','W','R','F','S'); my %dowf = ('N' => "Sunday", 'M' => "Monday", 'T' => "Tuesday", 'W' => "Wednesday", 'R' => "Thursday", 'F' => "Friday", 'S' => "Saturday"); my %dowf_jbo = ('N' => "nondei", 'M' => "pavdei", 'T' => "reldei", 'W' => "cibdei", 'R' => "vondei", 'F' => "mumdei", 'S' => "xavdei"); getopts('lwsTar:t:d:e:u:hj'); our( $opt_h, $opt_l, $opt_u, $opt_r, $opt_a, $opt_d, $opt_t, $opt_e, $opt_w, $opt_T, $opt_s, $opt_j); usage() if $opt_h; my $user = "steve"; $user = $ENV{'USER'} if exists $ENV{'USER'}; $user = $opt_u if defined $opt_u; my %opts = {}; $opts{'term'} = $opt_r if defined $opt_r; my $time = time; my $thisdow = ""; # lojban stuff my $lojban = $opt_j; my $detri; if( $lojban ){ $detri = new Lojban::Detri(); } my $showAll = $opt_a; my $setDate = $opt_d; my $setTime = $opt_t; my $endTime = 0; $endTime = $opt_e if $opt_e; $showAll = $showAll || $setDate || $setTime || $opt_w; if( defined $setDate ){ my $error; ($time, $error) = parsedate( $setDate, PREFER_FUTURE=>1 ); if( $error ){ die "Error parsing specified date, \"$setDate\": $error\n"; } } # allow manual date/time override if( $setTime =~ /(\d{3,})/ ) { $time = $1; } $opts{'date'} = $time; load_schedule( "$basedir/$user.xml", %opts ); # 0 1 2 3 4 5 6 7 8 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time) if $time; $thisdow = $dow[$wday] if $thisdow eq ""; my $thisdowf = $dowf{$thisdow}; if( $showAll ){ # for either a time, or showing all, set the time to 0:0 $time -= $hour * 60 * 60 + $min * 60 + $sec; } if( $setTime =~ /(\d+):(\d+)/ ){ # if it's a time, add the appropriate hours/minutes $time += $1 * 60 * 60 + $2 * 60; $showAll = 0; } ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year += 1900; ## we're y2k compliant! yay! if( $opt_T ){ my @class = get_next($time); unless( @class == 0 ){ if( $lojban ){ print "le bavla'i tercilre cu du la'o gy. $class[1] gy. gi'e ". $detri->temci($class[0]). "\n"; #"$class[0] $class[2]\n"; }else{ my $eng_time = $class[0]; $eng_time =~ s/\-/ to /; print "next class, $class[1], is from $eng_time in $class[2]\n"; } }else{ if( $lojban ){ print "no lo tercilre cu selidne\n"; }else{ print "No more classes.\n"; } } }elsif( $opt_s ){ print "Today's schedule is: \n"; foreach my $class (get_list($time, 0, "")){ my $ctime = @{$class}[0]; $ctime =~ s/\-/ to /; print "@{$class}[1] from $ctime, "; } print "\n"; }elsif( $opt_l ){ my @classes = get_list($time, $time + (60 * 60), ""); if( @classes ){ print "$user should be "; my $min_now = (localtime($time))[1] + (localtime($time))[2] * 60; my $class = @classes[0]; my $nxt_class = @classes[1]; my %info = get_ext_data($class); my ($start, $end) = split /\-/, @{$class}[0]; my $min_start = get_mins_from_time($start); my $min_end = get_mins_from_time($end); if($min_start <= $min_now){ print "at $info{'title'} right now, getting out in ". readable_delta(($min_end - $min_now)*60); }elsif($min_start > $min_now){ print "starting $info{'title'} in ". readable_delta(($min_start - $min_now)*60); } if( $nxt_class ){ my %info = get_ext_data($nxt_class); my ($start, $end) = split /\-/, @{$nxt_class}[0]; my $min_start = get_mins_from_time($start); if($min_start <= $min_now){ print " and at $info{'title'} right now"; }elsif($min_start > $min_now){ print " and then in ". readable_delta(($min_start - $min_now)*60) .", starting $info{'title'}"; } } }else{ print "$user does not currently have any classes"; } print ".\n"; }elsif( $opt_w ){ print "Weekly schedule\n\n"; foreach my $enumday ( @dow ){ print "--$dowf{$enumday}--\n\n"; foreach my $class (get_list(get_next_wday($time, $enumday), "")){ print "@{$class}[0]\t@{$class}[1]\t@{$class}[2]\n"; } print "\n"; } }else{ $min = "0".$min if $min < 10; if( $showAll ){ print "All classes "; }elsif( $endTime != 0 ){ my ($esec,$emin,$ehour) = localtime($endTime); $emin = "0".$emin if $emin < 10; print "Classes between $hour:$min and $ehour:$emin "; }else{ print "Classes after $hour:$min "; } my $date = strftime( "%A, %b %d, %Y", localtime( $time )); print "on $date\n\n"; foreach my $class (get_list($time,$endTime, "")){ print "@{$class}[0]\t@{$class}[1]\t@{$class}[2]\n"; } print "No more classes.\n"; } sub get_mins_from_time($){ my ($time) = @_; my ($h, $m); if( $time =~ /(\d+)\:(\d+)/ ){ ($h, $m) = ($1, $2); } return $h*60+$m; } sub get_next_wday{ # gets the next spec'd day after the time my ($time, $wday) = @_; my $wdayCur = get_dow( $time ); my $wdayNxt = $wday; my $diff = dow_num( $wdayNxt ) - dow_num( $wdayCur ); $diff += 7 if $diff < 0; return $time + 60 * 60 * 24 * $diff; } sub dow_num{ ## gets the index of a day my ($wday) = @_; my $i; for( $i = 0; $i < @dow; $i++ ){ last if $dow[$i] eq uc $wday; } return $i; } sub readable_delta{ my ($delta) = @_; my $diff = ""; my $dy = int($delta / 24 / 60 / 60); my $yr = 0; unless($opt_d){ $dy %= 365; $yr = int($delta / 24 / 60 / 60 / 365); if($yr > 0){ $diff .= "$yr year"; $diff .= "s" if $yr != 1; $diff .= ", "; } } my $hr = ($delta / 60 / 60) % 24; my $mn = ($delta / 60 ) % 60; if($dy > 0){ $diff .= "$dy day"; $diff .= "s" if $dy != 1; $diff .= ", " if $hr || $mn; } if($hr > 0){ $diff .= "$hr hour"; $diff .= "s" if $hr != 1; $diff .= ", " if $mn; } if($mn > 0){ $diff .= "$mn minute"; $diff .= "s" if $mn != 1; } return $diff; } sub usage{ die< EOS }