From 7c2f922749a743f029467e0b9b382fcc49c491cd Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Fri, 1 Apr 2016 19:59:46 +0200 Subject: [PATCH] dnd style $roll (for example: 3d5) --- NadekoBot/Modules/Gambling/DiceRollCommand.cs | 98 +++++++++++-------- 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/NadekoBot/Modules/Gambling/DiceRollCommand.cs b/NadekoBot/Modules/Gambling/DiceRollCommand.cs index 1719bd0e..e19cfb32 100644 --- a/NadekoBot/Modules/Gambling/DiceRollCommand.cs +++ b/NadekoBot/Modules/Gambling/DiceRollCommand.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace NadekoBot.Modules.Gambling @@ -19,13 +20,14 @@ namespace NadekoBot.Modules.Gambling internal override void Init(CommandGroupBuilder cgb) { cgb.CreateCommand(Module.Prefix + "roll") - .Description("Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice.\n**Usage**: $roll [x]") + .Description("Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice." + + " If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y.\n**Usage**: $roll or $roll 7 or $roll 3d5") .Parameter("num", ParameterType.Optional) - .Do(Roll0to10Func()); + .Do(RollFunc()); cgb.CreateCommand(Module.Prefix + "nroll") .Description("Rolls in a given range.\n**Usage**: `$nroll 5` (rolls 0-5) or `$nroll 5-15`") .Parameter("range", ParameterType.Required) - .Do(Roll0to5Func()); + .Do(NRollFunc()); } private Image GetDice(int num) => num != 10 @@ -36,12 +38,15 @@ namespace NadekoBot.Modules.Gambling (Properties.Resources.ResourceManager.GetObject("_" + 0) as Image), }.Merge(); - private Func Roll0to10Func() + + Regex dndRegex = new Regex(@"(?\d+)d(?\d+)", RegexOptions.Compiled); + private Func RollFunc() { var r = new Random(); return async e => { - if (e.Args[0] == "") + var arg = e.Args[0]?.Trim(); + if (string.IsNullOrWhiteSpace(arg)) { var gen = r.Next(0, 101); @@ -51,53 +56,68 @@ namespace NadekoBot.Modules.Gambling var imageStream = new Image[2] { GetDice(num1), GetDice(num2) }.Merge().ToStream(ImageFormat.Png); await e.Channel.SendFile("dice.png", imageStream); + return; } - else + Match m; + if ((m = dndRegex.Match(arg)).Length != 0) { - try + int n1; + int n2; + if (int.TryParse(m.Groups["n1"].ToString(), out n1) && + int.TryParse(m.Groups["n2"].ToString(), out n2) && + n1 <= 50 && n2 <= 100000 && n1 > 0 && n2 > 0) { - var num = int.Parse(e.Args[0]); - if (num < 1) num = 1; - if (num > 30) + var arr = new int[n1]; + for (int i = 0; i < n1; i++) { - await e.Channel.SendMessage("You can roll up to 30 dice at a time."); - num = 30; + arr[i] = r.Next(1, n2 + 1); } - var dices = new List(num); - var values = new List(num); - for (var i = 0; i < num; i++) - { - var randomNumber = r.Next(1, 7); - var toInsert = dices.Count; - if (randomNumber == 6 || dices.Count == 0) - toInsert = 0; - else if (randomNumber != 1) - for (var j = 0; j < dices.Count; j++) + await e.Channel.SendMessage($"`Rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:`" + string.Join(", ", arr.OrderBy(x => x))); + } + } + try + { + var num = int.Parse(e.Args[0]); + if (num < 1) num = 1; + if (num > 30) + { + await e.Channel.SendMessage("You can roll up to 30 dice at a time."); + num = 30; + } + var dices = new List(num); + var values = new List(num); + for (var i = 0; i < num; i++) + { + var randomNumber = r.Next(1, 7); + var toInsert = dices.Count; + if (randomNumber == 6 || dices.Count == 0) + toInsert = 0; + else if (randomNumber != 1) + for (var j = 0; j < dices.Count; j++) + { + if (values[j] < randomNumber) { - if (values[j] < randomNumber) - { - toInsert = j; - break; - } + toInsert = j; + break; } - dices.Insert(toInsert, GetDice(randomNumber)); - values.Insert(toInsert, randomNumber); - } + } + dices.Insert(toInsert, GetDice(randomNumber)); + values.Insert(toInsert, randomNumber); + } - var bitmap = dices.Merge(); - await e.Channel.SendMessage(values.Count + " Dice rolled. Total: **" + values.Sum() + "** Average: **" + (values.Sum() / (1.0f * values.Count)).ToString("N2") + "**"); - await e.Channel.SendFile("dice.png", bitmap.ToStream(ImageFormat.Png)); - } - catch - { - await e.Channel.SendMessage("Please enter a number of dice to roll."); - } + var bitmap = dices.Merge(); + await e.Channel.SendMessage(values.Count + " Dice rolled. Total: **" + values.Sum() + "** Average: **" + (values.Sum() / (1.0f * values.Count)).ToString("N2") + "**"); + await e.Channel.SendFile("dice.png", bitmap.ToStream(ImageFormat.Png)); + } + catch + { + await e.Channel.SendMessage("Please enter a number of dice to roll."); } }; } - private Func Roll0to5Func() => + private Func NRollFunc() => async e => { try