more work!
This commit is contained in:
		@@ -25,6 +25,8 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
 | 
			
		||||
        private static ConcurrentDictionary<ulong, string> GuildMuteRoles { get; } = new ConcurrentDictionary<ulong, string>();
 | 
			
		||||
 | 
			
		||||
        private static ConcurrentHashSet<ulong> DeleteMessagesOnCommand { get; } = new ConcurrentHashSet<ulong>();
 | 
			
		||||
 | 
			
		||||
        private new static Logger _log { get; }
 | 
			
		||||
 | 
			
		||||
        public Administration() : base()
 | 
			
		||||
@@ -36,6 +38,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
            _log = LogManager.GetCurrentClassLogger();
 | 
			
		||||
            NadekoBot.CommandHandler.CommandExecuted += DelMsgOnCmd_Handler;
 | 
			
		||||
 | 
			
		||||
            DeleteMessagesOnCommand = new ConcurrentHashSet<ulong>(NadekoBot.AllGuildConfigs.Where(g => g.DeleteMessageOnCommand).Select(g => g.GuildId));
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -46,15 +49,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
                var channel = msg.Channel as SocketTextChannel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                //todo cache this
 | 
			
		||||
                bool shouldDelete;
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    shouldDelete = uow.GuildConfigs.For(channel.Guild.Id, set => set).DeleteMessageOnCommand;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (shouldDelete)
 | 
			
		||||
                if (DeleteMessagesOnCommand.Contains(channel.Guild.Id))
 | 
			
		||||
                    await msg.DeleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
@@ -99,9 +94,15 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
                await uow.CompleteAsync();
 | 
			
		||||
            }
 | 
			
		||||
            if (enabled)
 | 
			
		||||
            {
 | 
			
		||||
                DeleteMessagesOnCommand.Add(Context.Guild.Id);
 | 
			
		||||
                await Context.Channel.SendConfirmAsync("✅ **Now automatically deleting successful command invokations.**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                DeleteMessagesOnCommand.TryRemove(Context.Guild.Id);
 | 
			
		||||
                await Context.Channel.SendConfirmAsync("❗**Stopped automatic deletion of successful command invokations.**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
 
 | 
			
		||||
@@ -38,9 +38,6 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
                        .ToDictionary(g => g.Key, g => g.ToList()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public ClashOfClans() : base()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static async Task CheckWar(TimeSpan callExpire, ClashWar war)
 | 
			
		||||
        {
 | 
			
		||||
@@ -52,7 +49,7 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
                {
 | 
			
		||||
                    Bases[i] = null;
 | 
			
		||||
                    try { await war.Channel.SendErrorAsync($"❗🔰**Claim from @{Bases[i].CallUser} for a war against {war.ShortPrint()} has expired.**").ConfigureAwait(false); } catch { }
 | 
			
		||||
            }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ using NLog;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules
 | 
			
		||||
{
 | 
			
		||||
    public class DiscordModule : ModuleBase
 | 
			
		||||
    public abstract class DiscordModule : ModuleBase
 | 
			
		||||
    {
 | 
			
		||||
        protected Logger _log { get; }
 | 
			
		||||
        protected string _prefix { get; }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,11 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
        {
 | 
			
		||||
            private Regex dndRegex { get; } = new Regex(@"^(?<n1>\d+)d(?<n2>\d+)(?:\+(?<add>\d+))?(?:\-(?<sub>\d+))?$", RegexOptions.Compiled);
 | 
			
		||||
 | 
			
		||||
            public enum RoleOrderType {
 | 
			
		||||
                Ordered,
 | 
			
		||||
                Unordered
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            public async Task Roll()
 | 
			
		||||
            {
 | 
			
		||||
@@ -43,37 +48,6 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
 | 
			
		||||
                await Context.Channel.SendFileAsync(imageStream, "dice.png", $"{Context.User.Mention} rolled " + Format.Code(gen.ToString())).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            //todo merge into internallDndRoll and internalRoll
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            [Priority(1)]
 | 
			
		||||
            public async Task Roll(string arg)
 | 
			
		||||
            {
 | 
			
		||||
                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 add = 0;
 | 
			
		||||
                        var sub = 0;
 | 
			
		||||
                        int.TryParse(match.Groups["add"].Value, out add);
 | 
			
		||||
                        int.TryParse(match.Groups["sub"].Value, out sub);
 | 
			
		||||
 | 
			
		||||
                        var arr = new int[n1];
 | 
			
		||||
                        for (int i = 0; i < n1; i++)
 | 
			
		||||
                        {
 | 
			
		||||
                            arr[i] = rng.Next(1, n2 + 1) + add - sub;
 | 
			
		||||
                        }
 | 
			
		||||
                        var elemCnt = 0;
 | 
			
		||||
                        await Context.Channel.SendConfirmAsync($"{Context.User.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} `1 to {n2}` +`{add}` -`{sub}`.\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            [Priority(0)]
 | 
			
		||||
@@ -123,37 +97,7 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
                ms.Position = 0;
 | 
			
		||||
                await Context.Channel.SendFileAsync(ms, "dice.png", $"{Context.User.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            public async Task Rolluo(string arg)
 | 
			
		||||
            {
 | 
			
		||||
                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 add = 0;
 | 
			
		||||
                        var sub = 0;
 | 
			
		||||
                        int.TryParse(match.Groups["add"].Value, out add);
 | 
			
		||||
                        int.TryParse(match.Groups["sub"].Value, out sub);
 | 
			
		||||
 | 
			
		||||
                        var arr = new int[n1];
 | 
			
		||||
                        for (int i = 0; i < n1; i++)
 | 
			
		||||
                        {
 | 
			
		||||
                            arr[i] = rng.Next(1, n2 + 1) + add - sub;
 | 
			
		||||
                        }
 | 
			
		||||
                        var elemCnt = 0;
 | 
			
		||||
                        await Context.Channel.SendConfirmAsync($"{Context.User.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} `1 to {n2}` +`{add}` -`{sub}`.\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            public async Task Rolluo(int num)
 | 
			
		||||
            {
 | 
			
		||||
@@ -202,6 +146,73 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
                await Context.Channel.SendFileAsync(ms, "dice.png", $"{Context.User.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
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            [Priority(1)]
 | 
			
		||||
            public async Task Roll(string arg)
 | 
			
		||||
            {
 | 
			
		||||
                
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            public async Task Rolluo(string arg)
 | 
			
		||||
            {
 | 
			
		||||
                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 add = 0;
 | 
			
		||||
                        var sub = 0;
 | 
			
		||||
                        int.TryParse(match.Groups["add"].Value, out add);
 | 
			
		||||
                        int.TryParse(match.Groups["sub"].Value, out sub);
 | 
			
		||||
 | 
			
		||||
                        var arr = new int[n1];
 | 
			
		||||
                        for (int i = 0; i < n1; i++)
 | 
			
		||||
                        {
 | 
			
		||||
                            arr[i] = rng.Next(1, n2 + 1) + add - sub;
 | 
			
		||||
                        }
 | 
			
		||||
                        var elemCnt = 0;
 | 
			
		||||
                        await Context.Channel.SendConfirmAsync($"{Context.User.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} `1 to {n2}` +`{add}` -`{sub}`.\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private async Task InternalDndRoll(string arg, RoleOrderType ordType)
 | 
			
		||||
            {
 | 
			
		||||
                var ordered = ordType == RoleOrderType.Ordered;
 | 
			
		||||
                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 add = 0;
 | 
			
		||||
                        var sub = 0;
 | 
			
		||||
                        int.TryParse(match.Groups["add"].Value, out add);
 | 
			
		||||
                        int.TryParse(match.Groups["sub"].Value, out sub);
 | 
			
		||||
 | 
			
		||||
                        var arr = new int[n1];
 | 
			
		||||
                        for (int i = 0; i < n1; i++)
 | 
			
		||||
                        {
 | 
			
		||||
                            arr[i] = rng.Next(1, n2 + 1) + add - sub;
 | 
			
		||||
                        }
 | 
			
		||||
                        var elemCnt = 0;
 | 
			
		||||
                        await Context.Channel.SendConfirmAsync($"{Context.User.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} `1 to {n2}` +`{add}` -`{sub}`.\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            public async Task NRoll([Remainder] string range)
 | 
			
		||||
            {
 | 
			
		||||
@@ -215,7 +226,7 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
                                        .Select(int.Parse)
 | 
			
		||||
                                        .ToArray();
 | 
			
		||||
                        if (arr[0] > arr[1])
 | 
			
		||||
                            throw new ArgumentException("First argument should be bigger than the second one.");
 | 
			
		||||
                            throw new ArgumentException("Second argument must be larger than the first one.");
 | 
			
		||||
                        rolled = new NadekoRandom().Next(arr[0], arr[1] + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,6 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
                MemoryStream bitmapStream = new MemoryStream();
 | 
			
		||||
                images.Merge().SaveAsPng(bitmapStream);
 | 
			
		||||
                bitmapStream.Position = 0;
 | 
			
		||||
                //todo CARD NAMES?
 | 
			
		||||
                var toSend = $"{Context.User.Mention}";
 | 
			
		||||
                if (cardObjects.Count == 5)
 | 
			
		||||
                    toSend += $" drew `{Cards.GetHandValue(cardObjects)}`";
 | 
			
		||||
 
 | 
			
		||||
@@ -64,16 +64,10 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
                                 .ConfigureAwait(false);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                // todo update this
 | 
			
		||||
                long userFlowers;
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                var removed = await CurrencyHandler.RemoveCurrencyAsync((IGuildUser)Context.User, "Betflip Gamble", amount, false).ConfigureAwait(false);
 | 
			
		||||
                if (!removed)
 | 
			
		||||
                {
 | 
			
		||||
                    userFlowers = uow.Currency.GetOrCreate(Context.User.Id).Amount;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (userFlowers < amount)
 | 
			
		||||
                {
 | 
			
		||||
                    await Context.Channel.SendErrorAsync($"{Context.User.Mention} You don't have enough {Gambling.CurrencyPluralName}. You only have {userFlowers}{Gambling.CurrencySign}.").ConfigureAwait(false);
 | 
			
		||||
                    await Context.Channel.SendErrorAsync($"{Context.User.Mention} You don't have enough {Gambling.CurrencyPluralName}.").ConfigureAwait(false);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -143,9 +143,7 @@ namespace NadekoBot.Modules.Games.Commands.Hangman
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
            var guess = char.ToUpperInvariant(msg.Content[0]); 
 | 
			
		||||
            // todo hmmmm
 | 
			
		||||
            // how do i want to limit the users on guessing?
 | 
			
		||||
            // one guess every 5 seconds if wrong?
 | 
			
		||||
 | 
			
		||||
            Task.Run(async () =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,6 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    //todo make currency generation change and cooldown modifyable
 | 
			
		||||
    //only by bot owner through commands
 | 
			
		||||
    public partial class Games
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ using System.Collections.Concurrent;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
//todo Rewrite? Fix trivia not stopping bug
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public partial class Games
 | 
			
		||||
 
 | 
			
		||||
@@ -38,9 +38,9 @@ namespace NadekoBot.Modules.Help
 | 
			
		||||
        public async Task Modules()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            var mdls = NadekoBot.CommandService.Modules.GroupBy(mi => mi.GetTopLevelModule()).Select(m => m.Key.Name).OrderBy(m => m);
 | 
			
		||||
            await Context.Channel.SendMessageAsync("📜 **List of modules:** ```css\n• " + string.Join("\n• ",
 | 
			
		||||
                NadekoBot.CommandService.Modules.GroupBy(mi => mi.GetTopLevelModule()).Select(m => m.Key.Name).OrderBy(m => m)) +
 | 
			
		||||
                        $"\n``` ℹ️ **Type** `-commands module_name` **to get a list of commands in that module.** ***e.g.*** `-commands games`")
 | 
			
		||||
                 mdls) + $"\n``` ℹ️ **Type** `-commands module_name` **to get a list of commands in that module.** ***e.g.*** `-commands games`")
 | 
			
		||||
                                       .ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -130,6 +130,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
                    {
 | 
			
		||||
                        Console.WriteLine("Music thread almost crashed.");
 | 
			
		||||
                        Console.WriteLine(ex);
 | 
			
		||||
                        await Task.Delay(30000);
 | 
			
		||||
                    }
 | 
			
		||||
                    finally
 | 
			
		||||
                    {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,22 +24,22 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
        public string Query { get; set; }
 | 
			
		||||
        public string Title { get; set; }
 | 
			
		||||
        public string Uri { get; set; }
 | 
			
		||||
	public string AlbumArt { get; set; }
 | 
			
		||||
    public string AlbumArt { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class Song
 | 
			
		||||
    {
 | 
			
		||||
	public StreamState State { get; set; }
 | 
			
		||||
    public StreamState State { get; set; }
 | 
			
		||||
        public string PrettyName =>
 | 
			
		||||
            $"**{SongInfo.Title.TrimTo(55)} `{(SongInfo.Provider ?? "-")} by {QueuerName}`**";
 | 
			
		||||
	    //$"{SongInfo.Title.TrimTo(70)}";
 | 
			
		||||
        //$"{SongInfo.Title.TrimTo(70)}";
 | 
			
		||||
        public SongInfo SongInfo { get; }
 | 
			
		||||
        public MusicPlayer MusicPlayer { get; set; }
 | 
			
		||||
		
 | 
			
		||||
		public string PrettyUser =>
 | 
			
		||||
        
 | 
			
		||||
        public string PrettyUser =>
 | 
			
		||||
            $"{QueuerName}";
 | 
			
		||||
        public string QueuerName { get; set; }
 | 
			
		||||
		
 | 
			
		||||
		public string PrettyProvider =>
 | 
			
		||||
        
 | 
			
		||||
        public string PrettyProvider =>
 | 
			
		||||
            $"{(SongInfo.Provider ?? "No Provider")}";
 | 
			
		||||
 | 
			
		||||
        public string PrettyCurrentTime()
 | 
			
		||||
@@ -320,7 +320,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
                        Uri = svideo.StreamLink,
 | 
			
		||||
                        ProviderType = musicType,
 | 
			
		||||
                        Query = svideo.TrackLink,
 | 
			
		||||
			AlbumArt = svideo.artwork_url,
 | 
			
		||||
            AlbumArt = svideo.artwork_url,
 | 
			
		||||
                    })
 | 
			
		||||
                    { TotalLength = TimeSpan.FromMilliseconds(svideo.Duration) };
 | 
			
		||||
                }
 | 
			
		||||
@@ -335,7 +335,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
                        Uri = svideo.StreamLink,
 | 
			
		||||
                        ProviderType = MusicType.Normal,
 | 
			
		||||
                        Query = svideo.TrackLink,
 | 
			
		||||
			AlbumArt = svideo.artwork_url,
 | 
			
		||||
            AlbumArt = svideo.artwork_url,
 | 
			
		||||
                    })
 | 
			
		||||
                    { TotalLength = TimeSpan.FromMilliseconds(svideo.Duration) };
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
                var battletag = query.Replace("#", "-");
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    await Context.Channel.TriggerTypingAsync().ConfigureAwait(false);
 | 
			
		||||
                    var model = await GetProfile(region, battletag);
 | 
			
		||||
                        
 | 
			
		||||
                    var rankimg = $"{model.Competitive.rank_img}";
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
                            "Equals",
 | 
			
		||||
                            "GetHashCode",
 | 
			
		||||
                            "GetType"});
 | 
			
		||||
                await Context.Channel.SendConfirmAsync(string.Join(", ", selection));
 | 
			
		||||
                await Context.Channel.SendConfirmAsync("Available functions in calc", string.Join(", ", selection));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -125,11 +125,27 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
                return;
 | 
			
		||||
            if (target != null)
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendConfirmAsync($"⚔ **Page #{page} of roles for {target.Username}**", $"```css\n• " + string.Join("\n• ", target.GetRoles().Except(new[] { guild.EveryoneRole }).OrderBy(r => -r.Position).Skip((page - 1) * RolesPerPage).Take(RolesPerPage)).SanitizeMentions() + "\n```");
 | 
			
		||||
                var roles = target.GetRoles().Except(new[] { guild.EveryoneRole }).OrderBy(r => -r.Position).Skip((page - 1) * RolesPerPage).Take(RolesPerPage);
 | 
			
		||||
                if (!roles.Any())
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendErrorAsync("No roles on this page.");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendConfirmAsync($"⚔ **Page #{page} of roles for {target.Username}**", $"```css\n• " + string.Join("\n• ", roles).SanitizeMentions() + "\n```");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendConfirmAsync($"⚔ **Page #{page} of all roles on this server:**", $"```css\n• " + string.Join("\n• ", guild.Roles.Except(new[] { guild.EveryoneRole }).OrderBy(r => -r.Position).Skip((page - 1) * RolesPerPage).Take(RolesPerPage)).SanitizeMentions() + "\n```");
 | 
			
		||||
                var roles = guild.Roles.Except(new[] { guild.EveryoneRole }).OrderBy(r => -r.Position).Skip((page - 1) * RolesPerPage).Take(RolesPerPage);
 | 
			
		||||
                if (!roles.Any())
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendErrorAsync("No roles on this page.");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    await channel.SendConfirmAsync($"⚔ **Page #{page} of all roles on this server:**", $"```css\n• " + string.Join("\n• ", roles).SanitizeMentions() + "\n```");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -135,15 +135,15 @@ namespace NadekoBot.Services
 | 
			
		||||
            catch { }
 | 
			
		||||
 | 
			
		||||
            string messageContent = usrMsg.Content;
 | 
			
		||||
            foreach (var k in NadekoBot.ModulePrefixes.Values)
 | 
			
		||||
            {
 | 
			
		||||
                if (usrMsg.Content.ToLowerInvariant().StartsWith(k))
 | 
			
		||||
                {
 | 
			
		||||
                    messageContent = messageContent.Insert(k.Length, " ");
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            //foreach (var k in NadekoBot.ModulePrefixes.Values)
 | 
			
		||||
            //{
 | 
			
		||||
            //    if (usrMsg.Content.ToLowerInvariant().StartsWith(k))
 | 
			
		||||
            //    {
 | 
			
		||||
            //        messageContent = messageContent.Insert(k.Length, " ");
 | 
			
		||||
            //        break;
 | 
			
		||||
            //    }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            var throwaway = Task.Run(async () =>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ namespace NadekoBot.Services
 | 
			
		||||
{
 | 
			
		||||
    public static class CurrencyHandler
 | 
			
		||||
    {
 | 
			
		||||
        public static async Task<bool> RemoveCurrencyAsync(IGuildUser author, string reason, long amount, bool sendMessage)
 | 
			
		||||
        public static async Task<bool> RemoveCurrencyAsync(IUser author, string reason, long amount, bool sendMessage)
 | 
			
		||||
        {
 | 
			
		||||
            var success = await RemoveCurrencyAsync(author.Id, reason, amount);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -167,7 +167,8 @@ namespace NadekoBot.Services.Impl
 | 
			
		||||
                remaining -= toGet;
 | 
			
		||||
 | 
			
		||||
                var q = yt.Videos.List("contentDetails");
 | 
			
		||||
                q.Id = string.Join(",", videoIds);
 | 
			
		||||
                q.Id = string.Join(",", videoIdsList.Take(toGet));
 | 
			
		||||
                videoIdsList = videoIdsList.Skip(toGet).ToList();
 | 
			
		||||
                var items = (await q.ExecuteAsync().ConfigureAwait(false)).Items;
 | 
			
		||||
                foreach (var i in items)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,7 +10,7 @@ namespace NadekoBot.TypeReaders
 | 
			
		||||
        public override Task<TypeReaderResult> Read(CommandContext context, string input)
 | 
			
		||||
        {
 | 
			
		||||
            input = input.ToUpperInvariant();
 | 
			
		||||
            var module = NadekoBot.CommandService.Modules.FirstOrDefault(m => m.Name.ToUpperInvariant() == input);
 | 
			
		||||
            var module = NadekoBot.CommandService.Modules.GroupBy(m => m.GetTopLevelModule()).FirstOrDefault(m => m.Key.Name.ToUpperInvariant() == input);
 | 
			
		||||
            if (module == null)
 | 
			
		||||
                return Task.FromResult(TypeReaderResult.FromError(CommandError.ParseFailed, "No such module found."));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -79,34 +79,34 @@ namespace NadekoBot.Extensions
 | 
			
		||||
 | 
			
		||||
        public static double UnixTimestamp(this DateTime dt) => dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendMessageAsync(this IGuildUser user, string message, bool isTTS = false) =>
 | 
			
		||||
        public static async Task<IUserMessage> SendMessageAsync(this IUser user, string message, bool isTTS = false) =>
 | 
			
		||||
            await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(message, isTTS).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendConfirmAsync(this IGuildUser user, string text)
 | 
			
		||||
        public static async Task<IUserMessage> SendConfirmAsync(this IUser user, string text)
 | 
			
		||||
             => await (await user.CreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithColor(NadekoBot.OkColor).WithDescription(text));
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendConfirmAsync(this IGuildUser user, string title, string text, string url = null)
 | 
			
		||||
        public static async Task<IUserMessage> SendConfirmAsync(this IUser user, string title, string text, string url = null)
 | 
			
		||||
             => await(await user.CreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithColor(NadekoBot.OkColor).WithDescription(text)
 | 
			
		||||
                 .WithTitle(title).WithUrl(url));
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendErrorAsync(this IGuildUser user, string title, string error, string url = null)
 | 
			
		||||
        public static async Task<IUserMessage> SendErrorAsync(this IUser user, string title, string error, string url = null)
 | 
			
		||||
             => await (await user.CreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithColor(NadekoBot.OkColor).WithDescription(error)
 | 
			
		||||
                 .WithTitle(title).WithUrl(url));
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendErrorAsync(this IGuildUser user, string error)
 | 
			
		||||
        public static async Task<IUserMessage> SendErrorAsync(this IUser user, string error)
 | 
			
		||||
             => await (await user.CreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithColor(NadekoBot.OkColor).WithDescription(error));
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendFileAsync(this IGuildUser user, string filePath, string caption = null, string text = null, bool isTTS = false) =>
 | 
			
		||||
        public static async Task<IUserMessage> SendFileAsync(this IUser user, string filePath, string caption = null, string text = null, bool isTTS = false) =>
 | 
			
		||||
            await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(File.Open(filePath, FileMode.Open), caption ?? "x", text, isTTS).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static async Task<IUserMessage> SendFileAsync(this IGuildUser user, Stream fileStream, string fileName, string caption = null, bool isTTS = false) =>
 | 
			
		||||
        public static async Task<IUserMessage> SendFileAsync(this IUser user, Stream fileStream, string fileName, string caption = null, bool isTTS = false) =>
 | 
			
		||||
            await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(fileStream, fileName, caption, isTTS).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static bool IsAuthor(this IUserMessage msg) =>
 | 
			
		||||
            NadekoBot.Client.CurrentUser().Id == msg.Author.Id;
 | 
			
		||||
 | 
			
		||||
        public static IEnumerable<IUser> Members(this IRole role) =>
 | 
			
		||||
            role.Guild.GetUsersAsync().GetAwaiter().GetResult() ?? Enumerable.Empty<IUser>();
 | 
			
		||||
            role.Guild.GetUsersAsync().GetAwaiter().GetResult().Where(u => u.RoleIds.Contains(role.Id)) ?? Enumerable.Empty<IUser>();
 | 
			
		||||
        
 | 
			
		||||
        public static Task<IUserMessage> EmbedAsync(this IMessageChannel ch, EmbedBuilder embed, string msg = "")
 | 
			
		||||
             => ch.SendMessageAsync(msg, embed: embed);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user