1 require 'rexml/document'
3 class FreshmeatPlugin < Plugin
5 def help(plugin, topic="")
6 "freshmeat search [<max>=4] <string> => search freshmeat for <string>, freshmeat [<max>=4] => return up to <max> freshmeat headlines"
9 def search_freshmeat(m, params)
10 max = params[:limit].to_i
11 search = params[:search].to_s
13 xml = @bot.httputil.get("http://freshmeat.net/search-xml/?orderby=locate_projectname_full_DESC&q=#{CGI.escape(search)}")
15 m.reply "search for #{search} failed"
18 doc = Document.new xml
20 m.reply "search for #{search} failed"
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]
39 if matches.length == 0
40 m.reply "not found: #{search}"
46 desc.gsub!(/(.{#{max_width - 3 - url_width}}).*/, '\1..')
47 reply = sprintf("%s | %s", url.ljust(url_width), desc)
52 def freshmeat(m, params)
53 max = params[:limit].to_i
56 xml = @bot.httputil.get('http://images.feedstermedia.com/feedcache/ostg/freshmeat/fm-releases-global.xml')
58 m.reply "freshmeat news parse failed"
61 doc = Document.new xml
63 m.reply "freshmeat news parse failed"
67 m.reply "freshmeat news parse failed"
75 doc.elements.each("*/channel/item") {|e|
76 desc = e.elements["description"].text
77 title = e.elements["title"].text
78 #title.gsub!(/\s+\(.*\)\s*$/, "")
80 title_width = title.length if title.length > title_width
81 matches << [title, desc]
88 #desc.gsub!(/(.{#{max_width - 3 - title_width}}).*/, '\1..')
89 #reply = sprintf("%#{title_width}s | %s", title, desc)
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+$/}