Hopefuly fixed build. Added ~hs back. Good night
This commit is contained in:
		@@ -40,11 +40,10 @@ namespace NadekoBot.Attributes
 | 
			
		||||
            string prefix;
 | 
			
		||||
            if (ModulePrefixes.TryGetValue(moduleName, out prefix))
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("Cache hit");
 | 
			
		||||
                return prefix;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Console.WriteLine("Cache not hit for " + moduleName);
 | 
			
		||||
            NLog.LogManager.GetCurrentClassLogger().Warn("Cache not hit for {0}", moduleName);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,245 +16,250 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
{
 | 
			
		||||
    public partial class Gambling
 | 
			
		||||
    {
 | 
			
		||||
        private Regex dndRegex { get; } = new Regex(@"(?<n1>\d+)d(?<n2>\d+)", RegexOptions.Compiled);
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Roll(IUserMessage umsg)
 | 
			
		||||
        [Group]
 | 
			
		||||
        public class DriceRollCommands
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            if (channel == null)
 | 
			
		||||
                return;
 | 
			
		||||
            var rng = new NadekoRandom();
 | 
			
		||||
            var gen = rng.Next(1, 101);
 | 
			
		||||
            private Regex dndRegex { get; } = new Regex(@"(?<n1>\d+)d(?<n2>\d+)", RegexOptions.Compiled);
 | 
			
		||||
 | 
			
		||||
            var num1 = gen / 10;
 | 
			
		||||
            var num2 = gen % 10;
 | 
			
		||||
            var imageStream = await Task.Run(() =>
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Roll(IUserMessage umsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                var rng = new NadekoRandom();
 | 
			
		||||
                var gen = rng.Next(1, 101);
 | 
			
		||||
 | 
			
		||||
                var num1 = gen / 10;
 | 
			
		||||
                var num2 = gen % 10;
 | 
			
		||||
                var imageStream = await Task.Run(() =>
 | 
			
		||||
                {
 | 
			
		||||
                    var ms = new MemoryStream();
 | 
			
		||||
                    new[] { GetDice(num1), GetDice(num2) }.Merge().SaveAsPng(ms);
 | 
			
		||||
                    ms.Position = 0;
 | 
			
		||||
                    return ms;
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                await channel.SendFileAsync(imageStream, "dice.png", $"{umsg.Author.Mention} rolled " + Format.Code(gen.ToString())).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            //todo merge into internallDndRoll and internalRoll
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Roll(IUserMessage umsg, string arg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                var ordered = true;
 | 
			
		||||
                var rng = new NadekoRandom();
 | 
			
		||||
                Match match;
 | 
			
		||||
                if ((match = dndRegex.Match(arg)).Length != 0)
 | 
			
		||||
                {
 | 
			
		||||
                    int n1;
 | 
			
		||||
                    int n2;
 | 
			
		||||
                    if (int.TryParse(match.Groups["n1"].ToString(), out n1) &&
 | 
			
		||||
                        int.TryParse(match.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] = rng.Next(1, n2 + 1);
 | 
			
		||||
                        }
 | 
			
		||||
                        var elemCnt = 0;
 | 
			
		||||
                        await channel.SendMessageAsync($"`{umsg.Author.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Roll(IUserMessage umsg, int num)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                var ordered = true;
 | 
			
		||||
 | 
			
		||||
                if (num < 1 || num > 30)
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendMessageAsync("Invalid number specified. You can roll up to 1-30 dice at a time.").ConfigureAwait(false);
 | 
			
		||||
                    num = 30;
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var rng = new NadekoRandom();
 | 
			
		||||
 | 
			
		||||
                var dice = new List<Image>(num);
 | 
			
		||||
                var values = new List<int>(num);
 | 
			
		||||
                for (var i = 0; i < num; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    var randomNumber = rng.Next(1, 7);
 | 
			
		||||
                    var toInsert = dice.Count;
 | 
			
		||||
                    if (ordered)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (randomNumber == 6 || dice.Count == 0)
 | 
			
		||||
                            toInsert = 0;
 | 
			
		||||
                        else if (randomNumber != 1)
 | 
			
		||||
                            for (var j = 0; j < dice.Count; j++)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (values[j] < randomNumber)
 | 
			
		||||
                                {
 | 
			
		||||
                                    toInsert = j;
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        toInsert = dice.Count;
 | 
			
		||||
                    }
 | 
			
		||||
                    dice.Insert(toInsert, GetDice(randomNumber));
 | 
			
		||||
                    values.Insert(toInsert, randomNumber);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var bitmap = dice.Merge();
 | 
			
		||||
                var ms = new MemoryStream();
 | 
			
		||||
                new[] { GetDice(num1), GetDice(num2) }.Merge().SaveAsPng(ms);
 | 
			
		||||
                bitmap.SaveAsPng(ms);
 | 
			
		||||
                ms.Position = 0;
 | 
			
		||||
                return ms;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            await channel.SendFileAsync(imageStream, "dice.png", $"{umsg.Author.Mention} rolled " + Format.Code(gen.ToString())).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Roll(IUserMessage umsg, int num)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            if (channel == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var ordered = true;
 | 
			
		||||
            
 | 
			
		||||
            if (num < 1 || num > 30)
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendMessageAsync("Invalid number specified. You can roll up to 1-30 dice at a time.").ConfigureAwait(false);
 | 
			
		||||
                num = 30;
 | 
			
		||||
                await channel.SendFileAsync(ms, "dice.png", $"{umsg.Author.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var rng = new NadekoRandom();
 | 
			
		||||
 | 
			
		||||
            var dice = new List<Image>(num);
 | 
			
		||||
            var values = new List<int>(num);
 | 
			
		||||
            for (var i = 0; i < num; i++)
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Rolluo(IUserMessage umsg, string arg)
 | 
			
		||||
            {
 | 
			
		||||
                var randomNumber = rng.Next(1, 7);
 | 
			
		||||
                var toInsert = dice.Count;
 | 
			
		||||
                if (ordered)
 | 
			
		||||
                {
 | 
			
		||||
                    if (randomNumber == 6 || dice.Count == 0)
 | 
			
		||||
                        toInsert = 0;
 | 
			
		||||
                    else if (randomNumber != 1)
 | 
			
		||||
                        for (var j = 0; j < dice.Count; j++)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (values[j] < randomNumber)
 | 
			
		||||
                            {
 | 
			
		||||
                                toInsert = j;
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    toInsert = dice.Count;
 | 
			
		||||
                }
 | 
			
		||||
                dice.Insert(toInsert, GetDice(randomNumber));
 | 
			
		||||
                values.Insert(toInsert, randomNumber);
 | 
			
		||||
            }
 | 
			
		||||
                var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
            var bitmap = dice.Merge();
 | 
			
		||||
            var ms = new MemoryStream();
 | 
			
		||||
            bitmap.SaveAsPng(ms);
 | 
			
		||||
            ms.Position = 0;
 | 
			
		||||
            await channel.SendFileAsync(ms, "dice.png", $"{umsg.Author.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
        //todo merge into internallDndRoll and internalRoll
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Roll(IUserMessage umsg, string arg = "")
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            if (channel == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var ordered = true;
 | 
			
		||||
            var rng = new NadekoRandom();
 | 
			
		||||
            Match match;
 | 
			
		||||
            if ((match = dndRegex.Match(arg)).Length != 0)
 | 
			
		||||
            {
 | 
			
		||||
                int n1;
 | 
			
		||||
                int n2;
 | 
			
		||||
                if (int.TryParse(match.Groups["n1"].ToString(), out n1) &&
 | 
			
		||||
                    int.TryParse(match.Groups["n2"].ToString(), out n2) &&
 | 
			
		||||
                    n1 <= 50 && n2 <= 100000 && n1 > 0 && n2 > 0)
 | 
			
		||||
                var ordered = false;
 | 
			
		||||
                var rng = new NadekoRandom();
 | 
			
		||||
                Match match;
 | 
			
		||||
                if ((match = dndRegex.Match(arg)).Length != 0)
 | 
			
		||||
                {
 | 
			
		||||
                    var arr = new int[n1];
 | 
			
		||||
                    for (int i = 0; i < n1; i++)
 | 
			
		||||
                    int n1;
 | 
			
		||||
                    int n2;
 | 
			
		||||
                    if (int.TryParse(match.Groups["n1"].ToString(), out n1) &&
 | 
			
		||||
                        int.TryParse(match.Groups["n2"].ToString(), out n2) &&
 | 
			
		||||
                        n1 <= 50 && n2 <= 100000 && n1 > 0 && n2 > 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        arr[i] = rng.Next(1, n2 + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    var elemCnt = 0;
 | 
			
		||||
                    await channel.SendMessageAsync($"`{umsg.Author.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Rolluo(IUserMessage umsg, string arg = "")
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            if (channel == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var ordered = false;
 | 
			
		||||
            var rng = new NadekoRandom();
 | 
			
		||||
            Match match;
 | 
			
		||||
            if ((match = dndRegex.Match(arg)).Length != 0)
 | 
			
		||||
            {
 | 
			
		||||
                int n1;
 | 
			
		||||
                int n2;
 | 
			
		||||
                if (int.TryParse(match.Groups["n1"].ToString(), out n1) &&
 | 
			
		||||
                    int.TryParse(match.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] = rng.Next(1, n2 + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    var elemCnt = 0;
 | 
			
		||||
                    await channel.SendMessageAsync($"`{umsg.Author.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Rolluo(IUserMessage umsg, int num)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            if (channel == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var ordered = true;
 | 
			
		||||
 | 
			
		||||
            if (num < 1 || num > 30)
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendMessageAsync("Invalid number specified. You can roll up to 1-30 dice at a time.").ConfigureAwait(false);
 | 
			
		||||
                num = 30;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var rng = new NadekoRandom();
 | 
			
		||||
 | 
			
		||||
            var dice = new List<Image>(num);
 | 
			
		||||
            var values = new List<int>(num);
 | 
			
		||||
            for (var i = 0; i < num; i++)
 | 
			
		||||
            {
 | 
			
		||||
                var randomNumber = rng.Next(1, 7);
 | 
			
		||||
                var toInsert = dice.Count;
 | 
			
		||||
                if (ordered)
 | 
			
		||||
                {
 | 
			
		||||
                    if (randomNumber == 6 || dice.Count == 0)
 | 
			
		||||
                        toInsert = 0;
 | 
			
		||||
                    else if (randomNumber != 1)
 | 
			
		||||
                        for (var j = 0; j < dice.Count; j++)
 | 
			
		||||
                        var arr = new int[n1];
 | 
			
		||||
                        for (int i = 0; i < n1; i++)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (values[j] < randomNumber)
 | 
			
		||||
                            {
 | 
			
		||||
                                toInsert = j;
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                            arr[i] = rng.Next(1, n2 + 1);
 | 
			
		||||
                        }
 | 
			
		||||
                        var elemCnt = 0;
 | 
			
		||||
                        await channel.SendMessageAsync($"`{umsg.Author.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Rolluo(IUserMessage umsg, int num)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                var ordered = false;
 | 
			
		||||
 | 
			
		||||
                if (num < 1 || num > 30)
 | 
			
		||||
                {
 | 
			
		||||
                    toInsert = dice.Count;
 | 
			
		||||
                    await channel.SendMessageAsync("Invalid number specified. You can roll up to 1-30 dice at a time.").ConfigureAwait(false);
 | 
			
		||||
                    num = 30;
 | 
			
		||||
                }
 | 
			
		||||
                dice.Insert(toInsert, GetDice(randomNumber));
 | 
			
		||||
                values.Insert(toInsert, randomNumber);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var bitmap = dice.Merge();
 | 
			
		||||
            var ms = new MemoryStream();
 | 
			
		||||
            bitmap.SaveAsPng(ms);
 | 
			
		||||
            ms.Position = 0;
 | 
			
		||||
            await channel.SendFileAsync(ms, "dice.png", $"{umsg.Author.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
                var rng = new NadekoRandom();
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task NRoll(IUserMessage umsg, [Remainder] string range)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                int rolled;
 | 
			
		||||
                if (range.Contains("-"))
 | 
			
		||||
                var dice = new List<Image>(num);
 | 
			
		||||
                var values = new List<int>(num);
 | 
			
		||||
                for (var i = 0; i < num; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    var arr = range.Split('-')
 | 
			
		||||
                                    .Take(2)
 | 
			
		||||
                                    .Select(int.Parse)
 | 
			
		||||
                                    .ToArray();
 | 
			
		||||
                    if (arr[0] > arr[1])
 | 
			
		||||
                        throw new ArgumentException("First argument should be bigger than the second one.");
 | 
			
		||||
                    rolled = new NadekoRandom().Next(arr[0], arr[1] + 1);
 | 
			
		||||
                    var randomNumber = rng.Next(1, 7);
 | 
			
		||||
                    var toInsert = dice.Count;
 | 
			
		||||
                    if (ordered)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (randomNumber == 6 || dice.Count == 0)
 | 
			
		||||
                            toInsert = 0;
 | 
			
		||||
                        else if (randomNumber != 1)
 | 
			
		||||
                            for (var j = 0; j < dice.Count; j++)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (values[j] < randomNumber)
 | 
			
		||||
                                {
 | 
			
		||||
                                    toInsert = j;
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        toInsert = dice.Count;
 | 
			
		||||
                    }
 | 
			
		||||
                    dice.Insert(toInsert, GetDice(randomNumber));
 | 
			
		||||
                    values.Insert(toInsert, randomNumber);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
 | 
			
		||||
                var bitmap = dice.Merge();
 | 
			
		||||
                var ms = new MemoryStream();
 | 
			
		||||
                bitmap.SaveAsPng(ms);
 | 
			
		||||
                ms.Position = 0;
 | 
			
		||||
                await channel.SendFileAsync(ms, "dice.png", $"{umsg.Author.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task NRoll(IUserMessage umsg, [Remainder] string range)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    rolled = new NadekoRandom().Next(0, int.Parse(range) + 1);
 | 
			
		||||
                    int rolled;
 | 
			
		||||
                    if (range.Contains("-"))
 | 
			
		||||
                    {
 | 
			
		||||
                        var arr = range.Split('-')
 | 
			
		||||
                                        .Take(2)
 | 
			
		||||
                                        .Select(int.Parse)
 | 
			
		||||
                                        .ToArray();
 | 
			
		||||
                        if (arr[0] > arr[1])
 | 
			
		||||
                            throw new ArgumentException("First argument should be bigger than the second one.");
 | 
			
		||||
                        rolled = new NadekoRandom().Next(arr[0], arr[1] + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        rolled = new NadekoRandom().Next(0, int.Parse(range) + 1);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    await channel.SendMessageAsync($"{umsg.Author.Mention} rolled **{rolled}**.").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendMessageAsync($":anger: {ex.Message}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Image GetDice(int num)
 | 
			
		||||
            {
 | 
			
		||||
                const string pathToImage = "data/images/dice";
 | 
			
		||||
                if (num != 10)
 | 
			
		||||
                {
 | 
			
		||||
                    using (var stream = File.OpenRead(Path.Combine(pathToImage, $"{num}.png")))
 | 
			
		||||
                        return new Image(stream);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                await channel.SendMessageAsync($"{umsg.Author.Mention} rolled **{rolled}**.").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendMessageAsync($":anger: {ex.Message}").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
                using (var one = File.OpenRead(Path.Combine(pathToImage, "1.png")))
 | 
			
		||||
                using (var zero = File.OpenRead(Path.Combine(pathToImage, "0.png")))
 | 
			
		||||
                {
 | 
			
		||||
                    Image imgOne = new Image(one);
 | 
			
		||||
                    Image imgZero = new Image(zero);
 | 
			
		||||
 | 
			
		||||
        private Image GetDice(int num)
 | 
			
		||||
        {
 | 
			
		||||
            const string pathToImage = "data/images/dice";
 | 
			
		||||
            if(num != 10)
 | 
			
		||||
            {
 | 
			
		||||
                using (var stream = File.OpenRead(Path.Combine(pathToImage, $"{num}.png")))
 | 
			
		||||
                    return new Image(stream);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            using (var one = File.OpenRead(Path.Combine(pathToImage, "1.png")))
 | 
			
		||||
            using (var zero = File.OpenRead(Path.Combine(pathToImage, "0.png")))
 | 
			
		||||
            {
 | 
			
		||||
                Image imgOne = new Image(one);
 | 
			
		||||
                Image imgZero = new Image(zero);
 | 
			
		||||
 | 
			
		||||
                return new[] { imgOne, imgZero }.Merge();
 | 
			
		||||
                    return new[] { imgOne, imgZero }.Merge();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetRule34ImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
            var link = await GetGelbooruImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(link))
 | 
			
		||||
                await channel.SendMessageAsync("Search yielded no results ;(");
 | 
			
		||||
            else
 | 
			
		||||
@@ -76,7 +76,7 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetGelbooruImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
            var link = await GetRule34ImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(link))
 | 
			
		||||
                await channel.SendMessageAsync("Search yielded no results ;(");
 | 
			
		||||
            else
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,10 @@ using System.Net;
 | 
			
		||||
using Discord.WebSocket;
 | 
			
		||||
using NadekoBot.Modules.Searches.Models;
 | 
			
		||||
using NadekoBot.Modules.Searches.IMDB;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using ImageProcessorCore;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using System.IO;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Searches
 | 
			
		||||
{
 | 
			
		||||
@@ -199,51 +203,59 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
            await channel.SendMessageAsync($"https://google.com/search?q={ WebUtility.UrlEncode(terms).Replace(' ', '+') }")
 | 
			
		||||
                           .ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
        ////todo drawing
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Hearthstone(IUserMessage umsg, [Remainder] string name = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
        //    var arg = name;
 | 
			
		||||
        //    if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
        //    {
 | 
			
		||||
        //        await channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false);
 | 
			
		||||
        //        return;
 | 
			
		||||
        //    }
 | 
			
		||||
        //    await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
 | 
			
		||||
        //    string response = "";
 | 
			
		||||
        //    using (var http = new HttpClient())
 | 
			
		||||
        //    {
 | 
			
		||||
        //        http.DefaultRequestHeaders.Clear();
 | 
			
		||||
        //        http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey);
 | 
			
		||||
        //        response = await http.GetStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString(arg)}", headers)
 | 
			
		||||
        //                                .ConfigureAwait(false);
 | 
			
		||||
        //        try
 | 
			
		||||
        //        {
 | 
			
		||||
        //            var items = JArray.Parse(response).Shuffle().ToList();
 | 
			
		||||
        //            var images = new List<Image>();
 | 
			
		||||
        //            if (items == null)
 | 
			
		||||
        //                throw new KeyNotFoundException("Cannot find a card by that name");
 | 
			
		||||
        //            var cnt = 0;
 | 
			
		||||
        //            foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null))
 | 
			
		||||
        //            {
 | 
			
		||||
        //                images.Add(
 | 
			
		||||
        //                    Image.FromStream(await http.GetStreamAsync(item["img"].ToString()).ConfigureAwait(false)));
 | 
			
		||||
        //            }
 | 
			
		||||
        //            if (items.Count > 4)
 | 
			
		||||
        //            {
 | 
			
		||||
        //                await channel.SendMessageAsync("⚠ Found over 4 images. Showing random 4.").ConfigureAwait(false);
 | 
			
		||||
        //            }
 | 
			
		||||
        //            await channel.SendMessageAsync(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png))
 | 
			
		||||
        //                           .ConfigureAwait(false);
 | 
			
		||||
        //        }
 | 
			
		||||
        //        catch (Exception ex)
 | 
			
		||||
        //        {
 | 
			
		||||
        //            await channel.SendMessageAsync($"💢 Error {ex.Message}").ConfigureAwait(false);
 | 
			
		||||
        //        }
 | 
			
		||||
        //    }
 | 
			
		||||
        //}
 | 
			
		||||
        //todo drawing
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Hearthstone(IUserMessage umsg, [Remainder] string name = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            var arg = name;
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
 | 
			
		||||
            string response = "";
 | 
			
		||||
            using (var http = new HttpClient())
 | 
			
		||||
            {
 | 
			
		||||
                http.DefaultRequestHeaders.Clear();
 | 
			
		||||
                http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey);
 | 
			
		||||
                response = await http.GetStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString(arg)}")
 | 
			
		||||
                                        .ConfigureAwait(false);
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    var items = JArray.Parse(response).Shuffle().ToList();
 | 
			
		||||
                    var images = new List<Image>();
 | 
			
		||||
                    if (items == null)
 | 
			
		||||
                        throw new KeyNotFoundException("Cannot find a card by that name");
 | 
			
		||||
                    var cnt = 0;
 | 
			
		||||
                    foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null))
 | 
			
		||||
                    {
 | 
			
		||||
                        using (var sr =await http.GetStreamAsync(item["img"].ToString()))
 | 
			
		||||
                        {
 | 
			
		||||
                            var imgStream = new MemoryStream();
 | 
			
		||||
                            await sr.CopyToAsync(imgStream);
 | 
			
		||||
                            imgStream.Position = 0;
 | 
			
		||||
                            images.Add(new Image(imgStream));
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    string msg = null;
 | 
			
		||||
                    if (items.Count > 4)
 | 
			
		||||
                    {
 | 
			
		||||
                        msg = "⚠ Found over 4 images. Showing random 4.";
 | 
			
		||||
                    }
 | 
			
		||||
                    var ms = new MemoryStream();
 | 
			
		||||
                    images.Merge().SaveAsPng(ms);
 | 
			
		||||
                    ms.Position = 0;
 | 
			
		||||
                    await channel.SendFileAsync(ms, arg + ".png", msg).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendMessageAsync($"💢 Error {ex.Message}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,10 @@ using System.Linq;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using NLog.Fluent;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot
 | 
			
		||||
{
 | 
			
		||||
@@ -52,12 +56,6 @@ namespace NadekoBot
 | 
			
		||||
            CommandHandler = new CommandHandler(Client, Commands);
 | 
			
		||||
            Stats = new StatsService(Client, CommandHandler);
 | 
			
		||||
 | 
			
		||||
            //init db
 | 
			
		||||
            using (var context = DbHandler.Instance.GetDbContext())
 | 
			
		||||
            {
 | 
			
		||||
                context.EnsureSeedData();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //setup DI
 | 
			
		||||
            var depMap = new DependencyMap();
 | 
			
		||||
            depMap.Add<ILocalization>(Localizer);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								src/NadekoBot/NuGet.Config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/NadekoBot/NuGet.Config
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<configuration>
 | 
			
		||||
  <packageSources>
 | 
			
		||||
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
 | 
			
		||||
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
 | 
			
		||||
    <add key="Discord myget feed" value="https://www.myget.org/F/discord-net/api/v3/index.json" />
 | 
			
		||||
    <add key="Image Processor" value="https://www.myget.org/F/imageprocessor/api/v3/index.json" />
 | 
			
		||||
  </packageSources>
 | 
			
		||||
  <disabledPackageSources>
 | 
			
		||||
    <add key="Microsoft and .NET" value="true" />
 | 
			
		||||
  </disabledPackageSources>
 | 
			
		||||
  <packageRestore>
 | 
			
		||||
    <add key="enabled" value="True" />
 | 
			
		||||
    <add key="automatic" value="True" />
 | 
			
		||||
  </packageRestore>
 | 
			
		||||
  <bindingRedirects>
 | 
			
		||||
    <add key="skip" value="False" />
 | 
			
		||||
  </bindingRedirects>
 | 
			
		||||
</configuration>
 | 
			
		||||
							
								
								
									
										54
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										54
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							@@ -3002,6 +3002,33 @@ namespace NadekoBot.Resources {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Searches for a Hearthstone card and shows its image. Takes a while to complete..
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string hearthstone_desc {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("hearthstone_desc", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to `~hs Ysera`.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string hearthstone_summary {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("hearthstone_summary", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to hearthstone hs.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string hearthstone_text {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("hearthstone_text", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
@@ -3110,33 +3137,6 @@ namespace NadekoBot.Resources {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Searches for a Hearthstone card and shows its image. Takes a while to complete..
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string hs_desc {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("hs_desc", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to `~hs Ysera`.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string hs_summary {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("hs_summary", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to hs.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string hs_text {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("hs_text", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Pulls the first image found using a search parameter. Use ~ir for different results..
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -2205,13 +2205,13 @@
 | 
			
		||||
  <data name="google_summary" xml:space="preserve">
 | 
			
		||||
    <value>`~google query`</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="hs_text" xml:space="preserve">
 | 
			
		||||
    <value>hs</value>
 | 
			
		||||
  <data name="hearthstone_text" xml:space="preserve">
 | 
			
		||||
    <value>hearthstone hs</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="hs_desc" xml:space="preserve">
 | 
			
		||||
  <data name="hearthstone_desc" xml:space="preserve">
 | 
			
		||||
    <value>Searches for a Hearthstone card and shows its image. Takes a while to complete.</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="hs_summary" xml:space="preserve">
 | 
			
		||||
  <data name="hearthstone_summary" xml:space="preserve">
 | 
			
		||||
    <value>`~hs Ysera`</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="urbandict_text" xml:space="preserve">
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,12 @@ namespace NadekoBot.Services.Database
 | 
			
		||||
        public DbSet<RaceAnimal> RaceAnimals { get; set; }
 | 
			
		||||
        public DbSet<ModulePrefix> ModulePrefixes { get; set; }
 | 
			
		||||
 | 
			
		||||
        public NadekoContext()
 | 
			
		||||
        {
 | 
			
		||||
            this.Database.Migrate();
 | 
			
		||||
            EnsureSeedData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void EnsureSeedData()
 | 
			
		||||
        {
 | 
			
		||||
            if (!BotConfig.Any())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user