X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fchucknorris.rb;h=42385ff303a2b0a109835c5c7f2f002a05abf596;hb=a5ba341ceac6a73b690c2d84001766b75bcb249f;hp=0b1b3a03b94da37bd8eaba204d87ac60bf8d6095;hpb=09ed05062cacc730335c2f8c3fa65270dc6d35c0;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/chucknorris.rb b/data/rbot/plugins/chucknorris.rb index 0b1b3a03..42385ff3 100644 --- a/data/rbot/plugins/chucknorris.rb +++ b/data/rbot/plugins/chucknorris.rb @@ -1,72 +1,74 @@ -require 'uri/common' -require 'cgi' - -FACTMAP = { "mrt" => "Mr\. T", - "vin" => "Vin Diesel", - "chuck" => "Chuck Norris" } +require 'yaml' +require 'zlib' +MIN_RATING = 6.0 +MIN_VOTES = 25 + +# 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." - end - - def getfact(m, params) - who = params[:who] - valid_people = FACTMAP.keys + ["random"] - - # if the person wants a fact about themselves, then it'll substitute the name. - if valid_people.include? who - substitute_name = nil + # Loadez les factes + def initialize + if path = find_facts_file('chucknorris.yml.gz') + fyml = Zlib::GzipReader.open(path).read + elsif path = find_facts_file('chucknorris.yml') + fyml = open(path).read else - substitute_name = who - who = 'random' - end - - # pick a random person - if who == 'random' - if substitute_name - # take out the Mr. T facts if you're inserting someone's name - # beacuse tons of them suck, and most of them revolve around - # "pitying" someone or something. - people = FACTMAP.keys - ["mrt"] - who = people[rand(people.length)] - else - who = FACTMAP.keys[rand(FACTMAP.length)] - end - end - - # get the long name - longwho = FACTMAP[who] - unless longwho - m.reply "Who the crap is #{who}?!?!" - return - end - - matcher = %r{

And now a random fact about #{longwho}...

(.+?)
} - - # 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)" + raise "Error: Couldn't find chucknorris.yml[.gz]" end - # parse the fact - if factdata =~ matcher - fact = CGI::unescapeHTML($1) - fact.gsub!(longwho, substitute_name) if substitute_name - m.reply fact + debug "+ [chucknorris] Loading #{path}..." + + @@facts = YAML.load(fyml).map{|fact,(score,votes)| votes >= MIN_VOTES ? [score,fact] : nil}.compact + debug "+ [chucknorris] #{@@facts.length} Chuck Norris facts loaded..." + debug " Random fact: #{@@facts[rand(@@facts.size)].inspect}" + + super + end + + def name + "chucknorris" + end + + # Just a little helper for the initialize method... + def find_facts_file(name) + full_path = File.join Config::datadir, "plugins", name + found_files = Dir[full_path] + if found_files.empty? + nil else - m.reply "This #{longwho} fact made my brain explode. (Parse error)" + found_files[0] end - + end + + # HELP! + def help(plugin, topic="chuck") + "chuck|norris|chucknorris [min_rating] => show a random Chuck Norris fact (optional minimum rating from 1-10, default=6.0)." + #\"fact [person]\" shows a fact about someone in the channel. + end + + # The meat. + def fact(m, params) + min = params[:minrating].to_f + debug "+ Getting Chuck Norris fact (rating > #{min})..." + + viable_facts = @@facts.select {|rating, fact| rating >= min} + if viable_facts.empty? + debug " - no facts found with rating >= #{min}" + m.reply "Are you nuts?!? There are no facts better than #{min}!!!" + return + end + + rating, fact = viable_facts[rand(viable_facts.length)] + m.reply "#{fact} [score=#{rating}]" 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 = ChuckNorrisPlugin.new + +# plugin.map 'fact :minrating', :action => 'fact', :defaults => {:minrating=>MIN_RATING} +plugin.map 'chucknorris :minrating', :action => 'fact', :defaults => {:minrating=>MIN_RATING} +plugin.map 'chuck :minrating', :action => 'fact', :defaults => {:minrating=>MIN_RATING} +plugin.map 'norris :minrating', :action => 'fact', :defaults => {:minrating=>MIN_RATING} +