| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- require './app/commands/base_command.rb'
- class RollCommand < BaseCommand
- def self.opts
- {
- usage: {
- die: "Rolls a specified die. Can be a list of options, a name of a saved die, " +
- "or an indication of standard dice. Standard Die are designated as `xDy` " +
- "where `x` designates the number of die to roll, and `y` designates the number of sides" +
- " on the die. A modifier can be added with a + or - number: Added to total." +
- " If no die is specified, displays a list of all saved dice",
- combined: "Indicates you don't want to see the individual rolls, only the total." +
- " If left empty it will show each individual roll (unless more than 25 dice were rolled)"
- }
- }
- end
- def self.cmd
- desc = 'Roll a saved die, a comma separated list, or a standard die'
- @cmd ||= Command.new(:roll, desc, opts) do |event, die, array|
- # Save author
- author = event.author
- # Determine die and roll it
- # Display a list of saved dice
- if die.nil?
- dice_list
- elsif d = die.gsub(" ", "").match(/([0-9]*?)d([0-9]+)([\+|\-]?[0-9]+)?/i)
- # Roll the dice, and save it in the hash
- hash = DiceController.roll({
- number: d[1] == "" ? 1 : d[1].to_i ,
- sides: d[2].to_i,
- modifier: d[3]
- })
- # Determine if each result should be displayed
- # Format the results into an embed, and reply
- combine = array&.match(/combined?/i) || hash[:number] > 25 || hash[:number] == 1
- roll_results(author, hash, combine)
- # Create an array and roll it
- elsif die.match(/,/)
- hash = DiceController.roll(die.split(/\s?,\s?/))
- roll_results(author, hash)
- # Create/Update/Destroy a new dice
- elsif array && Util::Roles.admin?(author)
- # Attempt to find die, then update
- die_array = DieArray.find_by('name ilike ?', die)
- DiceController.edit_die(die_array, die, array&.split(/\s?,\s?/))
- # Roll a saved Die
- else
- die_array = DieArray.find_by!('name ilike ?', die)
- hash = DiceController.roll(die_array.sides)
- roll_results(author, hash)
- end
- rescue ActiveRecord::RecordNotFound => e
- error_embed("Record Not Found!", e.message)
- rescue StandardError => e
- error_embed(e.message)
- end
- end
- def self.example_command(event=nil)
- list = [
- 'Hotdog, Hamburger, Chilli Cheese Fries, Nachos, Fried Onions',
- 'A, B, C, D',
- 'Cat, Dog, Mouse, Frog, Squirrel, Turtle, Dragon',
- 'Eevee, Vaporeon, Flareon, Jolteon, Espeon, Umbreon, Glaceon, Leafeon, Sylveon',
- 'Sword, Sheild, Gun, Bomb, Tank, Fighter Jet'
- ].sample
- case ['', 'standard', 'modifier', 'list', 'named', 'combined'].sample
- when ''
- []
- when 'standard'
- [ "#{rand(1 .. 70)}d#{rand(2 .. 420)}" ]
- when 'modifier'
- [ "#{rand(1 .. 70)}d#{rand(2 .. 420)} #{['+', '-'].sample}#{rand(1 .. 10)}" ]
- when 'list'
- [ list ]
- when 'named'
- [ DiceArray.order('RANDOM()').first.name ]
- when 'combined'
- [ "#{rand(1 .. 70)}d#{rand(2 .. 420)}", 'combined' ]
- end
- end
- def self.admin_opts
- {
- usage: {
- die: "New die name",
- sides: "Sides of die, `delete` will delete the stored die"
- }
- }
- end
- end
|