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;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace NadekoBot.Modules.Gambling namespace NadekoBot.Modules.Gambling
@ -19,13 +20,14 @@ namespace NadekoBot.Modules.Gambling
internal override void Init(CommandGroupBuilder cgb) internal override void Init(CommandGroupBuilder cgb)
{ {
cgb.CreateCommand(Module.Prefix + "roll") 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) .Parameter("num", ParameterType.Optional)
.Do(Roll0to10Func()); .Do(RollFunc());
cgb.CreateCommand(Module.Prefix + "nroll") cgb.CreateCommand(Module.Prefix + "nroll")
.Description("Rolls in a given range.\n**Usage**: `$nroll 5` (rolls 0-5) or `$nroll 5-15`") .Description("Rolls in a given range.\n**Usage**: `$nroll 5` (rolls 0-5) or `$nroll 5-15`")
.Parameter("range", ParameterType.Required) .Parameter("range", ParameterType.Required)
.Do(Roll0to5Func()); .Do(NRollFunc());
} }
private Image GetDice(int num) => num != 10 private Image GetDice(int num) => num != 10
@ -36,12 +38,15 @@ namespace NadekoBot.Modules.Gambling
(Properties.Resources.ResourceManager.GetObject("_" + 0) as Image), (Properties.Resources.ResourceManager.GetObject("_" + 0) as Image),
}.Merge(); }.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(); var r = new Random();
return async e => return async e =>
{ {
if (e.Args[0] == "") var arg = e.Args[0]?.Trim();
if (string.IsNullOrWhiteSpace(arg))
{ {
var gen = r.Next(0, 101); 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); var imageStream = new Image[2] { GetDice(num1), GetDice(num2) }.Merge().ToStream(ImageFormat.Png);
await e.Channel.SendFile("dice.png", imageStream); 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 try
{ {
var num = int.Parse(e.Args[0]); 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."); await e.Channel.SendMessage("Please enter a number of dice to roll.");
} }
}
}; };
} }
private Func<CommandEventArgs, Task> Roll0to5Func() => private Func<CommandEventArgs, Task> NRollFunc() =>
async e => async e =>
{ {
try try