X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fgrouphug.rb;h=1b08de2c338f92d71788f2ee8d8c522be6d4a606;hb=052217de30c59206d7025b582d4604557a747470;hp=53fc7f0a761a118ee4f41160bc852b111578bc29;hpb=43ac960aa89e5a02291fe875627dac88ae7fda34;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/grouphug.rb b/data/rbot/plugins/grouphug.rb index 53fc7f0a..1b08de2c 100644 --- a/data/rbot/plugins/grouphug.rb +++ b/data/rbot/plugins/grouphug.rb @@ -1,36 +1,118 @@ -# Plugin for the Ruby IRC bot (http://linuxbrit.co.uk/rbot/) -# (c) 2005 Mark Kretschmann -# Licensed under GPL V2. +#-- vim:sw=2:et +#++ +# +# :title: Grouphug Plugin for rbot +# +# Author:: Mark Kretschmann +# Author:: Casey Link +# Copyright:: (C) 2005 Mark Kretschmann +# Copyright:: (C) 2008 Casey Link +# License:: GPL v2 -require "net/http" +class GrouphugPlugin < Plugin + START = '
\s*

(.*?)

\s+
', Regexp::MULTILINE) + REGPOST = Regexp.new('title>(.*?) \| Group Hug') + def initialize + super + @confessions = Array.new + @bot.register_filter(:grouphug, :htmlinfo) { |s| grouphug_filter(s) } + end + def help( plugin, topic="" ) + return _("Grouphug plugin. Confess! Usage: 'confess' for random confession, 'confess ' for specific one, 'confess ' to share your own confession. Confessions must be at least 10 words.") + end -class GrouphugPlugin < Plugin - def help( plugin, topic="" ) - "Grouphug plugin. Confess! Usage: 'confess' for random confession, 'confess ' for specific one." + def post_confession(m, params) + c = params[:confession] + if c.length < 10 + diff = 10 - c.length + m.reply _("Confession must be at least 10 words. You need %{m} more.") % {:m => diff} + return end + uri = "http://beta.grouphug.us/confess" + form_id = "form_id=confession_node_form" + op = "op=Submit" + changed = "changed=" + body = "body=#{c}" + msg = [form_id,body,changed,op].join("&") - def privmsg( m ) - path = "/random" - path = "/confessions/#{m.params()}" if m.params() - begin - data = bot.httputil.get_cached(URI.parse("http://grouphug.us/#{path}")) + response = bot.httputil.post(uri, msg) + debug response.body + if response.class == Net::HTTPOK + num = response.body.scan(REGPOST) + m.reply _("Confession posted: http://beta.grouphug.us/confessions/%{n}") % {:n => num} + else + m.reply _("I couldn't share your confession.") + end + end - reg = Regexp.new( '()(.*?)(

)', Regexp::MULTILINE ) - confession = reg.match( data )[4] - confession.gsub!( /<.*?>/, "" ) # Remove html tags - confession.gsub!( "\t", "" ) # Remove tab characters + def get_confessions(html) + return [] unless html + start = html.index(START) + res = html[start, html.length - start].scan(REG) + return [] unless res + return res.map { |quote| + quote[0].ircify_html + } + end - @bot.say(m.replyto, confession) - rescue - m.reply "failed to connect to grouphug.us" + def confess(m, params) + opts = { :cache => false } + path = "random" + begin + # Fetch a specific question - separate from cache + if params[:num] + path = "confessions/#{params[:num]}" + opts.delete(:cache) + data = @bot.httputil.get("http://grouphug.us/#{path}", opts) + confessions = get_confessions(data) + if confessions.length > 1 + warn "more than one confession found!" + warn confessions + end + confessions << "no confession ##{params[:num]} found" if confessions.empty? + m.reply confessions.first + else # Cache random confessions + if @confessions.empty? + data = @bot.httputil.get("http://grouphug.us/#{path}", opts) + @confessions.replace get_confessions(data) end - end + @confessions << "no confessions found!" if @confessions.empty? + m.reply @confessions.pop + end + rescue Exception => e + error e + m.reply "failed to connect to grouphug.us" + end + end + + def grouphug_filter(s) + # check if we like the location of the page + loc = Utils.check_location(s, %r{http://(?:.*\.)?grouphug\.us}) + return unless loc + # check if there are any conefssions + confessions = get_confessions(s[:text]) + return if confessions.empty? + title = s[:text].ircify_html_title + # return the first confession + return { + :title => title, + :content => confessions.first, + :grouphug_confessions => confessions + } + end + end plugin = GrouphugPlugin.new -plugin.register("grouphug") -plugin.register("confess") +plugin.default_auth('create', false) + +plugin.map "grouphug [:num]", + :thread => true, :action => :confess, :requirements => { :num => /\d+/ } +plugin.map "confess [:num]", + :thread => true, :action => :confess, :requirements => { :num => /\d+/ } +plugin.map "confess *confession", :thread => true, :action => :post_confession, :auth_path => 'create'