]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/freshmeat.rb
ircbot: do not use debug in sendmsg() because it breaks script. script plugin: handle...
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / freshmeat.rb
1 require 'rexml/document'
2
3 class FreshmeatPlugin < Plugin
4   include REXML
5   def help(plugin, topic="")
6     "freshmeat search [<max>=4] <string> => search freshmeat for <string>, freshmeat [<max>=4] => return up to <max> freshmeat headlines"
7   end
8   
9   def search_freshmeat(m, params)
10     max = params[:limit].to_i
11     search = params[:search].to_s
12     max = 8 if max > 8
13     xml = @bot.httputil.get("http://freshmeat.net/search-xml/?orderby=locate_projectname_full_DESC&q=#{CGI.escape(search)}")
14     unless xml
15       m.reply "search for #{search} failed"
16       return
17     end
18     doc = Document.new xml
19     unless doc
20       m.reply "search for #{search} failed"
21       return
22     end
23     matches = Array.new
24     max_width = 250
25     title_width = 0
26     url_width = 0
27     done = 0
28     doc.elements.each("*/match") {|e|
29       name = e.elements["projectname_short"].text
30       url = "http://freshmeat.net/projects/#{name}/"
31       desc = e.elements["desc_short"].text
32       title = e.elements["projectname_full"].text
33       #title_width = title.length if title.length > title_width
34       url_width = url.length if url.length > url_width
35       matches << [title, url, desc]
36       done += 1
37       break if done >= max
38     }
39     if matches.length == 0
40       m.reply "not found: #{search}"
41     end
42     matches.each {|mat|
43       title = mat[0]
44       url = mat[1]
45       desc = mat[2]
46       desc.gsub!(/(.{#{max_width - 3 - url_width}}).*/, '\1..')
47       reply = sprintf("%s | %s", url.ljust(url_width), desc)
48       m.reply reply
49     }
50   end
51   
52   def freshmeat(m, params)
53     max = params[:limit].to_i
54     max = 8 if max > 8
55     begin
56       xml = @bot.httputil.get('http://images.feedstermedia.com/feedcache/ostg/freshmeat/fm-releases-global.xml')
57       unless xml
58         m.reply "freshmeat news parse failed"
59         return
60       end
61       doc = Document.new xml
62       unless doc
63         m.reply "freshmeat news parse failed"
64         return
65       end
66     rescue
67       m.reply "freshmeat news parse failed"
68       return
69     end
70
71     matches = Array.new
72     max_width = 60
73     title_width = 0
74     done = 0
75     doc.elements.each("*/channel/item") {|e|
76       desc = e.elements["description"].text
77       title = e.elements["title"].text
78       #title.gsub!(/\s+\(.*\)\s*$/, "")
79       title.strip!
80       title_width = title.length if title.length > title_width
81       matches << [title, desc]
82       done += 1
83       break if done >= max
84     }
85     matches.each {|mat|
86       title = mat[0]
87       #desc = mat[1]
88       #desc.gsub!(/(.{#{max_width - 3 - title_width}}).*/, '\1..')
89       #reply = sprintf("%#{title_width}s | %s", title, desc)
90       m.reply title
91     }
92   end
93 end
94 plugin = FreshmeatPlugin.new
95 plugin.map 'freshmeat search :limit *search', :action => 'search_freshmeat',
96             :defaults => {:limit => 4}, :requirements => {:limit => /^\d+$/}
97 plugin.map 'freshmeat :limit', :defaults => {:limit => 4}, 
98                                :requirements => {:limit => /^\d+$/}