summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorYaohan Chen <yaohan.chen@gmail.com>2010-05-21 15:59:29 -0400
committerYaohan Chen <yaohan.chen@gmail.com>2010-05-21 16:10:31 -0400
commit027b6965f5abf5d05a95d4dc627f19a71b7a7076 (patch)
tree2fa7911bba8b32e82c3bc39b970bd2b4d9617cfd /data
parent43fe51c5e5bfc40a6db95f3d4ee93958ed1081a2 (diff)
translator: connect to sites only when necessary
Previously the translation services in the plugin would connect to their respective websites on initialize. Now they will only do this when the first time they are used. WorldLingo still connects on initialialize in order to list the supported language pairs, but the Mechanize object is not saved here, so the connection should be closed after initialize, and only reopened if translation by WorldLingo is requested later. Previously the services are assumed to fail if they raise any Exception in initialize, and in that case the service is disabled, and its command as well as the help translate [failed] commands state this. Now this exception catch is done for any do_translate method call.
Diffstat (limited to 'data')
-rw-r--r--data/rbot/plugins/translator.rb80
1 files changed, 45 insertions, 35 deletions
diff --git a/data/rbot/plugins/translator.rb b/data/rbot/plugins/translator.rb
index 6b87476c..9fb74e8a 100644
--- a/data/rbot/plugins/translator.rb
+++ b/data/rbot/plugins/translator.rb
@@ -110,12 +110,12 @@ class NiftyTranslator < Translator
def initialize(cache={})
require 'mechanize'
super(Translator::Direction.all_from_to(%w[ja en zh_CN ko], %w[ja]), cache)
- @form = WWW::Mechanize.new.
- get('http://nifty.amikai.com/amitext/indexUTF8.jsp').
- forms_with(:name => 'translateForm').last
end
def do_translate(text, from, to)
+ @form ||= WWW::Mechanize.new.
+ get('http://nifty.amikai.com/amitext/indexUTF8.jsp').
+ forms_with(:name => 'translateForm').last
@radio = @form.radiobuttons_with(:name => 'langpair').first
@radio.value = "#{from},#{to}".upcase
@radio.check
@@ -215,16 +215,18 @@ class BabelfishTranslator < Translator
def initialize(cache)
require 'mechanize'
-
- @form = WWW::Mechanize.new.get('http://babelfish.altavista.com/babelfish/').
- forms_with(:name => 'frmTrText').first
- @lang_list = @form.fields_with(:name => 'lp').first
- language_pairs = @lang_list.options.map {|o| o.value.split('_')}.
- reject {|p| p.empty?}
+ form = WWW::Mechanize.new.get('http://babelfish.altavista.com/babelfish/').
+ forms_with(:name => 'frmTrText').first
+ lang_list = form.fields_with(:name => 'lp').first
+ language_pairs = lang_list.options.map {|o| o.value.split('_')}.
+ reject {|p| p.empty?}
super(Translator::Direction.pairs(language_pairs), cache)
end
def do_translate(text, from, to)
+ @form ||= WWW::Mechanize.new.get('http://babelfish.altavista.com/babelfish/').
+ forms_with(:name => 'frmTrText').first
+
if @form.fields_with(:name => 'trtext').empty?
@form.add_field!('trtext', text)
else
@@ -278,17 +280,10 @@ class TranslatorPlugin < Plugin
@failed_translators = []
@translators = {}
TRANSLATORS.each_pair do |name, c|
- begin
+ watch_for_fail(name) do
@translators[name] = c.new(@registry.sub_registry(name))
map "#{name} :from :to *phrase",
:action => :cmd_translate, :thread => true
- rescue Exception
- @failed_translators << { :name => name, :reason => $!.to_s }
-
- warning _("Translator %{name} cannot be used: %{reason}") %
- {:name => name, :reason => $!}
- map "#{name} [*args]", :action => :failed_translator,
- :defaults => {:name => name, :reason => $!}
end
end
@@ -300,6 +295,19 @@ class TranslatorPlugin < Plugin
update_default
end
+ def watch_for_fail(name, &block)
+ begin
+ yield
+ rescue Exception
+ @failed_translators << { :name => name, :reason => $!.to_s }
+
+ warning _("Translator %{name} cannot be used: %{reason}") %
+ {:name => name, :reason => $!}
+ map "#{name} [*args]", :action => :failed_translator,
+ :defaults => {:name => name, :reason => $!}
+ end
+ end
+
def failed_translator(m, params)
m.reply _("Translator %{name} cannot be used: %{reason}") %
{:name => params[:name], :reason => params[:reason]}
@@ -385,25 +393,27 @@ class TranslatorPlugin < Plugin
translator = @translators[tname]
from, to, phrase = params[:from], params[:to], params[:phrase].to_s
if translator
- begin
- translation = Timeout.timeout(@bot.config['translator.timeout']) do
- translator.translate(phrase, from, to)
+ watch_for_fail(tname) do
+ begin
+ translation = Timeout.timeout(@bot.config['translator.timeout']) do
+ translator.translate(phrase, from, to)
+ end
+ m.reply(if params[:show_provider]
+ _('%{translation} (provided by %{translator})') %
+ {:translation => translation, :translator => tname.gsub("_", " ")}
+ else
+ translation
+ end)
+
+ rescue Translator::UnsupportedDirectionError
+ m.reply _("%{translator} doesn't support translating from %{source} to %{target}") %
+ {:translator => tname, :source => from, :target => to}
+ rescue Translator::NoTranslationError
+ m.reply _('%{translator} failed to provide a translation') %
+ {:translator => tname}
+ rescue Timeout::Error
+ m.reply _('The translator timed out')
end
- m.reply(if params[:show_provider]
- _('%{translation} (provided by %{translator})') %
- {:translation => translation, :translator => tname.gsub("_", " ")}
- else
- translation
- end)
-
- rescue Translator::UnsupportedDirectionError
- m.reply _("%{translator} doesn't support translating from %{source} to %{target}") %
- {:translator => tname, :source => from, :target => to}
- rescue Translator::NoTranslationError
- m.reply _('%{translator} failed to provide a translation') %
- {:translator => tname}
- rescue Timeout::Error
- m.reply _('The translator timed out')
end
else
m.reply _('No translator called %{name}') % {:name => tname}