]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/roulette.rb
quiz plugin: initial support for unicode (UTF-8) answers
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / roulette.rb
index c9d585ea8e7e576687037ab16ad2b7e66b2f2ca2..9fce8d8ae890e5d7a22d40611810bdd70a30b263 100644 (file)
 RouletteHistory = Struct.new("RouletteHistory", :games, :shots, :deaths, :misses, :wins)
 
 class RoulettePlugin < Plugin
+  BotConfig.register BotConfigBooleanValue.new('roulette.autospin',
+    :default => true, 
+    :desc => "Automatically spins the roulette at the butlast shot")
+  BotConfig.register BotConfigBooleanValue.new('roulette.kick',
+    :default => false, 
+    :desc => "Kicks shot players from the channel")
+
   def initialize
     super
-    reload
+    reset_chambers
+    @players = Array.new
   end
+
   def help(plugin, topic="")
-    "roulette => play russian roulette - starts a new game if one isn't already running. One round in a six chambered gun. Take turns to say roulette to the bot, until somebody dies. roulette reload => force the gun to reload, roulette stats => show stats from all games, roulette stats <player> => show stats for <player>, roulette clearstats => clear stats (config level auth required)"
+    "roulette => play russian roulette - starts a new game if one isn't already running. One round in a six chambered gun. Take turns to say roulette to the bot, until somebody dies. roulette reload => force the gun to reload, roulette stats => show stats from all games, roulette stats <player> => show stats for <player>, roulette clearstats => clear stats (config level auth required), roulette spin => spins the cylinder"
   end
-  def privmsg(m)
-    if m.params == "reload"
-      @bot.action m.replyto, "reloads"
-      reload
-      # all players win on a reload
-      # (allows you to play 3-shot matches etc)
-      @players.each {|plyr|
-        pdata = @registry[plyr]
-        next if pdata == nil
-        pdata.wins += 1
-        @registry[plyr] = pdata
-      }
-      return
-    elsif m.params == "stats"
-      m.reply stats
-      return
-    elsif m.params =~ /^stats\s+(.+)$/
-      m.reply(playerstats($1))
-      return
-    elsif m.params == "clearstats"
-      if @bot.auth.allow?("config", m.source, m.replyto)
-        @registry.clear
-        m.okay
-      end
-      return
-    elsif m.params
-      m.reply "incorrect usage: " + help(m.plugin)
-      return
-    end
+
+  def clearstats(m, params)
+    @registry.clear
+    m.okay
+  end
+
+  def roulette(m, params)
     if m.private?
       m.reply "you gotta play roulette in channel dude"
       return
     end
 
     playerdata = nil
-    if @registry.has_key?(m.sourcenick)
-      playerdata = @registry[m.sourcenick]
+    if @registry.has_key?("player " + m.sourcenick)
+      playerdata = @registry["player " + m.sourcenick]
     else
       playerdata = RouletteHistory.new(0,0,0,0,0)
     end
-    
+
+    totals = nil
+    if @registry.has_key?("totals")
+      totals = @registry["totals"]
+    else
+      totals = RouletteHistory.new(0,0,0,0,0)
+    end
+
     unless @players.include?(m.sourcenick)
       @players << m.sourcenick
       playerdata.games += 1
     end
     playerdata.shots += 1
+    totals.shots += 1
     
     shot = @chambers.pop
     if shot
       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
       playerdata.deaths += 1
+      totals.deaths += 1
       @players.each {|plyr|
         next if plyr == m.sourcenick
-        pdata = @registry[plyr]
+        pdata = @registry["player " + plyr]
         next if pdata == nil
         pdata.wins += 1
-        @registry[plyr] = pdata
+        totals.wins += 1
+        @registry["player " + plyr] = pdata
       }
+      @players = Array.new
+      @bot.kick(m.replyto, m.sourcenick, "*BANG*") if @bot.config['roulette.kick']
     else
       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
       playerdata.misses += 1
+      totals.misses += 1
     end
 
-    @registry[m.sourcenick] = playerdata
+    @registry["player " + m.sourcenick] = playerdata
+    @registry["totals"] = totals
     
     if shot || @chambers.empty?
-      @bot.action m.replyto, "reloads"
-      reload
+      reload(m)
+    elsif @chambers.length == 1 and @bot.config['roulette.autospin']
+      spin(m)
     end
   end
-  def reload
+
+  def reload(m, params = {})
+    if m.private?
+      m.reply "you gotta play roulette in channel dude"
+      return
+    end
+
+    m.act "reloads"
+    reset_chambers
+    # all players win on a reload
+    # (allows you to play 3-shot matches etc)
+    totals = nil
+    if @registry.has_key?("totals")
+      totals = @registry["totals"]
+    else
+      totals = RouletteHistory.new(0,0,0,0,0)
+    end
+
+    @players.each {|plyr|
+      pdata = @registry["player " + plyr]
+      next if pdata == nil
+      pdata.wins += 1
+      totals.wins += 1
+      @registry["player " + plyr] = pdata
+    }
+
+    totals.games += 1
+    @registry["totals"] = totals
+
+    @players = Array.new
+  end
+
+  def spin(m, params={})
+    # Spinning is just like resetting, except that nobody wins
+    if m.private?
+      m.reply "you gotta play roulette in channel dude"
+      return
+    end
+
+    m.act "spins the cylinder"
+    reset_chambers
+  end
+
+  def reset_chambers
     @chambers = [false, false, false, false, false, false]
     @chambers[rand(@chambers.length)] = true
-    @players = Array.new
   end
-  def playerstats(player)
-    pstats = @registry[player]
-    return "#{player} hasn't played enough games yet" if pstats.nil?
-    return "#{player} has played #{pstats.games} games, won #{pstats.wins} and lost #{pstats.deaths}. #{player} pulled the trigger #{pstats.shots} times and found the chamber empty on #{pstats.misses} occasions."
+
+  def playerstats(m, params)
+    player = params[:player]
+    pstats = @registry["player " + player]
+    if pstats.nil?
+      m.reply "#{player} hasn't played enough games yet"
+    else
+      m.reply "#{player} has played #{pstats.games} games, won #{pstats.wins} and lost #{pstats.deaths}. #{player} pulled the trigger #{pstats.shots} times and found the chamber empty on #{pstats.misses} occasions."
+    end
   end
-  def stats
+
+  def stats(m, params)
+    if @registry.has_key?("totals")
+      totals = @registry["totals"]
+      total_games = totals.games
+      total_shots = totals.shots
+    else
+      total_games = 0
+      total_shots = 0
+    end
+
     total_players = 0
-    total_games = 0
-    total_shots = 0
-    
+
     died_most = [nil,0]
     won_most = [nil,0]
     h_win_percent = [nil,0]
@@ -100,9 +157,11 @@ class RoulettePlugin < Plugin
     h_luck_percent = [nil,0]
     l_luck_percent = [nil,0]
     @registry.each {|k,v|
+      match = /player (.+)/.match(k)
+      next unless match
+      k = match[1]
+
       total_players += 1
-      total_games += v.deaths
-      total_shots += v.shots
       
       win_rate = v.wins.to_f / v.games * 100
       if h_win_percent[0].nil? || win_rate > h_win_percent[1] && v.games > 2
@@ -139,9 +198,22 @@ class RoulettePlugin < Plugin
         won_most[0] << k
       end
     }
-    return "roulette stats: no games played yet" if total_games < 1
-    return "roulette stats: #{total_games} games completed, #{total_shots} shots fired at #{total_players} players. Luckiest: #{h_luck_percent[0].join(',')} (#{sprintf '%.1f', h_luck_percent[1]}% clicks). Unluckiest: #{l_luck_percent[0].join(',')} (#{sprintf '%.1f', l_luck_percent[1]}% clicks). Highest survival rate: #{h_win_percent[0].join(',')} (#{sprintf '%.1f', h_win_percent[1]}%). Lowest survival rate: #{l_win_percent[0].join(',')} (#{sprintf '%.1f', l_win_percent[1]}%). Most wins: #{won_most[0].join(',')} (#{won_most[1]}). Most deaths: #{died_most[0].join(',')} (#{died_most[1]})."
+    if total_games < 1
+      m.reply "roulette stats: no games completed yet"
+    else
+      m.reply "roulette stats: #{total_games} games completed, #{total_shots} shots fired at #{total_players} players. Luckiest: #{h_luck_percent[0].join(',')} (#{sprintf '%.1f', h_luck_percent[1]}% clicks). Unluckiest: #{l_luck_percent[0].join(',')} (#{sprintf '%.1f', l_luck_percent[1]}% clicks). Highest survival rate: #{h_win_percent[0].join(',')} (#{sprintf '%.1f', h_win_percent[1]}%). Lowest survival rate: #{l_win_percent[0].join(',')} (#{sprintf '%.1f', l_win_percent[1]}%). Most wins: #{won_most[0].join(',')} (#{won_most[1]}). Most deaths: #{died_most[0].join(',')} (#{died_most[1]})."
+    end
   end
 end
+
 plugin = RoulettePlugin.new
-plugin.register("roulette")
+
+plugin.default_auth('clearstats', false)
+
+plugin.map 'roulette reload', :action => 'reload'
+plugin.map 'roulette spin', :action => 'spin'
+plugin.map 'roulette stats :player', :action => 'playerstats'
+plugin.map 'roulette stats', :action => 'stats'
+plugin.map 'roulette clearstats', :action => 'clearstats'
+plugin.map 'roulette'
+