diff --git a/Modules/Remind.pm b/Modules/Remind.pm index a134631c7ba470e65fed4a19c8adaf316a52225c..0c751f321a1cd9841420b8ff9f4483999675af13 100644 --- a/Modules/Remind.pm +++ b/Modules/Remind.pm @@ -154,19 +154,30 @@ sub parse_string } ); + my $re_during = '(?: during (?<tps_during>\d+)?\s*(?<during>\w+))?'; + my $re_every = '(?:every (?<tps_period>\d+)?\s*(?<period>[^ ]+)' . $re_during . ',? ?)?'; - if($string =~ /^(?:every (\d+)?\s*([^ ]+)(?: during (\d+)?\s*(\w+))?,? ?)?(in (\d+)\s*[^ ]+|([^ ]+ )?at (\d{1,2})[h'](\d{2})?)?(?:\s*:\s*)?\s+(.*)/i) + my $re_in = 'in (?:(?<in_hour>\d{1,2})h(?<in_mins>\d\d)|(?<time_period>\d+)\s*(?<in_period>\w+))'; + my $re_at = '(?<day>[^ ]+ )?at (?<hour>\d{1,2})[h\'](?<minutes>\d{2})?'; + my $re_in_at = '(?<in_or_at>' . $re_in . '|' . $re_at . ')?'; + + my $re_colon = '(?:\s*:\s*)?'; + + if($string =~ /^$re_every$re_in_at$re_colon\s+(?<msg>.*)/i) { - my $tps_period = $1; - my $every = $2; - my $tps_during = $3; - my $period_during = $4; - my $in_or_at = $5; - my $time_period = $6; - my $day = $7; - my $hour = $8; - my $minutes = $9; - my $msg = $10; + my $tps_period = $+{'tps_period'}; + my $every = $+{'period'}; + my $tps_during = $+{'tps_during'}; + my $period_during = $+{'during'}; + my $in_or_at = $+{'in_or_at'}; + my $time_period = $+{'time_period'}; + my $in_period = $+{'in_period'}; + my $in_hour = $+{'in_hour'}; + my $in_mins = $+{'in_mins'}; + my $day = $+{'day'}; + my $hour = $+{'hour'}; + my $minutes = $+{'minutes'}; + my $msg = $+{'msg'}; # Première gestion des erreurs return "You have to define a 'every <period>', a 'in <some time>' or a 'at <hour>h'." @@ -221,14 +232,25 @@ sub parse_string # Gestion du "in" ou du "at" if(defined($in_or_at) && $in_or_at =~ /^in/i) { - return "You have to specify a time number." if(!defined $time_period); - - $in_or_at =~ s/^in (?:\d+ ?)?//; - $sched_infos{"in or at"}{"in"} = "$time_period $in_or_at"; - - return "Period not recognized: '$in_or_at'." if(!is_period($in_or_at)); - - $sched_infos{"sleep time"} = $time_period * &period_to_int($in_or_at); + if(defined($time_period)) + { + $sched_infos{"in or at"}{"in"} = "$time_period $in_period"; + + return "Period not recognized: '$in_period'." unless is_period($in_period); + + $sched_infos{"sleep time"} = $time_period * &period_to_int($in_period); + } + elsif(defined($in_hour)) + { + $sched_infos{"in or at"}{"in"} = "${in_hour}h${in_mins}"; + + $sched_infos{"sleep time"} = $in_hour * &period_to_int("hour"); + $sched_infos{"sleep time"} += $in_mins * &period_to_int("min"); + } + else + { + return "You have to specify a time number."; + } } elsif(defined($in_or_at)) {