diff options
-rw-r--r-- | data/rbot/plugins/chucknorris.rb | 125 |
1 files changed, 102 insertions, 23 deletions
diff --git a/data/rbot/plugins/chucknorris.rb b/data/rbot/plugins/chucknorris.rb index 0b1b3a03..07421fda 100644 --- a/data/rbot/plugins/chucknorris.rb +++ b/data/rbot/plugins/chucknorris.rb @@ -1,18 +1,63 @@ require 'uri/common' require 'cgi' -
+ +# the 4q.cc "id => full name" mapping
FACTMAP = { "mrt" => "Mr\. T",
"vin" => "Vin Diesel",
"chuck" => "Chuck Norris" }
+MIN_RATING = 6.0 + +PISSED_EXPRESSIONS = [ + "fuck this, i'm going to go get toed up.", + "screw this, i'm going to get hammered.", + "forget this, i'm going to iron some shirts.", + "disregard this, i'm going out to kill me some prostitutes.", +] + +# exceptions +class HTTPError < Exception; end +class ParseError < Exception; end + +# the plugin class ChuckNorrisPlugin < Plugin def help(plugin, topic="") - "getfact => show a random fact, or append someone's name to get a fact about that person (eg. !getfact epitron)|| chucknorris => show a random Chuck Norris quote || vindiesel => show a random Vin Diesel quote || mrt => I pity the foo who can't figure this one out." + "fact [person] => \"fact\" shows a random Chuck Norris, Vin Diesel, or Mr. T fact. \"fact [person]\" shows a fact about someone in the channel. || chucknorris, chuck, norris => random Chuck Norris fact || vindiesel, vin, diesel => random Vin Diesel fact || mrt => I pity the foo who can't figure this one out." end -
- def getfact(m, params) + + def getfact(who) + raise "Unknown name: #{who}" unless FACTMAP.keys.include? who + # get the fact + factdata = @bot.httputil.get(URI.parse("http://www.4q.cc/index.php?pid=fact&person=#{who}")) + unless factdata + raise HTTPError + end + + longwho = FACTMAP[who] + + # regexes + fact_matcher = %r{<h1> And now a random fact about #{longwho}...</h1>(.+?)<hr />} + rating_matcher = %r{Current Rating: <b>(\d+\.\d+)</b>} + + # parse the fact + if factdata =~ fact_matcher + fact = CGI::unescapeHTML($1) + if factdata =~ rating_matcher + rating = $1.to_f + puts "fact=[#{fact}], rating=[#{rating}]" + return [fact, rating] + end + end + + raise ParseError + + end + + def fact(m, params) who = params[:who] + max_tries = (params[:tries] or "10").to_i + valid_people = FACTMAP.keys + ["random"] # if the person wants a fact about themselves, then it'll substitute the name. @@ -43,30 +88,64 @@ class ChuckNorrisPlugin < Plugin return
end
- matcher = %r{<h1> And now a random fact about #{longwho}...</h1>(.+?)<hr />}
- # get the fact - factdata = @bot.httputil.get(URI.parse("http://www.4q.cc/index.php?pid=fact&person=#{who}")) - unless factdata - m.reply "This #{longwho} fact punched my teeth in. (HTTP error)" - end - # parse the fact - if factdata =~ matcher - fact = CGI::unescapeHTML($1) - fact.gsub!(longwho, substitute_name) if substitute_name - m.reply fact - else - m.reply "This #{longwho} fact made my brain explode. (Parse error)" + m.reply "alright, let's see if I can find a good one..." + + tries = 0 + results = [] + loop do + + begin + + puts "[chucknorris] Try number #{tries}/#{max_tries}..." + + tries += 1 + fact, rating = getfact(who) + + if rating >= MIN_RATING + fact.gsub!(longwho, substitute_name) if substitute_name + m.reply "#{results.join(', ') + "... "}hrm, this one's not bad:" + m.reply "#{fact} [rating: #{rating}]" + return + else + results << "lame" + end + + if tries > max_tries + m.reply "#{results.join(', ')}... these all suck. #{PISSED_EXPRESSIONS[rand(PISSED_EXPRESSIONS.length)]}" + return + end + + rescue HTTPError + #m.reply "This #{longwho} fact punched my teeth in. (HTTP error)" + results << "DOH!" + tries += 1 + rescue ParseError + #m.reply "This #{longwho} fact made my brain explode. (Parse error)" + results << "wtf?" + tries += 1 + end + end -
+ end + end plugin = ChuckNorrisPlugin.new
-plugin.map 'getfact :who', :action => 'getfact', - :defaults => {:who => 'random'} -plugin.map 'chucknorris :who', :action => 'getfact', :defaults => {:who => "chuck"}
-plugin.map 'mrt :who', :action => 'getfact', :defaults => {:who => "mrt"}
-plugin.map 'vindiesel :who', :action => 'getfact', :defaults => {:who => "vin"}
+ +plugin.map 'fact :who :tries', :action => 'fact', + :defaults => {:who => 'random', :tries=>10} + +plugin.map 'chucknorris :who', :action => 'fact', :defaults => {:who => "chuck"} +plugin.map 'chuck :who', :action => 'fact', :defaults => {:who => "chuck"} +plugin.map 'norris :who', :action => 'fact', :defaults => {:who => "chuck"} + +plugin.map 'vindiesel :who', :action => 'fact', :defaults => {:who => "vin"} +plugin.map 'diesel :who', :action => 'fact', :defaults => {:who => "vin"} +plugin.map 'vin :who', :action => 'fact', :defaults => {:who => "vin"} + +plugin.map 'mrt :who', :action => 'fact', :defaults => {:who => "mrt"} + |