-##################
-# 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
end
class DicePlugin < Plugin
- BotConfig.register BotConfigIntegerValue.new('dice.max_dices',
+ 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
# 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]+/)
- # check nr of total dices
+ # 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']
+ return
+ end
# We use .max with 1 so that specs such as d6 count as 1 and not as 0
- nr += [dice.split(/d/)[0].to_i, 1].max
+ 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']