# requires Ruby/DICT <http://www.caliban.org/ruby/ruby-dict.shtml>
-require 'dict'
+begin
+ require 'dict'
+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'
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.
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])}
# 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|
).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],
)
}.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
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