dnd style $roll (for example: 3d5)

This commit is contained in:
Master Kwoth 2016-04-01 19:59:46 +02:00
parent e53aab1870
commit 7c2f922749

View File

@ -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<CommandEventArgs, Task> Roll0to10Func()
Regex dndRegex = new Regex(@"(?<n1>\d+)d(?<n2>\d+)", RegexOptions.Compiled);
private Func<CommandEventArgs, Task> 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,9 +56,25 @@ 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)
{
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 arr = new int[n1];
for (int i = 0; i < n1; i++)
{
arr[i] = r.Next(1, n2 + 1);
}
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]);
@ -92,12 +113,11 @@ namespace NadekoBot.Modules.Gambling
{
await e.Channel.SendMessage("Please enter a number of dice to roll.");
}
}
};
}
private Func<CommandEventArgs, Task> Roll0to5Func() =>
private Func<CommandEventArgs, Task> NRollFunc() =>
async e =>
{
try