################################ # Translate Module # ################################ package BotModules::Translate; use vars qw(@ISA); use WWW::Babelfish; # Ah, the previous line looks so innocent. Yet it hides horrible # evil. Yes, this module requires the following: # # WWW::Babelfish # libwww (a bundle) # URI # MIME-Base64 # HTML::Parser # HTML-Tagset # libnet (you probably already have this) # Digest::MD5 # IO::String @ISA = qw(BotModules); 1; # -- #mozilla was here! -- # *** Signoff: techbot_Hixie (~techbot_Hixie@129.59.231.42) has left IRC [Leaving] # oops, i killed your techbot # RegisterConfig - Called when initialised, should call registerVariables sub RegisterConfig { my $self = shift; $self->SUPER::RegisterConfig(@_); $self->registerVariables( # [ name, save?, settable? ] ['languages', 1, 1, { 'en' => 'English', 'fr' => 'French', 'de' => 'German', 'it' => 'Italian', 'es' => 'Spanish', }], # short code => Babelfish Language Name ['defaultLanguage', 1, 1, 'en'], ); } sub Help { my $self = shift; my ($event) = @_; my @languages = keys(%{$self->{'languages'}}); local $"; $" = '|'; return { '' => 'Uses babelfish.altavista.com to translate something.', 'translate' => "Syntax: \'translate [from (@languages)] [to (@languages)] sentence\'", 'x' => 'Same as translate (which see).', }; } sub Told { my $self = shift; my ($event, $message) = @_; if ($message =~ /^\s*(?:translate|x)\s+(.*?)\s*$/osi) { $self->Translate($event, $1); } else { return $self->SUPER::Told(@_); } return 0; # dealt with it... } sub translate_do { my $self = shift; my ($event, $lang1, $lang2, $words) = @_; my $translate_babelfish = new WWW::Babelfish(); my $result = $translate_babelfish->translate( 'source' => $self->{'languages'}->{$lang1}, 'destination' => $self->{'languages'}->{$lang2}, 'text' => $words, ); if ($result !~ /^ *$/os) { return "$event->{'from'}: $result"; } else { my $error = $translate_babelfish->error; if ($error =~ /^ *$/os) { return "$event->{'from'}: I'm afraid I cannot translate that from $self->{'languages'}->{$lang1} to $self->{'languages'}->{$lang2}."; } else { return "$event->{'from'}: $error"; } } } # ChildCompleted - Called when a child process has quit sub ChildCompleted { my $self = shift; my ($event, $type, $output, @data) = @_; if ($type eq 'babelfish') { $self->say($event, $output); } else { $self->SUPER::ChildCompleted($event, $type, $output, @data); } } sub Translate { my $self = shift; my ($event, $rest) = @_; my ($lang1, $lang2, $words) = ( $self->{'defaultLanguage'}, $self->{'defaultLanguage'}, ); my @languages = keys(%{$self->{'languages'}}); local $"; $" = '|'; # check syntax if ($rest =~ /^\s*from\s+(@languages)\s+to\s+(@languages)\s+(.+)$/os) { $lang1 = $1; $lang2 = $2; $words = $3; } elsif ($rest =~ /^\s*to\s+(@languages)\s+from\s+(@languages)\s+(.+)$/os) { $lang2 = $1; $lang1 = $2; $words = $3; } elsif ($rest =~ /^\s*(from|to)\s+(@languages)\s+(.+)$/os) { $lang1 = $2 if $1 eq 'from'; $lang2 = $2 if $1 eq 'to'; $words = $3; } else { $self->say($event, "$event->{'from'}: Noooo... That\'s not the right syntax at all! Try something like \'translate [from (@languages)] [to (@languages)] sentence\'"); return; } # translate if ($lang1 eq $lang2) { $self->say($event, "$event->{'from'}: Erm, well, translating from one language to the same language... doesn't change anything!"); } else { $self->spawnChild($event, \&translate_do, [$self, $event, $lang1, $lang2, $words], 'babelfish', []); } }