package VladimirBot::Schedule; use strict; use Date::Manip; # Here I push myself onto the module call stack push @VladimirBot::vladimir_module, 'Schedule'; # Parse a sentence or decide its not for me sub parse { my $sentence = shift; if($sentence =~ /what \s am \s i \s doing \s between \s (.*) \s and \s (.*?)\??$/ix) { my $from = $1; my $to = $2; my $events = with_repeat_events($from,$to); my $e = render_events($events); return "Here is your schedule from $from to $to:\n$e"; }elsif( $sentence =~ / what \s ( am \s i \s doing (\s on|\s for)? | am \s i \s supposed \s to \s do | is \s on \s my \s schedule | is \s going \s on | is \s happening) \s (.*?)\??$' => /ix ) { my $at = $3; #my $events = Events_List($at,$at); my $events = with_repeat_events($at); my $e = render_events($events); return "schedule for: $at - " . UnixDate($at, "%Y %B %E (%a), %H:%M") . "\nEvents:\n$e"; } else { return 0; } } =cut if($sentence =~ /schedule/i) { my $events = with_repeat_events('today', 'next week'); my $e = render_events($events); my $out = "Here is your schedule from today to next week:\n$e"; return $out; } else { return 0; } } =cut sub render_events { my $events = shift; #print "DEBUG: " . Dumper($events); my $out = ''; my %events = @{$events}; my %day_events; foreach my $day (sort keys %events) { my $the_date = UnixDate($day,"%Y %B %E (%a)"); my $the_time = UnixDate($day,'%I:%M %p'); push @{$day_events{$the_date}{$the_time}}, @{$events{$day}}; } foreach my $day (sort keys %day_events) { $out .= "$day\n"; foreach my $the_time (sort keys %{$day_events{$day}}) { $out .= " $the_time: "; foreach my $event (@{$day_events{$day}{$the_time}}) { $out .= "$event;"; } $out .= "\n"; } } # $out .= UnixDate($day, " %Y %B %E (%a), %H:%M") . ":\n"; # my $stuff = $events{$day}; # my @stuff = @{$stuff}; # foreach my $event (@stuff) # { # $out .= " $event\n"; # } #} return $out; } sub with_repeat_events { my ($rec, $del1, $del2, $name); my $date1 = shift; $date1 = ParseDate($date1); my $date2 = shift; if(!$date2) { $date2=DateCalc($date1,"+0:0:0:1:0:0:0"); } my $event_list = Events_List($date1, $date2); # Lets turn $event_list into a hash my @tmp = @{$event_list}; my %ret; while(@tmp) { my $a = shift @tmp; my $b = shift @tmp; $ret{$a} = $b; } @tmp = @{$Date::Manip::Events{recur}}; while (@tmp) { my $date1_tmp = $date1; my $date2_tmp = $date2; my @dates = (); my $rec = shift @tmp; my $del1 = shift @tmp; my $del2 = shift @tmp; my $name = shift @tmp; my ($recur0,$recur1,$flags,$dateb,$d0,$d1)=Date::Manip::Recur_Split($rec); $date1_tmp = $d0 if($d0 && Date_Cmp($date1_tmp,$d0) < 0); $date2_tmp = $d1 if($d1 && Date_Cmp($date2_tmp,$d1) > 0); @dates = ParseRecur($rec,$date1_tmp,$date1_tmp,$date2_tmp); foreach my $d (@dates) { push @{$ret{$d}}, $name; } } # Sort them AND take into account the "!$name" entries. my(%tmp,$date,@tmp2,@ret,@d, $tmp); @d=sort { &Date_Cmp($a,$b) } keys %ret; foreach $date (@d) { my %tmp; @tmp=@{ $ret{$date} }; @tmp2=(); foreach $tmp (@tmp) { push(@tmp2,$tmp), next if ($tmp =~ /^!/); $tmp{$tmp}=1; } foreach $tmp (@tmp2) { $tmp =~ s/^!//; delete $tmp{$tmp}; } push(@ret,$date,[ keys %tmp ]); } return \@ret; }