From dc9df6b4e287569eb167b788d195977f884bf3f3 Mon Sep 17 00:00:00 2001 From: "ian%hixie.ch" Date: Sun, 1 Feb 2004 18:55:47 +0000 Subject: [PATCH] Patch by Eira to support times and weight conversions. Reviewed and changed a bit by me. --- webtools/mozbot/BotModules/Converter.bm | 229 +++++++++++++++++++++++- 1 file changed, 225 insertions(+), 4 deletions(-) diff --git a/webtools/mozbot/BotModules/Converter.bm b/webtools/mozbot/BotModules/Converter.bm index e49c40ef22b5..a1b289ac822c 100644 --- a/webtools/mozbot/BotModules/Converter.bm +++ b/webtools/mozbot/BotModules/Converter.bm @@ -10,18 +10,23 @@ use vars qw(@ISA); 1; # XXX support the suffixes "to sf" or "to dp" +# XXX support speed, volume, twips +# XXX support light year, parsec, furlong; fm, pm, µm, Mm, Gm, Tm, Pm +# XXX support 1x10^1 notation as well as the already-supported 1e1 notation sub Help { my $self = shift; my ($event) = @_; return { - '' => 'A generic converter. Currently supports converting between positive integers in binary, octal, decimal and hexidecimal forms, converting temperatures, and converting lengths.', + '' => 'A generic converter. Currently supports converting between positive integers in binary, octal, decimal and hexidecimal forms, and converting temperatures, lengths, times and masses.', 'syntax' => 'To convert a number, simply give the number with units or appropriate prefixes, for example to convert from hexadecimal: \'0x2F\'', 'integers' => 'Decimal: Simply give the number. Hexadecimal: Prefix with 0x. Octal: Prefix with 0. Binary: Prefix with 0b.', 'temperature' => 'Kelvin: Suffix with K. Celsius: Suffix with C. Fahrenheit: Suffix with F.', - 'length' => 'Imperial: in, ft, yd, mi. Metric: A, nm, mm, cm, m, km', # XXX should support light year, parsec, furlong; f, p, n, µ, m, -, k, M, G, T, P - # XXX should support weight, speed, volume, twips - }; + 'length' => 'Imperial: in, ft, yd, mi. Metric: A, nm, mm, cm, m, km.', # XXX should also support light year, parsec, furlong; fm, pm, µm, Mm, Gm, Tm, Pm + 'time' => 'ISO time units: year, month, week, day, hour, minute, second. Exotic time units: millifortnight.', + 'mass' => 'Imperial: lbs, oz, stone. Metric: kg, g.', + # XXX should support speed, volume, twips + }; } @@ -70,7 +75,37 @@ sub Told { $self->convertMeters($event, $1); } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:kms?|kilometers?|kilometres?|klic?ks?)\s*\??\s*$/osi) { $self->convertKilometers($event, $1); + + # times + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:years|year|yr)\s*\??\s*$/osi) { + $self->convertYears($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:months|month|mo)\s*\??\s*$/osi) { + $self->convertMonths($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:weeks|week|wk)\s*\??\s*$/osi) { + $self->convertWeeks($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:fortnights|fortnight|mf)\s*\??\s*$/osi) { + $self->convertMillifortnights($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:days|day|d)\s*\??\s*$/osi) { + $self->convertDays($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:hours|hour|hr|h)\s*\??\s*$/osi) { + $self->convertHours($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:minutes|minute|min)\s*\??\s*$/osi) { + $self->convertMinutes($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:seconds|second|sec|s)\s*\??\s*$/osi) { + $self->convertSeconds($event, $1); + # masses + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:grams|gram|g)\s*\??\s*$/osi) { + $self->convertGrams($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:kilograms|kilogram|kilos|kilo|kg)\s*\??\s*$/osi) { + $self->convertKilograms($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:pounds|pound|lbs)\s*\??\s*$/osi) { + $self->convertPounds($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:ounces|ounce|oz)\s*\??\s*$/osi) { + $self->convertOunces($event, $1); + } elsif ($message =~ m/^\s*(-?(?:[0-9]+\.?|[0-9]+\.[0-9]+|\.[0-9]+)(?:e-?[0-9]+)?)\s*(?:stones|stone)\s*\??\s*$/osi) { + $self->convertStones($event, $1); + # oh well } else { return $self->SUPER::Told(@_); @@ -379,6 +414,192 @@ sub convertKilometers { } +# Time + +sub convertYears { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0 * 60.0 * 24.0 * 365.25; + my $years = sigfig(3, $input); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${years}yr = ${months}mo, ${weeks}wk, ${days}d, ${hours}hr, ${minutes}min, ${seconds}s, ${millifortnights}mf"); +} + +sub convertMonths { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0 * 60.0 * 24.0 * (365.25 / 12); + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $input); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${months}mo = ${years}yr, ${weeks}wk, ${days}d, ${hours}hr, ${minutes}min, ${seconds}s, ${millifortnights}mf"); +} + +sub convertWeeks { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0 * 60.0 * 24.0 * 7.0; + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $input); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${weeks}wk = ${years}yr, ${months}mo, ${days}d, ${hours}hr, ${minutes}min, ${seconds}s, ${millifortnights}mf"); +} + +sub convertMillifortnights { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0 * 60.0 * 24.0 * 7.0 * 2.0 / 1000.0; + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${millifortnights}mf = ${years}yr, ${months}mo, ${weeks}wk, ${days}d, ${hours}hr, ${minutes}min, ${seconds}s"); +} + +sub convertDays { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0 * 60.0 * 24.0; + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${days}d = ${years}yr, ${months}mo, ${weeks}wk, ${hours}hr, ${minutes}min, ${seconds}s, ${millifortnights}mf"); +} + +sub convertHours { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0 * 60.0; + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${hours}hr = ${years}yr, ${months}mo, ${weeks}wk, ${days}d, ${minutes}min, ${seconds}s, ${millifortnights}mf"); +} + +sub convertMinutes { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input * 60.0; + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${minutes}min = ${years}yr, ${months}mo, ${weeks}wk, ${days}d, ${hours}hr, ${seconds}s, ${millifortnights}mf"); +} + +sub convertSeconds { + my $self = shift; + my($event, $input) = @_; + my $accurateSeconds = $input; + my $years = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * 365.25)); + my $months = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / 12))); + my $weeks = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)))); + my $millifortnights = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0 * (365.25 / (365.25 / 7.0)) * 2.0 / 1000.0)); + my $days = sigfig(3, $accurateSeconds / (60.0 * 60.0 * 24.0)); + my $hours = sigfig(3, $accurateSeconds / (60.0 * 60.0)); + my $minutes = sigfig(3, $accurateSeconds / 60.0); + my $seconds = sigfig(3, $accurateSeconds); + $self->say($event, "$event->{'from'}: ${seconds}s = ${years}yr, ${months}mo, ${weeks}wk, ${days}d, ${hours}hr, ${minutes}min, ${millifortnights}mf"); +} + + +# Mass + +sub convertGrams { + my $self = shift; + my($event, $input) = @_; + my $accurateGrams = $input; + my $grams = sigfig(3, $accurateGrams); + my $kgs = sigfig(3, $accurateGrams / 1000.0); + my $ounces = sigfig(3, $accurateGrams * 0.03527); + my $pounds = sigfig(3, $accurateGrams * 0.002205); + my $stones = sigfig(3, $accurateGrams * 0.00016); + $self->say($event, "$event->{'from'}: ${grams}g = ${kgs}kg, ${ounces}oz, ${pounds}lbs, ${stones}stone"); +} + +sub convertKilograms { + my $self = shift; + my($event, $input) = @_; + my $accurateGrams = $input * 1000.0; + my $grams = sigfig(3, $accurateGrams); + my $kgs = sigfig(3, $input); + my $ounces = sigfig(3, $accurateGrams * 0.03527); + my $pounds = sigfig(3, $accurateGrams * 0.002205); + my $stones = sigfig(3, $accurateGrams * 0.00016); + $self->say($event, "$event->{'from'}: ${kgs}kg = ${grams}g, ${ounces}oz, ${pounds}lbs, ${stones}stone"); +} + +sub convertPounds { + my $self = shift; + my($event, $input) = @_; + my $accurateGrams = $input * 453.6; + my $grams = sigfig(3, $accurateGrams); + my $kgs = sigfig(3, $accurateGrams / 1000.0); + my $ounces = sigfig(3, $accurateGrams * 0.03527); + my $pounds = sigfig(3, $input); + my $stones = sigfig(3, $accurateGrams * 0.00016); + $self->say($event, "$event->{'from'}: ${pounds}lbs = ${grams}g, ${kgs}kg, ${ounces}oz, ${stones}stone"); +} + +sub convertOunces { + my $self = shift; + my($event, $input) = @_; + my $accurateGrams = $input * 28.35; + my $grams = sigfig(3, $accurateGrams); + my $kgs = sigfig(3, $accurateGrams / 1000.0); + my $ounces = sigfig(3, $input); + my $pounds = sigfig(3, $accurateGrams * 0.002205); + my $stones = sigfig(3, $accurateGrams * 0.00016); + $self->say($event, "$event->{'from'}: ${ounces}oz = ${grams}g, ${kgs}kg, ${pounds}lbs, ${stones}stone"); +} + +sub convertStones { + my $self = shift; + my($event, $input) = @_; + my $accurateGrams = $input * 6350.3; + my $grams = sigfig(3, $accurateGrams); + my $kgs = sigfig(3, $accurateGrams / 1000.0); + my $ounces = sigfig(3, $accurateGrams * 0.03527); + my $pounds = sigfig(3, $accurateGrams * 0.002205); + my $stones = sigfig(3, $accurateGrams * 0.00016); + $self->say($event, "$event->{'from'}: ${stones}stone = ${grams}g, ${kgs}kg, ${ounces}oz, ${pounds}lbs"); +} + + # Utility Functions sub round($$) {