]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/dictclient.rb
quiz: stop quizzes and timers on cleanup
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / dictclient.rb
index 53c1f7c0f154268e053b8f1005a521c3e3b2afa3..f55defa42cdd3ee261769696c7633394409d9062 100644 (file)
 
 
 # requires Ruby/DICT <http://www.caliban.org/ruby/ruby-dict.shtml>
-require 'dict'
+begin
+  require 'dict'
+  class ::DICTError
+    def initialize(msg, code = 1)
+      super(msg)
+    end
+  end
+rescue LoadError
+  raise LoadError, "Ruby/DICT not found, grab it from http://www.caliban.org/ruby/ruby-dict.shtml"
+end
 
 class ::String
   # Returns a new string truncated to length 'to'
@@ -42,42 +51,47 @@ class ::Definition
   end
 
   def body
-    definition[1..-1].join.gsub(/\s+/, ' ').strip
+    # two or more consecutive newlines are replaced with double spaces, while single
+    # newlines are replaced with single spaces
+    lb = /\r?\n/
+    definition[1..-1].join.
+      gsub(/\s*(:#{lb}){2,}\s*/, '  ').
+      gsub(/\s*#{lb}\s*/, ' ').strip
   end
 end
 
 class DictClientPlugin < Plugin
-  BotConfig.register BotConfigStringValue.new('dictclient.server',
+  Config.register Config::StringValue.new('dictclient.server',
     :default => 'dict.org',
-    :desc => 'Hostname or hostname:port of the DICT server used to lookup words')
-  BotConfig.register BotConfigIntegerValue.new('dictclient.max_defs_before_collapse',
+    :desc => _('Hostname or hostname:port of the DICT server used to lookup words'))
+  Config.register Config::IntegerValue.new('dictclient.max_defs_before_collapse',
     :default => 4,
-    :desc => 'When multiple databases reply a number of definitions that above this limit, only the database names will be listed. Otherwise, the full definitions from each database are replied')
-  BotConfig.register BotConfigIntegerValue.new('dictclient.max_length_per_def',
+    :desc => _('When multiple databases reply a number of definitions that above this limit, only the database names will be listed. Otherwise, the full definitions from each database are replied'))
+  Config.register Config::IntegerValue.new('dictclient.max_length_per_def',
     :default => 200,
-    :desc => 'Each definition is truncated to this length') 
-  BotConfig.register BotConfigStringValue.new('dictclient.headword_format',
+    :desc => _('Each definition is truncated to this length'))
+  Config.register Config::StringValue.new('dictclient.headword_format',
     :default => "#{Bold}<headword>#{Bold}",
-    :desc => 'Format of headwords; <word> will be replaced with the actual word')
-  BotConfig.register BotConfigStringValue.new('dictclient.database_format',
+    :desc => _('Format of headwords; <word> will be replaced with the actual word'))
+  Config.register Config::StringValue.new('dictclient.database_format',
     :default => "#{Underline}<database>#{Underline}",
-    :desc => 'Format of database names; <database> will be replaced with the database name')
-  BotConfig.register BotConfigStringValue.new('dictclient.definition_format',
+    :desc => _('Format of database names; <database> will be replaced with the database name'))
+  Config.register Config::StringValue.new('dictclient.definition_format',
     :default => '<headword>: <definition> -<database>',
-    :desc => 'Format of definitions. <word> will be replaced with the formatted headword, <def> will be replaced with the truncated definition, and <database> with the formatted database name')
-  BotConfig.register BotConfigStringValue.new('dictclient.match_format',
+    :desc => _('Format of definitions. <word> will be replaced with the formatted headword, <def> will be replaced with the truncated definition, and <database> with the formatted database name'))
+  Config.register Config::StringValue.new('dictclient.match_format',
     :default => '<matches>––<database>',
-    :desc => 'Format of match results. <matches> will be replaced with the formatted headwords, <database> with the formatted database name')
-  
+    :desc => _('Format of match results. <matches> will be replaced with the formatted headwords, <database> with the formatted database name'))
+
   def initialize
     super
   end
-  
+
   # create a DICT object, which is passed to the block. after the block finishes,
   # the DICT object is automatically disconnected. the return value of the block
   # is returned from this method.
   # if an IRC message argument is passed, the error message will be replied
-  def with_dict(m=nil &block)
+  def with_dict(m=nil, &block)
     server, port = @bot.config['dictclient.server'].split ':' if @bot.config['dictclient.server']
     server ||= 'dict.org'
     port ||= DICT::DEFAULT_PORT
@@ -87,23 +101,23 @@ class DictClientPlugin < Plugin
       ret = yield dict
       dict.disconnect
     rescue ConnectError
-      m.reply 'An error occured connecting to the DICT server. Check the dictclient.server configuration or retry later' if m
+      m.reply _('An error occured connecting to the DICT server. Check the dictclient.server configuration or retry later') if m
     rescue ProtocolError
-      m.reply 'A protocol error occured' if m
+      m.reply _('A protocol error occured') if m
     rescue DICTError
-      m.reply 'An error occured' if m
+      m.reply _('An error occured') if m
     end
     ret
   end
-  
+
   def format_headword(w)
     @bot.config['dictclient.headword_format'].gsub '<headword>', w
   end
-    
+
   def format_database(d)
     @bot.config['dictclient.database_format'].gsub '<database>', d
   end
-  
+
   def cmd_define(m, params)
     phrase = params[:phrase].to_s
     results = with_dict(m) {|d| d.define(params[:database], params[:phrase])}
@@ -113,10 +127,10 @@ class DictClientPlugin < Plugin
         # the number of definitions is above dictclient.max_defs_before_collapse
         if results.any? {|r| r.database != results[0].database} &&
            results.length > @bot.config['dictclient.max_defs_before_collapse']
-          "Definitions for #{format_headword phrase} were found in #{
-            results.collect {|r| r.database}.uniq.collect {|d|
-              format_database d}.join ', '
-          }. Specify database to view full result."
+          _("Many definitions for %{phrase} were found in %{databases}. Use 'define <phrase> from <database> to view a definition.") %
+          { :phrase => format_headword(phrase),
+            :databases => results.collect {|r| r.database}.uniq.
+                                  collect {|d| format_database d}.join(', ') }
         # otherwise display the definitions
         else
           results.collect {|r|
@@ -127,15 +141,16 @@ class DictClientPlugin < Plugin
             ).gsub(
               '<definition>', r.body.truncate(@bot.config['dictclient.max_length_per_def'])
             )
-          }.join ' '
+          }.join ' '
         end
       else
-        "No definition for #{format_headword phrase} found from #{
-          format_database params[:database]}."
+        _("No definition for %{phrase} found from %{database}.") %
+          { :phrase => format_headword(phrase),
+            :database => format_database(params[:database]) }
       end
     )
   end
-  
+
   def cmd_match(m, params)
     phrase = params[:phrase].to_s
     results = with_dict(m) {|d| d.match(params[:database],
@@ -144,36 +159,47 @@ class DictClientPlugin < Plugin
       if results
         results.collect {|database, matches|
           @bot.config['dictclient.match_format'].gsub(
-            '<matches>', matches.collect {|m| format_headword m}.join(', ')
+            '<matches>', matches.collect {|hit| format_headword hit}.join(', ')
           ).gsub(
             '<database>', format_database(database)
           )
         }.join ' '
       else
-        "Nothing matched for #{format_headword phrase
-        } from #{format_database params[:database]} using #{params[:strategy]}"
+        _("Nothing matched %{query} from %{database} using %{strategy}") %
+        { :query => format_headword(phrase),
+          :database => format_database(params[:database]),
+          :strategy => params[:strategy] }
       end
     )
   end
-    
+
   def cmd_databases(m, params)
     with_dict(m) do |d|
-      m.reply "Databases: #{
-        d.show_db.collect {|db, d|"#{format_database db}: #{d}"}.join '; '
-      }"
+      m.reply _("Databases: %{list}") % {
+        :list => d.show_db.collect {|db, des| "#{format_database db}: #{des}"}.join(' | ')
+      }
     end
   end
-  
+
   def cmd_strategies(m, params)
     with_dict(m) do |d|
-      m.reply "Strategies: #{
-        d.show_strat.collect {|s, d| "#{s}: #{d}"}.join '; '
-      }"
+      m.reply _("Strategies: %{list}") % {
+        :list => d.show_strat.collect {|s, des| "#{s}: #{des}"}.join(' | ')
+      }
     end
   end
-    
+
   def help(plugin, topic='')
-    "define <phrase> [from <database>] => Show definition of a phrase; match <phrase> [using <strategy>] [from <database>] => Show matching phrases; dictclient databases => List databases; dictclient strategies => List strategies"
+    case topic
+    when 'define'
+      _('define <phrase> [from <database>] => Show definition of a phrase')
+    when 'match'
+      _('match <phrase> [using <strategy>] [from <database>] => Show phrases matching the given pattern')
+    when 'server information'
+      _('dictclient databases => List databases; dictclient strategies => List strategies')
+    else
+      _('look up phrases on the configured DICT server. topics: define, match, server information')
+    end
   end
 end
 
@@ -181,12 +207,14 @@ plugin = DictClientPlugin.new
 
 plugin.map 'define *phrase [from :database]',
            :action => 'cmd_define',
-           :defaults => {:database => DICT::ALL_DATABASES}
+           :defaults => {:database => DICT::ALL_DATABASES},
+           :threaded => true
 
 plugin.map 'match *phrase [using :strategy] [from :database]',
            :action => 'cmd_match',
            :defaults => {:database => DICT::ALL_DATABASES,
-                         :strategy => DICT::DEFAULT_MATCH_STRATEGY }
+                         :strategy => DICT::DEFAULT_MATCH_STRATEGY },
+           :threaded => true
 
-plugin.map 'dictclient databases', :action => 'cmd_databases'
-plugin.map 'dictclient strategies', :action => 'cmd_strategies'
\ No newline at end of file
+plugin.map 'dictclient databases', :action => 'cmd_databases', :thread => true
+plugin.map 'dictclient strategies', :action => 'cmd_strategies', :thread => true