diff --git a/NadekoBot/Modules/Administration/Commands/Remind.cs b/NadekoBot/Modules/Administration/Commands/Remind.cs index 6b4374a5..be16f374 100644 --- a/NadekoBot/Modules/Administration/Commands/Remind.cs +++ b/NadekoBot/Modules/Administration/Commands/Remind.cs @@ -91,7 +91,8 @@ namespace NadekoBot.Modules.Administration.Commands { ch = e.Channel; } - else { + else + { ch = e.Server.FindChannels(meorchStr).FirstOrDefault(); } diff --git a/NadekoBot/Modules/Gambling/DiceRollCommand.cs b/NadekoBot/Modules/Gambling/DiceRollCommand.cs index 1719bd0e..7e8ae39a 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,70 @@ 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++) + var elemCnt = 0; + await e.Channel.SendMessage($"`Rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", arr.OrderBy(x => x).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))); + } + return; + } + 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 diff --git a/NadekoBot/Modules/Searches.cs b/NadekoBot/Modules/Searches.cs index 645e1cac..0693141e 100644 --- a/NadekoBot/Modules/Searches.cs +++ b/NadekoBot/Modules/Searches.cs @@ -360,17 +360,17 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await e.Channel.SendMessage("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆"); }); - cgb.CreateCommand(Prefix + "magicitem") + cgb.CreateCommand(Prefix + "mi") + .Alias("magicitem") .Description("Shows a random magicitem from ") .Do(async e => { - var db =JsonConvert.DeserializeObject>(File.ReadAllText("data/magicitems.json")); - var item = db[rng.Next(0, db.Count)].ToString(); - + var magicItems = JsonConvert.DeserializeObject>(File.ReadAllText("data/magicitems.json")); + var item = magicItems[rng.Next(0, magicItems.Count)].ToString(); + await e.Channel.SendMessage(item); }); - cgb.CreateCommand(Prefix + "revav") .Description("Returns a google reverse image search for someone's avatar.") .Parameter("user", ParameterType.Unparsed)