]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/demauro.rb
Some nickservs don't want the nick to be passed to them when identifying
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / demauro.rb
1 # TODO: cache definitions\r
2 \r
3 require 'erb'\r
4 \r
5 class DeMauroPlugin < Plugin\r
6   include ERB::Util\r
7 \r
8   def initialize\r
9     super\r
10     @dmurl = "http://www.demauroparavia.it/"\r
11   end\r
12 \r
13 \r
14   def help(plugin, topic="")\r
15     return "demauro <parola> => fornisce il link della definizione della parola dal dizionario De Mauro/Paravia"\r
16   end\r
17 \r
18   def demauro(m, params)\r
19     parola = params[:parola]\r
20     url = @dmurl + "cerca?stringa=#{url_encode(parola)}"\r
21     uri = URI.parse(url)\r
22     http = @bot.httputil.get_proxy(uri)\r
23     xml = nil\r
24     defurls = Array.new\r
25     begin\r
26       http.start() { |http|\r
27         resp = http.get(uri)\r
28         case resp.code\r
29         when "200"\r
30           xml = resp.body\r
31         when "302"\r
32           loc = resp['location']\r
33           if loc =~ /#{@dmurl}\d+/\r
34             defurls << loc\r
35           end\r
36         else\r
37           debug resp.to_a\r
38         end\r
39       }\r
40     rescue => e\r
41       debug "HttpUtil.get exception: #{e}, while trying to get #{uri}"\r
42       m.reply "Errore"\r
43       return\r
44     end\r
45     if xml\r
46       if xml=~ /Non ho trovato occorrenze per/\r
47         m.reply "Parola non trovata"\r
48         return\r
49       else\r
50         xml.gsub(/href="(\d+)"/) { |match|\r
51           debug match.to_a.join(" || ")\r
52           defurls << "#{@dmurl}#{$1}"\r
53         }\r
54       end\r
55     end\r
56     lemmas = Array.new\r
57     defurls.each { |url|\r
58       uri = URI.parse(url)\r
59       http = @bot.httputil.get_proxy(uri)\r
60       begin\r
61         debug "Scanning #{url}"\r
62         http.start() { |http|\r
63           resp = http.get(uri)\r
64           case resp.code\r
65           when "200"\r
66             debug "Got data"\r
67             matched = /<span class="lemma">(.*)<\/span><br\/><span class="qualifica".*?>(.*?)<\/span><br\/>/.match(resp.body)\r
68             dirtylemma = matched[1]\r
69             qual = matched[2]\r
70             lemma = dirtylemma.gsub(/<\/?span(?: class="pipelemma")?>/,"")\r
71             debug lemma\r
72             lemma = lemma.gsub(/<sup>1<\/sup>/,'¹').gsub(/<sup>2<\/sup>/,'²').gsub(/<sup>3<\/sup>/,'³')\r
73             lemma = lemma.gsub(/<sup>4<\/sup>/,'⁴').gsub(/<sup>5<\/sup>/,'⁵').gsub(/<sup>6<\/sup>/,'⁶')\r
74             lemma = lemma.gsub(/<sup>7<\/sup>/,'⁷').gsub(/<sup>8<\/sup>/,'⁸').gsub(/<sup>9<\/sup>/,'⁹')\r
75             debug lemma\r
76             lemma += " #{qual} (#{uri})"\r
77             lemmas << lemma\r
78           else\r
79             debug resp.to_a.join("\r")\r
80           end\r
81         }\r
82       rescue => e\r
83         debug "Exception '#{e}' while trying to get and parse #{uri}"\r
84         m.reply "Errore"\r
85         return\r
86       end\r
87     }\r
88     pre = lemmas.length > 1 ? "Lemmi trovati" : "Lemma trovato"\r
89     m.reply "#{pre}: #{lemmas.join(' ; ')}"\r
90   end\r
91 end\r
92 \r
93 plugin = DeMauroPlugin.new\r
94 plugin.map 'demauro :parola', :action => 'demauro'\r
95 \r