]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/dict.rb
Plugin header boilerplating.
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / dict.rb
1 #-- vim:sw=2:et\r
2 #++\r
3 #\r
4 # :title: Dictionary lookup plugin for rbot\r
5 #\r
6 # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>\r
7 # Copyright:: (C) 2006-2007 Giuseppe Bilotta\r
8 # License:: GPL v2\r
9 #\r
10 # Provides a link to the definition of a word in one of the supported\r
11 # dictionaries. Currently available are\r
12 #   * the Oxford dictionary for (British) English\r
13 #   * the De Mauro/Paravia dictionary for Italian\r
14 #   * the Chambers dictionary for English (accepts both US and UK)\r
15 #\r
16 # Other plugins can use this one to check if a given word is valid in italian\r
17 # or english by using the is_italian?/is_british?/is_english? methods\r
18 #\r
19 # TODO: cache results and reuse them if get_cached returns a cache copy\r
20 \r
21 require 'uri'\r
22 \r
23 DEMAURO_LEMMA = /<anchor>(.*?)(?: - (.*?))<go href="lemma.php\?ID=(\d+)"\/><\/anchor>/\r
24 \r
25 class DictPlugin < Plugin\r
26   BotConfig.register BotConfigIntegerValue.new('dict.hits',\r
27     :default => 3,\r
28     :desc => "Number of hits to return from a dictionary lookup")\r
29   BotConfig.register BotConfigIntegerValue.new('dict.first_par',\r
30     :default => 0,\r
31     :desc => "When set to n > 0, the bot will return the first paragraph from the first n dictionary hits")\r
32 \r
33   def initialize\r
34     super\r
35     @dmurl = "http://www.demauroparavia.it/"\r
36     @dmwapurl = "http://wap.demauroparavia.it/index.php?lemma=%s"\r
37     @dmwaplemma = "http://wap.demauroparavia.it/lemma.php?ID=%s"\r
38     @oxurl = "http://www.askoxford.com/concise_oed/%s"\r
39     @chambersurl = "http://www.chambersharrap.co.uk/chambers/features/chref/chref.py/main?query=%s&title=21st"\r
40   end\r
41 \r
42 \r
43   def help(plugin, topic="")\r
44     case topic\r
45     when "demauro"\r
46       return "demauro <word> => provides a link to the definition of <word> from the De Mauro/Paravia dictionary"\r
47     when "oxford"\r
48       return "oxford <word> => provides a link to the definition of <word> (it can also be an expression) from the Concise Oxford dictionary"\r
49     when "chambers"\r
50       return "chambers <word> => provides a link to the definition of <word> (it can also be an expression) from the Chambers 21st Century Dictionary"\r
51     end\r
52     return "<dictionary> <word>: check for <word> on <dictionary> where <dictionary> can be one of: demauro, oxford, chambers"\r
53   end\r
54 \r
55   def demauro(m, params)\r
56     justcheck = params[:justcheck]\r
57 \r
58     word = params[:word].downcase\r
59     url = @dmwapurl % URI.escape(word)\r
60     xml = @bot.httputil.get_cached(url)\r
61     if xml.nil?\r
62       info = @bot.httputil.last_response\r
63       info = info ? " (#{info.code} - #{info.message})" : ""\r
64       return false if justcheck\r
65       m.reply "An error occurred while looking for #{word}#{info}"\r
66       return\r
67     end\r
68     if xml=~ /Non ho trovato occorrenze per/\r
69       return false if justcheck\r
70       m.reply "Nothing found for #{word}"\r
71       return\r
72     end\r
73     entries = xml.scan(DEMAURO_LEMMA)\r
74     text = word\r
75     urls = []\r
76     if !entries.assoc(word) and !entries.assoc(word.upcase)\r
77       return false if justcheck\r
78       text += " not found. Similar words"\r
79     end\r
80     return true if justcheck\r
81     text += ": "\r
82     n = 0\r
83     hits = @bot.config['dict.hits']\r
84     text += entries[0...hits].map { |ar|\r
85       n += 1\r
86       urls << @dmwaplemma % ar[2]\r
87       "#{n}. #{Bold}#{ar[0]}#{Bold} - #{ar[1].gsub(/<\/?em>/,'')}: #{@dmurl}#{ar[2]}"\r
88     }.join(" | ")\r
89     m.reply text\r
90 \r
91     first_pars = @bot.config['dict.first_par']\r
92 \r
93     return unless first_pars > 0\r
94 \r
95     Utils.get_first_pars urls, first_pars, :http_util => @bot.httputil, :message => m,\r
96       :strip => /^\S+\s+-\s+/\r
97 \r
98   end\r
99 \r
100   def is_italian?(word)\r
101     return demauro(nil, :word => word, :justcheck => true)\r
102   end\r
103 \r
104 \r
105   def oxford(m, params)\r
106     justcheck = params[:justcheck]\r
107 \r
108     word = params[:word].join\r
109     [word, word + "_1"].each { |check|\r
110       url = @oxurl % URI.escape(check)\r
111       h = @bot.httputil.head(url)\r
112       if h\r
113         m.reply("#{word} found: #{url}") unless justcheck\r
114         return true\r
115       end\r
116     }\r
117     return false if justcheck\r
118     m.reply "#{word} not found"\r
119   end\r
120 \r
121   def is_british?(word)\r
122     return oxford(nil, :word => word, :justcheck => true)\r
123   end\r
124 \r
125 \r
126   def chambers(m, params)\r
127     justcheck = params[:justcheck]\r
128 \r
129     word = params[:word].to_s.downcase\r
130     url = @chambersurl % URI.escape(word)\r
131     xml = @bot.httputil.get_cached(url)\r
132     case xml\r
133     when nil\r
134       info = @bot.httputil.last_response\r
135       info = info ? " (#{info.code} - #{info.message})" : ""\r
136       return false if justcheck\r
137       m.reply "An error occurred while looking for #{word}#{info}"\r
138       return\r
139     when /Sorry, no entries for <b>.*?<\/b> were found./\r
140       return false if justcheck\r
141       m.reply "Nothing found for #{word}"\r
142       return\r
143     when /No exact matches for <b>.*?<\/b>, but the following may be helpful./\r
144       return false if justcheck\r
145       m.reply "Nothing found for #{word}, but see #{url} for possible suggestions"\r
146     else\r
147       return true if justcheck\r
148       m.reply "#{word}: #{url}"\r
149     end\r
150   end\r
151 \r
152   def is_english?(word)\r
153     return chambers(nil, :word => word, :justcheck => true)\r
154   end\r
155 \r
156 end\r
157 \r
158 plugin = DictPlugin.new\r
159 plugin.map 'demauro :word', :action => 'demauro'\r
160 plugin.map 'oxford *word', :action => 'oxford'\r
161 plugin.map 'chambers *word', :action => 'chambers'\r
162 \r