]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/demauro.rb
make sure @commands is never nil in script.rb
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / demauro.rb
1 require 'erb'\r
2 \r
3 class DeMauroPlugin < Plugin\r
4   include ERB::Util\r
5 \r
6   def initialize\r
7     super\r
8     @dmurl = "http://www.demauroparavia.it/"\r
9   end\r
10 \r
11 \r
12   def help(plugin, topic="")\r
13     return "demauro <parola> => fornisce il link della definizione della parola dal dizionario De Mauro/Paravia"\r
14   end\r
15 \r
16   def demauro(m, params)\r
17     parola = params[:parola]\r
18     url = @dmurl + "cerca?stringa=#{url_encode(parola)}"\r
19     uri = URI.parse(url)\r
20     http = @bot.httputil.get_proxy(uri)\r
21     xml = nil\r
22     defurls = Array.new\r
23     begin\r
24       http.start() { |http|\r
25         resp = http.get(uri.request_uri())\r
26         case resp.code\r
27         when "200"\r
28           xml = resp.body\r
29         when "302"\r
30           loc = resp['location']\r
31           if loc =~ /#{@dmurl}\d+/\r
32             defurls << loc\r
33           end\r
34         else\r
35           debug resp.to_a\r
36         end\r
37       }\r
38     rescue => e\r
39       debug "HttpUtil.get exception: #{e.inspect}, while trying to get #{uri}"\r
40       debug e.backtrace.join("\n")\r
41       m.reply "C'è stato un errore nella ricerca"\r
42       return\r
43     end\r
44     if xml\r
45       if xml=~ /Non ho trovato occorrenze per/\r
46         m.reply "Parola non trovata"\r
47         return\r
48       else\r
49         xml.gsub(/href="(\d+)"/) { |match|\r
50           debug match.to_a.join(" || ")\r
51           defurls << "#{@dmurl}#{$1}"\r
52         }\r
53       end\r
54     end\r
55     lemmas = Array.new\r
56     defurls.each { |url|\r
57       uri = URI.parse(url)\r
58       http = @bot.httputil.get_proxy(uri)\r
59       begin\r
60         debug "Scanning #{url}"\r
61         http.start() { |http|\r
62           resp = http.get(uri.request_uri())\r
63           case resp.code\r
64           when "200"\r
65             debug "Got data"\r
66             matched = /<span class="lemma">(.*)<\/span><br\/><span class="qualifica".*?>(.*?)<\/span><br\/>/.match(resp.body)\r
67             dirtylemma = matched[1]\r
68             qual = matched[2]\r
69             lemma = dirtylemma.gsub(/<\/?span(?: class="pipelemma")?>/,"")\r
70             debug lemma\r
71             lemma = lemma.gsub(/<sup>1<\/sup>/,'¹').gsub(/<sup>2<\/sup>/,'²').gsub(/<sup>3<\/sup>/,'³')\r
72             lemma = lemma.gsub(/<sup>4<\/sup>/,'⁴').gsub(/<sup>5<\/sup>/,'⁵').gsub(/<sup>6<\/sup>/,'⁶')\r
73             lemma = lemma.gsub(/<sup>7<\/sup>/,'⁷').gsub(/<sup>8<\/sup>/,'⁸').gsub(/<sup>9<\/sup>/,'⁹')\r
74             debug lemma\r
75             lemma += " #{qual} (#{uri})"\r
76             lemmas << lemma\r
77           else\r
78             debug resp.to_a.join("\r")\r
79           end\r
80         }\r
81       rescue => e\r
82         debug "Exception '#{e.inspect}' while trying to get and parse #{uri}"\r
83         debug e.backtrace.join("\n")\r
84         m.reply "C'è stato un errore nell'elaborazione del risultato"\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