]> git.somenet.org - irc/bugbot.git/blob - BotModules/Translate.bm
some old base
[irc/bugbot.git] / BotModules / Translate.bm
1 ################################
2 # Translate Module             #
3 ################################
4
5 package BotModules::Translate;
6 use vars qw(@ISA);
7 use WWW::Babelfish;
8
9 # Ah, the previous line looks so innocent. Yet it hides horrible
10 # evil. Yes, this module requires the following:
11 #
12 #    WWW::Babelfish
13 #      libwww (a bundle)
14 #        URI
15 #          MIME-Base64
16 #        HTML::Parser
17 #          HTML-Tagset
18 #        libnet (you probably already have this)
19 #        Digest::MD5
20 #      IO::String
21
22 @ISA = qw(BotModules);
23 1;
24
25 # -- #mozilla was here! --
26 # *** Signoff: techbot_Hixie (~techbot_Hixie@129.59.231.42) has left IRC [Leaving]
27 # <timeless> oops, i killed your techbot
28
29 # RegisterConfig - Called when initialised, should call registerVariables
30 sub RegisterConfig {
31     my $self = shift;
32     $self->SUPER::RegisterConfig(@_);
33     $self->registerVariables(
34       # [ name, save?, settable? ]
35         ['supportedservices', 1, 1, {
36                                      'Babelfish' => '', #Original WWW::Babelfish Service
37                                      'Yahoo' => '', #Available since WWW::Babelfish 0.14
38                                      'Google' => '', #Available since WWW::Babelfish 0.12
39                                      }],
40         ['languages', 1, 1, {
41                              'en' => 'English',
42                              'fr' => 'French',
43                              'de' => 'German',
44                              'it' => 'Italian',
45                              'es' => 'Spanish',
46                              'ar' => 'Arabic',
47                              'zh' => 'Chinese-simp',
48                              'zt' => 'Chinese-trad',
49                              'zh-CN' => 'Chinese (Simp)', #Google-only
50                              'nl' => 'Dutch',
51                              'el' => 'Greek',
52                              'ja' => 'Japanese',
53                              'pt' => 'Portuguese',
54                              'ru' => 'Russian',
55                             }], # short code => Babelfish Language Name
56         ['defaultLanguage', 1, 1, 'en'],
57         ['defaultservice', 1, 1, 'Babelfish'],
58     );
59 }
60
61 sub Help {
62     my $self = shift;
63     my ($event) = @_;
64     my @languages = keys(%{$self->{'languages'}});
65     my @services =  keys(%{$self->{'supportedservices'}});
66     local $";
67     $" = '|';
68     return {
69         '' => 'Translate text between languages using Babelfish or Google.',
70         'translate' => "Syntax: \'translate [using (@services)] [from (@languages)] [to (@languages)] sentence\'",
71         'x' => 'Same as translate.',
72         'languages' => "Returns list of available languages to translate. Syntax: languages [(@services)]"
73     };
74 }
75
76 sub Told {
77     my $self = shift;
78     my ($event, $message) = @_;
79     if ($message =~ /^\s*(?:translate|x)\s+(.*?)\s*$/osi) {
80         $self->Translate($event, $1);
81     } elsif ($message =~ /^\s*languages?(?:\s+(.*?))?\s*(?:[, ]\s*please)?\?*\s*$/osi) {
82         $self->GetLanguages($event, $1);
83     } else {
84         return $self->SUPER::Told(@_);
85     }
86     return 0; # dealt with it...
87 }
88
89 sub translate_do {
90     my $self = shift;
91     my ($event, $service, $lang1, $lang2, $words) = @_;
92     my $translate_babelfish = new WWW::Babelfish('service' => $service);
93     my $result = $translate_babelfish->translate(
94         'source' => $self->{'languages'}->{$lang1},
95         'destination' => $self->{'languages'}->{$lang2},
96         'text' => $words,
97     );
98     if ($result !~ /^ *$/os) {
99         return "$event->{'from'}: $result";
100     } else {
101         my $error = $translate_babelfish->error;
102         if ($error =~ /^ *$/os) {
103             return "$event->{'from'}: I'm afraid I cannot translate that from $self->{'languages'}->{$lang1} to $self->{'languages'}->{$lang2}.";
104         } else {
105             return "$event->{'from'}: $error";
106         }
107     }
108 }
109
110 # ChildCompleted - Called when a child process has quit
111 sub ChildCompleted {
112     my $self = shift;
113     my ($event, $type, $output, @data) = @_;
114     if ($type eq 'babelfish') {
115         $self->say($event, $output);
116     } else {
117         $self->SUPER::ChildCompleted($event, $type, $output, @data);
118     }
119 }
120
121 sub GetLanguages {
122     my $self = shift;
123     my ($event, $rest) = @_;
124     my @services =  keys(%{$self->{'supportedservices'}});
125     my $service = $self->{'defaultservice'};
126     $service = $rest if ($rest);
127
128     my $languages_babelfish = new WWW::Babelfish('service' => $service);
129     $self->say($event,"$event->{'from'}: Available Translation Languages (for $service): " . join(", ", $languages_babelfish->languages)."");
130
131 }
132
133 sub Translate {
134     my $self = shift;
135     my ($event, $rest) = @_;
136     my ($service, $lang1, $lang2, $words) = (
137         $self->{'defaultservice'},
138         $self->{'defaultLanguage'},
139         $self->{'defaultLanguage'},
140     );
141
142     my @services =  keys(%{$self->{'supportedservices'}});
143     my @languages = keys(%{$self->{'languages'}});
144     local $";
145     $" = '|';
146
147     
148     #check service syntax
149     if ($rest =~ /^\s*using\s+(@services)\s+(.+)$/os) {
150         $service = $1 if defined($1);
151         $rest = $2;
152     }
153
154     # check syntax
155     if ($rest =~ /^\s*from\s+(@languages)\s+to\s+(@languages)\s+(.+)$/os) {
156         $lang1 = $1;
157         $lang2 = $2;
158         $words = $3;
159     } elsif ($rest =~ /^\s*to\s+(@languages)\s+from\s+(@languages)\s+(.+)$/os) {
160         $lang2 = $1;
161         $lang1 = $2;
162         $words = $3;
163     } elsif ($rest =~ /^\s*(from|to)\s+(@languages)\s+(.+)$/os) {
164         $lang1 = $2 if $1 eq 'from';
165         $lang2 = $2 if $1 eq 'to';
166         $words = $3;
167     } else {
168         $self->say($event, "$event->{'from'}: Noooo... That\'s not the right syntax at all! Try something like \'translate [using (@services)] [from (@languages)] [to (@languages)] sentence\'");
169         return;
170     }
171
172     # translate
173     if ($lang1 eq $lang2) {
174         $self->say($event, "$event->{'from'}: Erm, well, translating from one language to the same language... doesn't change anything!");
175     } else {
176         $self->spawnChild($event, \&translate_do, [$self, $event, $service, $lang1, $lang2, $words], 'babelfish', []);
177     }
178 }
179