]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/dice.rb
chucknorris: read gzip stream before passing it to YAML.load
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / dice.rb
index 0c47052a0d26482c823de19a2a0168e0dd488c08..7e0662b1d0f42a3dd5f96660fa51d6eec543f4ee 100644 (file)
@@ -1,11 +1,14 @@
-##################
-# Filename: dice.rb
-# Description: Rbot plugin. Rolls rpg style dice
-# Author: David Dorward (http://david.us-lot.org/ - you might find a more up to date version of this plugin there)
-# Version: 0.3.2
-# Date: Sat 6 Apr 2002
+#-- vim:sw=2:et
+#++
 #
-# You can get rbot from: http://www.linuxbrit.co.uk/rbot/
+# :title: dice plugin for rbot
+#
+# Author:: David Dorward (http://david.us-lot.org/ - you might find a more up to date version of this plugin there)
+# Author:: Moritz Augsburger <moritz@augsburger.name>
+#
+# Description:: Rolls rpg style dice
+# Version:: 0.4
+# Date:: Mon 8 Feb 2008
 #
 # Changelog
 # 0.1 - Initial release
 #       - Return results of each roll
 # 0.3.1 - Minor documentation update
 # 0.3.2 - Bug fix, could not subtract numbers (String can't be coerced into Fixnum)
+# 0.4 - Limit number of dices and number of sides per dice
 #
-# TODO: Test! Test! Test!
-#       Comment!
-#       Fumble/Critical counter (1's and x's where x is sides on dice)
-####################################################
+# TODO:: Test! Test! Test!
+#        Comment!
+#        Fumble/Critical counter (1's and x's where x is sides on dice)
 
 class DiceDisplay
   attr_reader :total, :view, :dice
@@ -34,6 +37,14 @@ class DiceDisplay
 end
 
 class DicePlugin < Plugin
+  Config.register Config::IntegerValue.new('dice.max_dices',
+      :default => 100, :validate => Proc.new{|v| v > 0},
+      :desc => "Maximum number of dices to throw.")
+
+  Config.register Config::IntegerValue.new('dice.max_sides',
+      :default => 100, :validate => Proc.new{|v| v > 0},
+      :desc => "Maximum number of sides per dice.")
+
   def help(plugin, topic="")
     plugin + " <string> (where <string> is something like: d6 or 2d6 or 2d6+4 or 2d6+1d20 or 2d6+1d5+4d7-3d4-6) => Rolls that set of virtual dice"
   end
@@ -42,7 +53,7 @@ class DicePlugin < Plugin
     dice = d.split(/d/)
     repr = []
     r = 0
-    unless dice[0] =~ /^[0-9]+/
+    unless dice[0] =~ /^\d+/
       dice[0] = 1
     end
     for i in 0...dice[0].to_i
@@ -75,14 +86,30 @@ class DicePlugin < Plugin
   def privmsg(m)
     # If either not given parameters or given incorrect parameters, return with
     # the help message
-    unless(m.params && m.params =~ /^[0-9]*d[0-9]+(\s*[+-]\s*([0-9]+|[0-9]*d[0-9])+)*$/)
-      m.nickreply "incorrect usage: " + help(m.plugin)
+    unless m.params && m.params =~ /^\d*d\d+(\s*[+-]\s*(\d+|\d*d\d)+)*$/
+      m.reply "incorrect usage: " + help(m.plugin)
       return
     end
 
     # Extract the actual dice request from the message parameters, splitting it
     # into dice and modifiers
-    a = m.params.gsub(/\s+/,'').scan(/^[0-9]*d[0-9]+|[+-][0-9]*d[0-9]+|[+-][0-9]+/)
+    a = m.params.gsub(/\s+/,'').scan(/^\d*d\d+|[+-]\d*d\d+|[+-]\d+/)
+    # check nr of total dices and sides per dice
+    nr = 0
+    a.each { |dice|
+      dc, ds = dice.split(/d/)
+      # check sides
+      if ds.to_i > @bot.config['dice.max_sides']
+       m.reply "sorry, don't have any dices with more than %u sides" % @bot.config['dice.max_sides'], :nick => true
+       return
+      end
+      # We use .max with 1 so that specs such as d6 count as 1 and not as 0
+      nr += [dc.to_i, 1].max
+    }
+    if nr > @bot.config['dice.max_dices']
+      m.reply "can't handle more than %u dices" % @bot.config['dice.max_dices'], :nick => true
+      return
+    end
 
     # Roll the dice with the extracted request
     rolled = rolldice(a[0])
@@ -96,7 +123,7 @@ class DicePlugin < Plugin
       t = t + tmp.get_view
     end
     t.chop!
-    m.nickreply r.to_s + " || " + m.params + ": " + t
+    m.reply(r.to_s + " || " + m.params + ": " + t, :nick => true)
   end
 end
 plugin = DicePlugin.new