elsif ($cmd eq "gmt") { my $time = $args->[0]; if (!($time)) { msgout($kernel, $chan, "Current time: " . scalar(gmtime()) . " GMT."); } else { my ($posixtime, $extra, $error) = &parse_whole_date($time); if (defined($posixtime)) { my $firstpart = $time; $firstpart=~s/ *\Q$extra\E$//; my $noparse = ""; if ($extra) { $noparse = " (couldn't parse: '$extra')"; } msgout($kernel, $chan, "'${firstpart}'${noparse} == " . scalar(gmtime($posixtime)) . " GMT."); } else { msgout($kernel, $chan, "Sorry, I couldn't parse that."); } } } # [...] sub parse_whole_date { my ($remaining, $seconds) = @_; if (!(defined($seconds))) { $seconds = time(); } my ($orig_rem, $orig_sec) = ($remaining, $seconds); my ($real_seconds, $message); my ($in_seen, $at_seen, $on_seen) = (0, 0, 0); while (defined($seconds)) { $real_seconds = $seconds; $message = $remaining; my $orig_message = $message; $message =~ s/^at // unless ($at_seen); $message =~ s/^in // unless ($in_seen); $message =~ s/^on // unless ($on_seen); my %options = ( NOW => $seconds, FUZZY => 1, PREFER_FUTURE => 1, ); ($seconds, $remaining) = parsedate($message, %options); if (defined($seconds)) { my $pos = index($orig_message, $remaining); my $parsed = substr($orig_message, 0, $pos); # if ($parsed =~ m/(^| )in /) { $in_seen = 1; } # if ($parsed =~ m/(^| )at /) { $at_seen = 1; } if ($parsed =~ m/^in\b/) { $in_seen = 1; } if ($parsed =~ m/^at\b/) { $at_seen = 1; } if ($parsed =~ m/^on\b/) { $on_seen = 1; } # ADD ME if ($pos == 0) { return ($real_seconds,$orig_message,$remaining); } # END SNIP if ($parsed =~ m/ in $/) { $remaining = "in $remaining"; } if ($parsed =~ m/ at $/) { $remaining = "at $remaining"; } if ($parsed =~ m/ on $/) { $remaining = "on $remaining"; } } $message = $orig_message; } if (($orig_rem eq $message) || ($real_seconds == $orig_sec) || ($real_seconds < 0)) { return (undef, $message, $remaining); } else { return ($real_seconds, $message, $remaining); } }