All modules compile, except log commands. Working on todos now
This commit is contained in:
		| @@ -1,8 +1,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using Discord.Commands; | ||||
| using System; | ||||
| using NadekoBot.Services.Impl; | ||||
| using Discord; | ||||
| using NadekoBot.Services; | ||||
|  | ||||
| namespace NadekoBot.Attributes | ||||
|   | ||||
| @@ -1,8 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Runtime.CompilerServices; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.DataStructures | ||||
|   | ||||
| @@ -1,11 +1,6 @@ | ||||
| using Discord; | ||||
| using Newtonsoft.Json; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.DataStructures | ||||
| { | ||||
|   | ||||
| @@ -1,10 +1,6 @@ | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.DataStructures | ||||
| { | ||||
|   | ||||
| @@ -1,9 +1,5 @@ | ||||
| using Discord; | ||||
| using Discord.WebSocket; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.DataStructures.ModuleBehaviors | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Services.CustomReactions; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| @@ -29,37 +30,43 @@ namespace NadekoBot.TypeReaders | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     //public class CommandOrCrTypeReader : CommandTypeReader | ||||
|     //{ | ||||
|     //    public override async Task<TypeReaderResult> Read(ICommandContext context, string input) | ||||
|     //    { | ||||
|     //        input = input.ToUpperInvariant(); | ||||
|     public class CommandOrCrTypeReader : CommandTypeReader | ||||
|     { | ||||
|         private readonly CustomReactionsService _crs; | ||||
|  | ||||
|     //        if (CustomReactions.GlobalReactions.Any(x => x.Trigger.ToUpperInvariant() == input)) | ||||
|     //        { | ||||
|     //            return TypeReaderResult.FromSuccess(new CommandOrCrInfo(input)); | ||||
|     //        } | ||||
|     //        var guild = context.Guild; | ||||
|     //        if (guild != null) | ||||
|     //        { | ||||
|     //            CustomReaction[] crs; | ||||
|     //            if (CustomReactions.GuildReactions.TryGetValue(guild.Id, out crs)) | ||||
|     //            { | ||||
|     //                if (crs.Any(x => x.Trigger.ToUpperInvariant() == input)) | ||||
|     //                { | ||||
|     //                    return TypeReaderResult.FromSuccess(new CommandOrCrInfo(input)); | ||||
|     //                } | ||||
|     //            } | ||||
|     //        } | ||||
|         public CommandOrCrTypeReader(CustomReactionsService crs, CommandService cmds) : base(cmds) | ||||
|         { | ||||
|             _crs = crs; | ||||
|         } | ||||
|  | ||||
|     //        var cmd = await base.Read(context, input); | ||||
|     //        if (cmd.IsSuccess) | ||||
|     //        { | ||||
|     //            return TypeReaderResult.FromSuccess(new CommandOrCrInfo(((CommandInfo)cmd.Values.First().Value).Aliases.First())); | ||||
|     //        } | ||||
|     //        return TypeReaderResult.FromError(CommandError.ParseFailed, "No such command or cr found."); | ||||
|     //    } | ||||
|     //} | ||||
|         public override async Task<TypeReaderResult> Read(ICommandContext context, string input) | ||||
|         { | ||||
|             input = input.ToUpperInvariant(); | ||||
|  | ||||
|             if (_crs.GlobalReactions.Any(x => x.Trigger.ToUpperInvariant() == input)) | ||||
|             { | ||||
|                 return TypeReaderResult.FromSuccess(new CommandOrCrInfo(input)); | ||||
|             } | ||||
|             var guild = context.Guild; | ||||
|             if (guild != null) | ||||
|             { | ||||
|                 if (_crs.GuildReactions.TryGetValue(guild.Id, out var crs)) | ||||
|                 { | ||||
|                     if (crs.Concat(_crs.GlobalReactions).Any(x => x.Trigger.ToUpperInvariant() == input)) | ||||
|                     { | ||||
|                         return TypeReaderResult.FromSuccess(new CommandOrCrInfo(input)); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             var cmd = await base.Read(context, input); | ||||
|             if (cmd.IsSuccess) | ||||
|             { | ||||
|                 return TypeReaderResult.FromSuccess(new CommandOrCrInfo(((CommandInfo)cmd.Values.First().Value).Aliases.First())); | ||||
|             } | ||||
|             return TypeReaderResult.FromError(CommandError.ParseFailed, "No such command or cr found."); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public class CommandOrCrInfo | ||||
|     { | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|   | ||||
| @@ -24,38 +24,6 @@ namespace NadekoBot.Modules.Administration | ||||
|             _admin = admin; | ||||
|         } | ||||
|  | ||||
|         ////todo permissions | ||||
|         //[NadekoCommand, Usage, Description, Aliases] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //[RequireUserPermission(GuildPermission.Administrator)] | ||||
|         //public async Task ResetPermissions() | ||||
|         //{ | ||||
|         //    using (var uow = _db.UnitOfWork) | ||||
|         //    { | ||||
|         //        var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||
|         //        config.Permissions = Permissionv2.GetDefaultPermlist; | ||||
|         //        await uow.CompleteAsync(); | ||||
|         //        UpdateCache(config); | ||||
|         //    } | ||||
|         //    await ReplyConfirmLocalized("perms_reset").ConfigureAwait(false); | ||||
|         //} | ||||
|         //[NadekoCommand, Usage, Description, Aliases] | ||||
|         //[OwnerOnly] | ||||
|         //public async Task ResetGlobalPermissions() | ||||
|         //{ | ||||
|         //    using (var uow = _db.UnitOfWork) | ||||
|         //    { | ||||
|         //        var gc = uow.BotConfig.GetOrCreate(); | ||||
|         //        gc.BlockedCommands.Clear(); | ||||
|         //        gc.BlockedModules.Clear(); | ||||
|  | ||||
|         //        GlobalPermissionCommands.BlockedCommands.Clear(); | ||||
|         //        GlobalPermissionCommands.BlockedModules.Clear(); | ||||
|         //        await uow.CompleteAsync(); | ||||
|         //    } | ||||
|         //    await ReplyConfirmLocalized("global_perms_reset").ConfigureAwait(false); | ||||
|         //} | ||||
|  | ||||
|         [NadekoCommand, Usage, Description, Aliases] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequireUserPermission(GuildPermission.Administrator)] | ||||
|   | ||||
| @@ -400,9 +400,9 @@ namespace NadekoBot.Modules.Administration | ||||
|                 }); | ||||
|  | ||||
|                 //Blacklist | ||||
|                 var blacklist = new HashSet<BlacklistItem>(oldConfig.ServerBlacklist.Select(server => new BlacklistItem() { ItemId = server, Type = BlacklistItem.BlacklistType.Server })); | ||||
|                 blacklist.AddRange(oldConfig.ChannelBlacklist.Select(channel => new BlacklistItem() { ItemId = channel, Type = BlacklistItem.BlacklistType.Channel })); | ||||
|                 blacklist.AddRange(oldConfig.UserBlacklist.Select(user => new BlacklistItem() { ItemId = user, Type = BlacklistItem.BlacklistType.User })); | ||||
|                 var blacklist = new HashSet<BlacklistItem>(oldConfig.ServerBlacklist.Select(server => new BlacklistItem() { ItemId = server, Type = BlacklistType.Server })); | ||||
|                 blacklist.AddRange(oldConfig.ChannelBlacklist.Select(channel => new BlacklistItem() { ItemId = channel, Type = BlacklistType.Channel })); | ||||
|                 blacklist.AddRange(oldConfig.UserBlacklist.Select(user => new BlacklistItem() { ItemId = user, Type = BlacklistType.User })); | ||||
|                 botConfig.Blacklist = blacklist; | ||||
|  | ||||
|                 //Eightball | ||||
|   | ||||
| @@ -1,16 +1,9 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Administration; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
|   | ||||
| @@ -1,18 +1,13 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Administration; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
|   | ||||
| @@ -12,9 +12,6 @@ using Discord.WebSocket; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using System.Collections.Immutable; | ||||
| using NadekoBot.DataStructures; | ||||
| using NLog; | ||||
| using NadekoBot.Services.Administration; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| @@ -32,7 +31,7 @@ namespace NadekoBot.Modules.Administration | ||||
|             [RequireUserPermission(GuildPermission.ManageRoles)] | ||||
|             [RequireUserPermission(GuildPermission.ManageChannels)] | ||||
|             [RequireBotPermission(GuildPermission.ManageRoles)] | ||||
|             // todo wait for the fix [RequireBotPermission(GuildPermission.ManageChannels)] | ||||
|             //todo discord.net [RequireBotPermission(GuildPermission.ManageChannels)] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task VcRole([Remainder]IRole role = null) | ||||
|             { | ||||
|   | ||||
| @@ -1,18 +1,13 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Administration; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
| using System.Linq; | ||||
| using System.Text.RegularExpressions; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using ImageSharp; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Gambling.Models; | ||||
|   | ||||
| @@ -6,7 +6,6 @@ using NadekoBot.Attributes; | ||||
| using NadekoBot.DataStructures; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using Discord; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
|   | ||||
| @@ -10,7 +10,6 @@ using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using System.Text; | ||||
|   | ||||
| @@ -1,17 +1,12 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Services.Games; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| @@ -81,9 +76,7 @@ namespace NadekoBot.Modules.Games | ||||
|  | ||||
|                 var imgData = _games.GetRandomCurrencyImage(); | ||||
|  | ||||
|                 //todo upload all currency images to transfer.sh and use that one as cdn | ||||
|                 //and then  | ||||
|  | ||||
|                 //todo 81 upload all currency images to transfer.sh and use that one as cdn | ||||
|                 var msgToSend = GetText("planted", | ||||
|                     Format.Bold(Context.User.ToString()), | ||||
|                     amount + _bc.CurrencySign, | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using System; | ||||
| using Discord; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Attributes; | ||||
| @@ -9,7 +8,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using ImageSharp.Processing; | ||||
| using NadekoBot.Services; | ||||
|  | ||||
| namespace NadekoBot.Modules.Games | ||||
|   | ||||
| @@ -4,16 +4,7 @@ using NadekoBot.Services; | ||||
| using System.Threading.Tasks; | ||||
| using NadekoBot.Attributes; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using System.Collections.Immutable; | ||||
| using System.IO; | ||||
| using System.Threading; | ||||
| using NadekoBot.Extensions; | ||||
| using System.Net.Http; | ||||
| using ImageSharp; | ||||
| using NadekoBot.DataStructures; | ||||
| using NLog; | ||||
| using NadekoBot.Services.Games; | ||||
|  | ||||
| namespace NadekoBot.Modules.Games | ||||
|   | ||||
| @@ -357,7 +357,6 @@ namespace NadekoBot.Modules.Music | ||||
|             var cancelSource = new CancellationTokenSource(); | ||||
|  | ||||
|             var gusr = (IGuildUser)Context.User; | ||||
|             //todo use grouping | ||||
|             while (ids.Any() && !cancelSource.IsCancellationRequested) | ||||
|             { | ||||
|                 var tasks = Task.WhenAll(ids.Take(5).Select(async id => | ||||
|   | ||||
| @@ -3,7 +3,6 @@ using Discord.Commands; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Globalization; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|   | ||||
| @@ -1,12 +1,4 @@ | ||||
| using Discord; | ||||
| using NadekoBot.Extensions; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules | ||||
| namespace NadekoBot.Modules | ||||
| { | ||||
|     public static class NadekoModuleExtensions | ||||
|     { | ||||
|   | ||||
| @@ -1,14 +1,13 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Games.Trivia; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Services.Permissions; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using static NadekoBot.Services.Database.Models.BlacklistItem; | ||||
|  | ||||
| namespace NadekoBot.Modules.Permissions | ||||
| { | ||||
| @@ -23,19 +22,19 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [Group] | ||||
|         public class BlacklistCommands : NadekoSubmodule | ||||
|         { | ||||
|             public static ConcurrentHashSet<ulong> BlacklistedUsers { get; set; } | ||||
|             public static ConcurrentHashSet<ulong> BlacklistedGuilds { get; set; } | ||||
|             public static ConcurrentHashSet<ulong> BlacklistedChannels { get; set; } | ||||
|             private readonly BlacklistService _bs; | ||||
|             private readonly DbHandler _db; | ||||
|             private readonly IBotCredentials _creds; | ||||
|  | ||||
|             static BlacklistCommands() | ||||
|             private ConcurrentHashSet<ulong> BlacklistedUsers => _bs.BlacklistedUsers; | ||||
|             private ConcurrentHashSet<ulong> BlacklistedGuilds => _bs.BlacklistedGuilds; | ||||
|             private ConcurrentHashSet<ulong> BlacklistedChannels => _bs.BlacklistedChannels; | ||||
|  | ||||
|             public BlacklistCommands(BlacklistService bs, DbHandler db, IBotCredentials creds) | ||||
|             { | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var blacklist = uow.BotConfig.GetOrCreate().Blacklist; | ||||
|                     BlacklistedUsers = new ConcurrentHashSet<ulong>(blacklist.Where(bi => bi.Type == BlacklistType.User).Select(c => c.ItemId)); | ||||
|                     BlacklistedGuilds = new ConcurrentHashSet<ulong>(blacklist.Where(bi => bi.Type == BlacklistType.Server).Select(c => c.ItemId)); | ||||
|                     BlacklistedChannels = new ConcurrentHashSet<ulong>(blacklist.Where(bi => bi.Type == BlacklistType.Channel).Select(c => c.ItemId)); | ||||
|                 } | ||||
|                 _bs = bs; | ||||
|                 _db = db; | ||||
|                 _creds = creds; | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
| @@ -65,10 +64,10 @@ namespace NadekoBot.Modules.Permissions | ||||
|  | ||||
|             private async Task Blacklist(AddRemove action, ulong id, BlacklistType type) | ||||
|             { | ||||
|                 if(action == AddRemove.Add && NadekoBot.Credentials.OwnerIds.Contains(id)) | ||||
|                 if(action == AddRemove.Add && _creds.OwnerIds.Contains(id)) | ||||
|                     return; | ||||
|  | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     if (action == AddRemove.Add) | ||||
|                     { | ||||
|   | ||||
| @@ -5,6 +5,7 @@ using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Services.Permissions; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| @@ -13,24 +14,23 @@ namespace NadekoBot.Modules.Permissions | ||||
| { | ||||
|     public partial class Permissions | ||||
|     { | ||||
|  | ||||
|         public class ActiveCooldown | ||||
|         { | ||||
|             public string Command { get; set; } | ||||
|             public ulong UserId { get; set; } | ||||
|         } | ||||
|  | ||||
|         [Group] | ||||
|         public class CmdCdsCommands : NadekoSubmodule | ||||
|         { | ||||
|             public static ConcurrentDictionary<ulong, ConcurrentHashSet<CommandCooldown>> CommandCooldowns { get; } | ||||
|             private static ConcurrentDictionary<ulong, ConcurrentHashSet<ActiveCooldown>> activeCooldowns { get; } = new ConcurrentDictionary<ulong, ConcurrentHashSet<ActiveCooldown>>(); | ||||
|             private readonly DbHandler _db; | ||||
|             private readonly CmdCdService _service; | ||||
|  | ||||
|             static CmdCdsCommands() | ||||
|             private ConcurrentDictionary<ulong, ConcurrentHashSet<CommandCooldown>> CommandCooldowns  | ||||
|                 => _service.CommandCooldowns; | ||||
|             private ConcurrentDictionary<ulong, ConcurrentHashSet<ActiveCooldown>> ActiveCooldowns | ||||
|                 => _service.ActiveCooldowns; | ||||
|  | ||||
|             public CmdCdsCommands(CmdCdService service, DbHandler db) | ||||
|             { | ||||
|                 var configs = NadekoBot.AllGuildConfigs; | ||||
|                 CommandCooldowns = new ConcurrentDictionary<ulong, ConcurrentHashSet<CommandCooldown>>(configs.ToDictionary(k => k.GuildId, v => new ConcurrentHashSet<CommandCooldown>(v.CommandCooldowns))); | ||||
|                 _service = service; | ||||
|                 _db = db; | ||||
|             } | ||||
|              | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task CmdCooldown(CommandInfo command, int secs) | ||||
| @@ -42,7 +42,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.CommandCooldowns)); | ||||
|                     var localSet = CommandCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<CommandCooldown>()); | ||||
| @@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 } | ||||
|                 if (secs == 0) | ||||
|                 { | ||||
|                     var activeCds = activeCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<ActiveCooldown>()); | ||||
|                     var activeCds = ActiveCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<ActiveCooldown>()); | ||||
|                     activeCds.RemoveWhere(ac => ac.Command == command.Aliases.First().ToLowerInvariant()); | ||||
|                     await ReplyConfirmLocalized("cmdcd_cleared",  | ||||
|                         Format.Bold(command.Aliases.First())).ConfigureAwait(false); | ||||
| @@ -89,15 +89,15 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     await channel.SendTableAsync("", localSet.Select(c => c.CommandName + ": " + c.Seconds + GetText("sec")), s => $"{s,-30}", 2).ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|             public static bool HasCooldown(CommandInfo cmd, IGuild guild, IUser user) | ||||
|             public bool HasCooldown(CommandInfo cmd, IGuild guild, IUser user) | ||||
|             { | ||||
|                 if (guild == null) | ||||
|                     return false; | ||||
|                 var cmdcds = CmdCdsCommands.CommandCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet<CommandCooldown>()); | ||||
|                 var cmdcds = CommandCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet<CommandCooldown>()); | ||||
|                 CommandCooldown cdRule; | ||||
|                 if ((cdRule = cmdcds.FirstOrDefault(cc => cc.CommandName == cmd.Aliases.First().ToLowerInvariant())) != null) | ||||
|                 { | ||||
|                     var activeCdsForGuild = activeCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet<ActiveCooldown>()); | ||||
|                     var activeCdsForGuild = ActiveCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet<ActiveCooldown>()); | ||||
|                     if (activeCdsForGuild.FirstOrDefault(ac => ac.UserId == user.Id && ac.Command == cmd.Aliases.First().ToLowerInvariant()) != null) | ||||
|                     { | ||||
|                         return true; | ||||
|   | ||||
| @@ -1,16 +1,6 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using Discord.Commands; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Permissions | ||||
| { | ||||
| @@ -67,7 +57,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             //        Cost = cost | ||||
|             //    }; | ||||
|  | ||||
|             //    using (var uow = DbHandler.UnitOfWork()) | ||||
|             //    using (var uow = _db.UnitOfWork) | ||||
|             //    { | ||||
|             //        var bc = uow.BotConfig.GetOrCreate(); | ||||
|                      | ||||
|   | ||||
| @@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Permissions; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Permissions | ||||
| @@ -15,46 +15,13 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [Group] | ||||
|         public class FilterCommands : NadekoSubmodule | ||||
|         { | ||||
|             public static ConcurrentHashSet<ulong> InviteFilteringChannels { get; } | ||||
|             public static ConcurrentHashSet<ulong> InviteFilteringServers { get; } | ||||
|             private readonly DbHandler _db; | ||||
|             private readonly FilterService _service; | ||||
|  | ||||
|             //serverid, filteredwords | ||||
|             private static ConcurrentDictionary<ulong, ConcurrentHashSet<string>> serverFilteredWords { get; } | ||||
|  | ||||
|             public static ConcurrentHashSet<ulong> WordFilteringChannels { get; } | ||||
|             public static ConcurrentHashSet<ulong> WordFilteringServers { get; } | ||||
|  | ||||
|             public static ConcurrentHashSet<string> FilteredWordsForChannel(ulong channelId, ulong guildId) | ||||
|             public FilterCommands(FilterService service, DbHandler db) | ||||
|             { | ||||
|                 ConcurrentHashSet<string> words = new ConcurrentHashSet<string>(); | ||||
|                 if(WordFilteringChannels.Contains(channelId)) | ||||
|                     serverFilteredWords.TryGetValue(guildId, out words); | ||||
|                 return words; | ||||
|             } | ||||
|  | ||||
|             public static ConcurrentHashSet<string> FilteredWordsForServer(ulong guildId) | ||||
|             { | ||||
|                 var words = new ConcurrentHashSet<string>(); | ||||
|                 if(WordFilteringServers.Contains(guildId)) | ||||
|                     serverFilteredWords.TryGetValue(guildId, out words); | ||||
|                 return words; | ||||
|             } | ||||
|  | ||||
|             static FilterCommands() | ||||
|             { | ||||
|                 var guildConfigs = NadekoBot.AllGuildConfigs; | ||||
|  | ||||
|                 InviteFilteringServers = new ConcurrentHashSet<ulong>(guildConfigs.Where(gc => gc.FilterInvites).Select(gc => gc.GuildId)); | ||||
|                 InviteFilteringChannels = new ConcurrentHashSet<ulong>(guildConfigs.SelectMany(gc => gc.FilterInvitesChannelIds.Select(fci => fci.ChannelId))); | ||||
|  | ||||
|                 var dict = guildConfigs.ToDictionary(gc => gc.GuildId, gc => new ConcurrentHashSet<string>(gc.FilteredWords.Select(fw => fw.Word))); | ||||
|  | ||||
|                 serverFilteredWords = new ConcurrentDictionary<ulong, ConcurrentHashSet<string>>(dict); | ||||
|  | ||||
|                 var serverFiltering = guildConfigs.Where(gc => gc.FilterWords); | ||||
|                 WordFilteringServers = new ConcurrentHashSet<ulong>(serverFiltering.Select(gc => gc.GuildId)); | ||||
|  | ||||
|                 WordFilteringChannels = new ConcurrentHashSet<ulong>(guildConfigs.SelectMany(gc => gc.FilterWordsChannelIds.Select(fwci => fwci.ChannelId))); | ||||
|                 _service = service; | ||||
|                 _db = db; | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
| @@ -64,7 +31,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 bool enabled; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set); | ||||
|                     enabled = config.FilterInvites = !config.FilterInvites; | ||||
| @@ -73,12 +40,12 @@ namespace NadekoBot.Modules.Permissions | ||||
|                  | ||||
|                 if (enabled) | ||||
|                 { | ||||
|                     InviteFilteringServers.Add(channel.Guild.Id); | ||||
|                     _service.InviteFilteringServers.Add(channel.Guild.Id); | ||||
|                     await ReplyConfirmLocalized("invite_filter_server_on").ConfigureAwait(false); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     InviteFilteringServers.TryRemove(channel.Guild.Id); | ||||
|                     _service.InviteFilteringServers.TryRemove(channel.Guild.Id); | ||||
|                     await ReplyConfirmLocalized("invite_filter_server_off").ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
| @@ -90,7 +57,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 int removed; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.FilterInvitesChannelIds)); | ||||
|                     removed = config.FilterInvitesChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); | ||||
| @@ -106,7 +73,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|  | ||||
|                 if (removed == 0) | ||||
|                 { | ||||
|                     InviteFilteringChannels.Add(channel.Id); | ||||
|                     _service.InviteFilteringChannels.Add(channel.Id); | ||||
|                     await ReplyConfirmLocalized("invite_filter_channel_on").ConfigureAwait(false); | ||||
|                 } | ||||
|                 else | ||||
| @@ -122,7 +89,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 bool enabled; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set); | ||||
|                     enabled = config.FilterWords = !config.FilterWords; | ||||
| @@ -131,12 +98,12 @@ namespace NadekoBot.Modules.Permissions | ||||
|  | ||||
|                 if (enabled) | ||||
|                 { | ||||
|                     WordFilteringServers.Add(channel.Guild.Id); | ||||
|                     _service.WordFilteringServers.Add(channel.Guild.Id); | ||||
|                     await ReplyConfirmLocalized("word_filter_server_on").ConfigureAwait(false); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     WordFilteringServers.TryRemove(channel.Guild.Id); | ||||
|                     _service.WordFilteringServers.TryRemove(channel.Guild.Id); | ||||
|                     await ReplyConfirmLocalized("word_filter_server_off").ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
| @@ -148,7 +115,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 int removed; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.FilterWordsChannelIds)); | ||||
|                     removed = config.FilterWordsChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); | ||||
| @@ -164,12 +131,12 @@ namespace NadekoBot.Modules.Permissions | ||||
|  | ||||
|                 if (removed == 0) | ||||
|                 { | ||||
|                     WordFilteringChannels.Add(channel.Id); | ||||
|                     _service.WordFilteringChannels.Add(channel.Id); | ||||
|                     await ReplyConfirmLocalized("word_filter_channel_on").ConfigureAwait(false); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     WordFilteringChannels.TryRemove(channel.Id); | ||||
|                     _service.WordFilteringChannels.TryRemove(channel.Id); | ||||
|                     await ReplyConfirmLocalized("word_filter_channel_off").ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
| @@ -186,7 +153,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     return; | ||||
|  | ||||
|                 int removed; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.FilteredWords)); | ||||
|  | ||||
| @@ -198,7 +165,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|  | ||||
|                 var filteredWords = serverFilteredWords.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<string>()); | ||||
|                 var filteredWords = _service.ServerFilteredWords.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<string>()); | ||||
|  | ||||
|                 if (removed == 0) | ||||
|                 { | ||||
| @@ -218,8 +185,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             { | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 ConcurrentHashSet<string> filteredWords; | ||||
|                 serverFilteredWords.TryGetValue(channel.Guild.Id, out filteredWords); | ||||
|                 _service.ServerFilteredWords.TryGetValue(channel.Guild.Id, out ConcurrentHashSet<string> filteredWords); | ||||
|  | ||||
|                 await channel.SendConfirmAsync(GetText("filter_word_list"), string.Join("\n", filteredWords)) | ||||
|                         .ConfigureAwait(false); | ||||
|   | ||||
| @@ -1,16 +1,11 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.DataStructures; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Permissions; | ||||
| using NadekoBot.TypeReaders; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Permissions | ||||
| @@ -20,20 +15,20 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [Group] | ||||
|         public class GlobalPermissionCommands : NadekoSubmodule | ||||
|         { | ||||
|             public static readonly ConcurrentHashSet<string> BlockedModules; | ||||
|             public static readonly ConcurrentHashSet<string> BlockedCommands; | ||||
|             private GlobalPermissionService _service; | ||||
|             private readonly DbHandler _db; | ||||
|  | ||||
|             static GlobalPermissionCommands() | ||||
|             public GlobalPermissionCommands(GlobalPermissionService service, DbHandler db) | ||||
|             { | ||||
|                 BlockedModules = new ConcurrentHashSet<string>(NadekoBot.BotConfig.BlockedModules.Select(x => x.Name)); | ||||
|                 BlockedCommands = new ConcurrentHashSet<string>(NadekoBot.BotConfig.BlockedCommands.Select(x => x.Name)); | ||||
|                 _service = service; | ||||
|                 _db = db; | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [OwnerOnly] | ||||
|             public async Task Lgp() | ||||
|             { | ||||
|                 if (!BlockedModules.Any() && !BlockedCommands.Any()) | ||||
|                 if (!_service.BlockedModules.Any() && !_service.BlockedCommands.Any()) | ||||
|                 { | ||||
|                     await ReplyErrorLocalized("lgp_none").ConfigureAwait(false); | ||||
|                     return; | ||||
| @@ -41,11 +36,11 @@ namespace NadekoBot.Modules.Permissions | ||||
|  | ||||
|                 var embed = new EmbedBuilder().WithOkColor(); | ||||
|  | ||||
|                 if (BlockedModules.Any()) | ||||
|                     embed.AddField(efb => efb.WithName(GetText("blocked_modules")).WithValue(string.Join("\n", BlockedModules)).WithIsInline(false)); | ||||
|                 if (_service.BlockedModules.Any()) | ||||
|                     embed.AddField(efb => efb.WithName(GetText("blocked_modules")).WithValue(string.Join("\n", _service.BlockedModules)).WithIsInline(false)); | ||||
|  | ||||
|                 if (BlockedCommands.Any()) | ||||
|                     embed.AddField(efb => efb.WithName(GetText("blocked_commands")).WithValue(string.Join("\n", BlockedCommands)).WithIsInline(false)); | ||||
|                 if (_service.BlockedCommands.Any()) | ||||
|                     embed.AddField(efb => efb.WithName(GetText("blocked_commands")).WithValue(string.Join("\n", _service.BlockedCommands)).WithIsInline(false)); | ||||
|  | ||||
|                 await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); | ||||
|             } | ||||
| @@ -55,9 +50,9 @@ namespace NadekoBot.Modules.Permissions | ||||
|             public async Task Gmod(ModuleOrCrInfo module) | ||||
|             { | ||||
|                 var moduleName = module.Name.ToLowerInvariant(); | ||||
|                 if (BlockedModules.Add(moduleName)) | ||||
|                 if (_service.BlockedModules.Add(moduleName)) | ||||
|                 { | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     using (var uow = _db.UnitOfWork) | ||||
|                     { | ||||
|                         var bc = uow.BotConfig.GetOrCreate(); | ||||
|                         bc.BlockedModules.Add(new Services.Database.Models.BlockedCmdOrMdl | ||||
| @@ -69,9 +64,9 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     await ReplyConfirmLocalized("gmod_add", Format.Bold(module.Name)).ConfigureAwait(false); | ||||
|                     return; | ||||
|                 } | ||||
|                 else if (BlockedModules.TryRemove(moduleName)) | ||||
|                 else if (_service.BlockedModules.TryRemove(moduleName)) | ||||
|                 { | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     using (var uow = _db.UnitOfWork) | ||||
|                     { | ||||
|                         var bc = uow.BotConfig.GetOrCreate(); | ||||
|                         bc.BlockedModules.RemoveWhere(x => x.Name == moduleName); | ||||
| @@ -87,9 +82,9 @@ namespace NadekoBot.Modules.Permissions | ||||
|             public async Task Gcmd(CommandOrCrInfo cmd) | ||||
|             { | ||||
|                 var commandName = cmd.Name.ToLowerInvariant(); | ||||
|                 if (BlockedCommands.Add(commandName)) | ||||
|                 if (_service.BlockedCommands.Add(commandName)) | ||||
|                 { | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     using (var uow = _db.UnitOfWork) | ||||
|                     { | ||||
|                         var bc = uow.BotConfig.GetOrCreate(); | ||||
|                         bc.BlockedCommands.Add(new Services.Database.Models.BlockedCmdOrMdl | ||||
| @@ -101,9 +96,9 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     await ReplyConfirmLocalized("gcmd_add", Format.Bold(cmd.Name)).ConfigureAwait(false); | ||||
|                     return; | ||||
|                 } | ||||
|                 else if (BlockedCommands.TryRemove(commandName)) | ||||
|                 else if (_service.BlockedCommands.TryRemove(commandName)) | ||||
|                 { | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     using (var uow = _db.UnitOfWork) | ||||
|                     { | ||||
|                         var bc = uow.BotConfig.GetOrCreate(); | ||||
|                         bc.BlockedCommands.RemoveWhere(x => x.Name == commandName); | ||||
|   | ||||
| @@ -0,0 +1,62 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Services.Permissions; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Permissions.Commands | ||||
| { | ||||
|     public partial class Permissions | ||||
|     { | ||||
|         [Group] | ||||
|         public class ResetPermissionsCommands : NadekoSubmodule | ||||
|         { | ||||
|             private readonly PermissionsService _service; | ||||
|             private readonly DbHandler _db; | ||||
|             private readonly GlobalPermissionService _globalPerms; | ||||
|  | ||||
|             public ResetPermissionsCommands(PermissionsService service, GlobalPermissionService globalPerms, DbHandler db) | ||||
|             { | ||||
|                 _service = service; | ||||
|                 _db = db; | ||||
|                 _globalPerms = globalPerms; | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             [RequireUserPermission(GuildPermission.Administrator)] | ||||
|             public async Task ResetPermissions() | ||||
|             { | ||||
|                 //todo 80 move to service | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||
|                     config.Permissions = Permissionv2.GetDefaultPermlist; | ||||
|                     await uow.CompleteAsync(); | ||||
|                     _service.UpdateCache(config); | ||||
|                 } | ||||
|                 await ReplyConfirmLocalized("perms_reset").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [OwnerOnly] | ||||
|             public async Task ResetGlobalPermissions() | ||||
|             { | ||||
|                 //todo 80 move to service | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var gc = uow.BotConfig.GetOrCreate(); | ||||
|                     gc.BlockedCommands.Clear(); | ||||
|                     gc.BlockedModules.Clear(); | ||||
|  | ||||
|                     _globalPerms.BlockedCommands.Clear(); | ||||
|                     _globalPerms.BlockedModules.Clear(); | ||||
|                     await uow.CompleteAsync(); | ||||
|                 } | ||||
|                 await ReplyConfirmLocalized("global_perms_reset").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -6,169 +6,34 @@ using Discord.Commands; | ||||
| using NadekoBot.Services; | ||||
| using Discord; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using Discord.WebSocket; | ||||
| using System.Diagnostics; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.DataStructures; | ||||
| using NadekoBot.TypeReaders; | ||||
| using NLog; | ||||
| using NadekoBot.Services.Permissions; | ||||
|  | ||||
| namespace NadekoBot.Modules.Permissions | ||||
| { | ||||
|     [NadekoModule("Permissions", ";")] | ||||
|     public partial class Permissions : NadekoTopLevelModule | ||||
|     { | ||||
|         //guildid, root permission | ||||
|         public static ConcurrentDictionary<ulong, PermissionCache> Cache { get; } = | ||||
|             new ConcurrentDictionary<ulong, PermissionCache>(); | ||||
|         private readonly DbHandler _db; | ||||
|         private readonly PermissionsService _service; | ||||
|  | ||||
|         static Permissions() | ||||
|         public Permissions(PermissionsService service, DbHandler db) | ||||
|         { | ||||
|             var log = LogManager.GetCurrentClassLogger(); | ||||
|             var sw = Stopwatch.StartNew(); | ||||
|  | ||||
|             TryMigratePermissions(); | ||||
|  | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             { | ||||
|                 foreach (var x in uow.GuildConfigs.Permissionsv2ForAll()) | ||||
|                 { | ||||
|                     Cache.TryAdd(x.GuildId, new PermissionCache() | ||||
|                     { | ||||
|                         Verbose = x.VerbosePermissions, | ||||
|                         PermRole = x.PermissionRole, | ||||
|                         Permissions = new PermissionsCollection<Permissionv2>(x.Permissions) | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             sw.Stop(); | ||||
|             log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s"); | ||||
|         } | ||||
|  | ||||
|         public static PermissionCache GetCache(ulong guildId) | ||||
|         { | ||||
|             PermissionCache pc; | ||||
|             if (!Permissions.Cache.TryGetValue(guildId, out pc)) | ||||
|             { | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.For(guildId, | ||||
|                         set => set.Include(x => x.Permissions)); | ||||
|                     Permissions.UpdateCache(config); | ||||
|                 } | ||||
|                 Permissions.Cache.TryGetValue(guildId, out pc); | ||||
|                 if (pc == null) | ||||
|                     throw new Exception("Cache is null."); | ||||
|             } | ||||
|             return pc; | ||||
|         } | ||||
|  | ||||
|         private static void TryMigratePermissions() | ||||
|         { | ||||
|             var log = LogManager.GetCurrentClassLogger(); | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             { | ||||
|                 var oldCache = new ConcurrentDictionary<ulong, OldPermissionCache>(uow.GuildConfigs | ||||
|                     .OldPermissionsForAll() | ||||
|                     .Where(x => x.RootPermission != null) // there is a check inside already, but just in case | ||||
|                     .ToDictionary(k => k.GuildId, | ||||
|                         v => new OldPermissionCache() | ||||
|                         { | ||||
|                             RootPermission = v.RootPermission, | ||||
|                             Verbose = v.VerbosePermissions, | ||||
|                             PermRole = v.PermissionRole | ||||
|                         })); | ||||
|  | ||||
|                 if (oldCache.Any()) | ||||
|                 { | ||||
|                     log.Info("Old permissions found. Performing one-time migration to v2."); | ||||
|                     var i = 0; | ||||
|                     foreach (var oc in oldCache) | ||||
|                     { | ||||
|                         if (i % 3 == 0) | ||||
|                             log.Info("Migrating Permissions #" + i + " - GuildId: " + oc.Key); | ||||
|                         i++; | ||||
|                         var gc = uow.GuildConfigs.GcWithPermissionsv2For(oc.Key); | ||||
|  | ||||
|                         var oldPerms = oc.Value.RootPermission.AsEnumerable().Reverse().ToList(); | ||||
|                         uow._context.Set<Permission>().RemoveRange(oldPerms); | ||||
|                         gc.RootPermission = null; | ||||
|                         if (oldPerms.Count > 2) | ||||
|                         { | ||||
|  | ||||
|                             var newPerms = oldPerms.Take(oldPerms.Count - 1) | ||||
|                                 .Select(x => x.Tov2()) | ||||
|                                 .ToList(); | ||||
|  | ||||
|                             var allowPerm = Permissionv2.AllowAllPerm; | ||||
|                             var firstPerm = newPerms[0]; | ||||
|                             if (allowPerm.State != firstPerm.State || | ||||
|                                 allowPerm.PrimaryTarget != firstPerm.PrimaryTarget || | ||||
|                                 allowPerm.SecondaryTarget != firstPerm.SecondaryTarget || | ||||
|                                 allowPerm.PrimaryTargetId != firstPerm.PrimaryTargetId || | ||||
|                                 allowPerm.SecondaryTargetName != firstPerm.SecondaryTargetName) | ||||
|                                 newPerms.Insert(0, Permissionv2.AllowAllPerm); | ||||
|                             Cache.TryAdd(oc.Key, new PermissionCache | ||||
|                             { | ||||
|                                 Permissions = new PermissionsCollection<Permissionv2>(newPerms), | ||||
|                                 Verbose = gc.VerbosePermissions, | ||||
|                                 PermRole = gc.PermissionRole, | ||||
|                             }); | ||||
|                             gc.Permissions = newPerms; | ||||
|                         } | ||||
|                     } | ||||
|                     log.Info("Permission migration to v2 is done."); | ||||
|                     uow.Complete(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private static async Task AddPermissions(ulong guildId, params Permissionv2[] perms) | ||||
|         { | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             { | ||||
|                 var config = uow.GuildConfigs.GcWithPermissionsv2For(guildId); | ||||
|                 //var orderedPerms = new PermissionsCollection<Permissionv2>(config.Permissions); | ||||
|                 var max = config.Permissions.Max(x => x.Index); //have to set its index to be the highest | ||||
|                 foreach (var perm in perms) | ||||
|                 { | ||||
|                     perm.Index = ++max; | ||||
|                     config.Permissions.Add(perm); | ||||
|                 } | ||||
|                 await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 UpdateCache(config); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public static void UpdateCache(GuildConfig config) | ||||
|         { | ||||
|             Cache.AddOrUpdate(config.GuildId, new PermissionCache() | ||||
|             { | ||||
|                 Permissions = new PermissionsCollection<Permissionv2>(config.Permissions), | ||||
|                 PermRole = config.PermissionRole, | ||||
|                 Verbose = config.VerbosePermissions | ||||
|             }, (id, old) => | ||||
|             { | ||||
|                 old.Permissions = new PermissionsCollection<Permissionv2>(config.Permissions); | ||||
|                 old.PermRole = config.PermissionRole; | ||||
|                 old.Verbose = config.VerbosePermissions; | ||||
|                 return old; | ||||
|             }); | ||||
|             _db = db; | ||||
|             _service = service; | ||||
|         } | ||||
|  | ||||
|         [NadekoCommand, Usage, Description, Aliases] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Verbose(PermissionAction action) | ||||
|         { | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             using (var uow = _db.UnitOfWork) | ||||
|             { | ||||
|                 var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||
|                 config.VerbosePermissions = action.Value; | ||||
|                 await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 UpdateCache(config); | ||||
|                 _service.UpdateCache(config); | ||||
|             } | ||||
|             if (action.Value) | ||||
|             { | ||||
| @@ -187,7 +52,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             if (role != null && role == role.Guild.EveryoneRole) | ||||
|                 return; | ||||
|  | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             using (var uow = _db.UnitOfWork) | ||||
|             { | ||||
|                 var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||
|                 if (role == null) | ||||
| @@ -197,7 +62,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 } | ||||
|                 config.PermissionRole = role.Name.Trim(); | ||||
|                 await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 UpdateCache(config); | ||||
|                 _service.UpdateCache(config); | ||||
|             } | ||||
|  | ||||
|             await ReplyConfirmLocalized("permrole_changed", Format.Bold(role.Name)).ConfigureAwait(false); | ||||
| @@ -210,10 +75,9 @@ namespace NadekoBot.Modules.Permissions | ||||
|             if (page < 1) | ||||
|                 return; | ||||
|  | ||||
|             PermissionCache permCache; | ||||
|             IList<Permissionv2> perms; | ||||
|  | ||||
|             if (Cache.TryGetValue(Context.Guild.Id, out permCache)) | ||||
|             if (_service.Cache.TryGetValue(Context.Guild.Id, out var permCache)) | ||||
|             { | ||||
|                 perms = permCache.Permissions.Source.ToList(); | ||||
|             } | ||||
| @@ -249,7 +113,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             try | ||||
|             { | ||||
|                 Permissionv2 p; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||
|                     var permsCol = new PermissionsCollection<Permissionv2>(config.Permissions); | ||||
| @@ -257,7 +121,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                     permsCol.RemoveAt(index); | ||||
|                     uow._context.Remove(p); | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                     UpdateCache(config); | ||||
|                     _service.UpdateCache(config); | ||||
|                 } | ||||
|                 await ReplyConfirmLocalized("removed", | ||||
|                     index + 1, | ||||
| @@ -280,7 +144,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 try | ||||
|                 { | ||||
|                     Permissionv2 fromPerm; | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     using (var uow = _db.UnitOfWork) | ||||
|                     { | ||||
|                         var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||
|                         var permsCol = new PermissionsCollection<Permissionv2>(config.Permissions); | ||||
| @@ -304,7 +168,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                         permsCol.RemoveAt(from); | ||||
|                         permsCol.Insert(to, fromPerm); | ||||
|                         await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                         UpdateCache(config); | ||||
|                         _service.UpdateCache(config); | ||||
|                     } | ||||
|                     await ReplyConfirmLocalized("moved_permission", | ||||
|                             Format.Code(fromPerm.GetCommand((SocketGuild) Context.Guild)), | ||||
| @@ -324,7 +188,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task SrvrCmd(CommandOrCrInfo command, PermissionAction action) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Server, | ||||
|                 PrimaryTargetId = 0, | ||||
| @@ -351,7 +215,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task SrvrMdl(ModuleOrCrInfo module, PermissionAction action) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Server, | ||||
|                 PrimaryTargetId = 0, | ||||
| @@ -378,7 +242,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task UsrCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] IGuildUser user) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.User, | ||||
|                 PrimaryTargetId = user.Id, | ||||
| @@ -407,7 +271,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task UsrMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] IGuildUser user) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.User, | ||||
|                 PrimaryTargetId = user.Id, | ||||
| @@ -439,7 +303,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             if (role == role.Guild.EveryoneRole) | ||||
|                 return; | ||||
|  | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Role, | ||||
|                 PrimaryTargetId = role.Id, | ||||
| @@ -471,7 +335,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             if (role == role.Guild.EveryoneRole) | ||||
|                 return; | ||||
|  | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Role, | ||||
|                 PrimaryTargetId = role.Id, | ||||
| @@ -501,7 +365,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task ChnlCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] ITextChannel chnl) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Channel, | ||||
|                 PrimaryTargetId = chnl.Id, | ||||
| @@ -530,7 +394,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task ChnlMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] ITextChannel chnl) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Channel, | ||||
|                 PrimaryTargetId = chnl.Id, | ||||
| @@ -559,7 +423,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task AllChnlMdls(PermissionAction action, [Remainder] ITextChannel chnl) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Channel, | ||||
|                 PrimaryTargetId = chnl.Id, | ||||
| @@ -587,7 +451,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|             if (role == role.Guild.EveryoneRole) | ||||
|                 return; | ||||
|  | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.Role, | ||||
|                 PrimaryTargetId = role.Id, | ||||
| @@ -612,7 +476,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task AllUsrMdls(PermissionAction action, [Remainder] IUser user) | ||||
|         { | ||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||
|             { | ||||
|                 PrimaryTarget = PrimaryPermissionType.User, | ||||
|                 PrimaryTargetId = user.Id, | ||||
| @@ -655,7 +519,7 @@ namespace NadekoBot.Modules.Permissions | ||||
|                 State = true, | ||||
|             }; | ||||
|  | ||||
|             await AddPermissions(Context.Guild.Id, | ||||
|             await _service.AddPermissions(Context.Guild.Id, | ||||
|                 newPerm, | ||||
|                 allowUser); | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,9 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Searches.Models; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Searches; | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using NLog; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using Newtonsoft.Json; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | ||||
| using System.IO; | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches.Commands.Models | ||||
| { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches.Commands.Models | ||||
| namespace NadekoBot.Modules.Searches.Commands.Models | ||||
| { | ||||
|     public struct GoogleSearchResult | ||||
|     { | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using Newtonsoft.Json; | ||||
| using System; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches.Models | ||||
| { | ||||
|   | ||||
| @@ -1,9 +1,4 @@ | ||||
| using Newtonsoft.Json; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches.Commands.Models | ||||
| { | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches.Commands.Models | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using Discord; | ||||
| using Discord.API; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using Newtonsoft.Json; | ||||
|   | ||||
| @@ -2,12 +2,8 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Searches.Models; | ||||
| using NadekoBot.Services.Searches; | ||||
| using Newtonsoft.Json; | ||||
| using NLog; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,6 @@ using Discord; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using NadekoBot.Services; | ||||
| using System.Threading; | ||||
| using System.Collections.Generic; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Attributes; | ||||
|   | ||||
| @@ -2,11 +2,8 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using System; | ||||
| using System.Threading.Tasks; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Services.Searches; | ||||
| using NadekoBot.Services; | ||||
|  | ||||
|   | ||||
| @@ -6,6 +6,7 @@ using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Services.Utility; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|   | ||||
| @@ -3,9 +3,8 @@ using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using System; | ||||
| using NadekoBot.Services.Utility; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility | ||||
|   | ||||
| @@ -11,7 +11,7 @@ using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Modules.Utility.Models; | ||||
| using NadekoBot.Services.Utility; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility | ||||
| { | ||||
| @@ -20,11 +20,11 @@ namespace NadekoBot.Modules.Utility | ||||
|         [Group] | ||||
|         public class RepeatCommands : NadekoSubmodule | ||||
|         { | ||||
|             private readonly UtilityService _service; | ||||
|             private readonly MessageRepeaterService _service; | ||||
|             private readonly DiscordShardedClient _client; | ||||
|             private readonly DbHandler _db; | ||||
|  | ||||
|             public RepeatCommands(UtilityService service, DiscordShardedClient client, DbHandler db) | ||||
|             public RepeatCommands(MessageRepeaterService service, DiscordShardedClient client, DbHandler db) | ||||
|             { | ||||
|                 _service = service; | ||||
|                 _client = client; | ||||
|   | ||||
| @@ -4,12 +4,10 @@ using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NLog; | ||||
| using NadekoBot.Services.Utility; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text.RegularExpressions; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility | ||||
| @@ -19,10 +17,10 @@ namespace NadekoBot.Modules.Utility | ||||
|         [Group] | ||||
|         public class RemindCommands : NadekoSubmodule | ||||
|         { | ||||
|             private readonly UtilityService _service; | ||||
|             private readonly RemindService _service; | ||||
|             private readonly DbHandler _db; | ||||
|  | ||||
|             public RemindCommands(UtilityService service, DbHandler db) | ||||
|             public RemindCommands(RemindService service, DbHandler db) | ||||
|             { | ||||
|                 _service = service; | ||||
|                 _db = db; | ||||
| @@ -63,7 +61,7 @@ namespace NadekoBot.Modules.Utility | ||||
|  | ||||
|             public async Task RemindInternal(ulong targetId, bool isPrivate, string timeStr, [Remainder] string message) | ||||
|             { | ||||
|                 var m = _service.Remind.Regex.Match(timeStr); | ||||
|                 var m = _service.Regex.Match(timeStr); | ||||
|  | ||||
|                 if (m.Length == 0) | ||||
|                 { | ||||
| @@ -74,7 +72,7 @@ namespace NadekoBot.Modules.Utility | ||||
|                 string output = ""; | ||||
|                 var namesAndValues = new Dictionary<string, int>(); | ||||
|  | ||||
|                 foreach (var groupName in _service.Remind.Regex.GetGroupNames()) | ||||
|                 foreach (var groupName in _service.Regex.GetGroupNames()) | ||||
|                 { | ||||
|                     if (groupName == "0") continue; | ||||
|                     int value; | ||||
| @@ -134,7 +132,7 @@ namespace NadekoBot.Modules.Utility | ||||
|                 { | ||||
|                     // ignored | ||||
|                 } | ||||
|                 await _service.Remind.StartReminder(rem); | ||||
|                 await _service.StartReminder(rem); | ||||
|             } | ||||
|              | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services.Utility; | ||||
| using System; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| @@ -13,9 +14,9 @@ namespace NadekoBot.Modules.Utility | ||||
|         [Group] | ||||
|         public class UnitConverterCommands : NadekoSubmodule | ||||
|         { | ||||
|             private readonly UtilityService _service; | ||||
|             private readonly ConverterService _service; | ||||
|  | ||||
|             public UnitConverterCommands(UtilityService service) | ||||
|             public UnitConverterCommands(ConverterService service) | ||||
|             { | ||||
|                 _service = service; | ||||
|             } | ||||
| @@ -23,7 +24,7 @@ namespace NadekoBot.Modules.Utility | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             public async Task ConvertList() | ||||
|             { | ||||
|                 var res = _service.Converter.Units.GroupBy(x => x.UnitType) | ||||
|                 var res = _service.Units.GroupBy(x => x.UnitType) | ||||
|                                .Aggregate(new EmbedBuilder().WithTitle(GetText("convertlist")) | ||||
|                                                             .WithColor(NadekoBot.OkColor), | ||||
|                                           (embed, g) => embed.AddField(efb => | ||||
| @@ -35,8 +36,8 @@ namespace NadekoBot.Modules.Utility | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             public async Task Convert(string origin, string target, decimal value) | ||||
|             { | ||||
|                 var originUnit = _service.Converter.Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(origin.ToLowerInvariant())); | ||||
|                 var targetUnit = _service.Converter.Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(target.ToLowerInvariant())); | ||||
|                 var originUnit = _service.Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(origin.ToLowerInvariant())); | ||||
|                 var targetUnit = _service.Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(target.ToLowerInvariant())); | ||||
|                 if (originUnit == null || targetUnit == null) | ||||
|                 { | ||||
|                     await ReplyErrorLocalized("convert_not_found", Format.Bold(origin), Format.Bold(target)).ConfigureAwait(false); | ||||
|   | ||||
| @@ -1,9 +1,4 @@ | ||||
| using Newtonsoft.Json.Linq; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility.Models | ||||
| { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility.Models | ||||
| namespace NadekoBot.Modules.Utility.Models | ||||
| { | ||||
|     public class Attributes | ||||
|     { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility.Models | ||||
| namespace NadekoBot.Modules.Utility.Models | ||||
| { | ||||
|     public class DiscordConnection | ||||
|     { | ||||
|   | ||||
| @@ -15,10 +15,11 @@ using ImageSharp; | ||||
| using System.Collections.Generic; | ||||
| using Newtonsoft.Json; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Services; | ||||
| using System.Diagnostics; | ||||
| using NadekoBot.Modules; | ||||
| using Color = Discord.Color; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility | ||||
| namespace NadekoBot.Services.Utility | ||||
| { | ||||
|     public partial class Utility : NadekoTopLevelModule | ||||
|     { | ||||
| @@ -164,7 +165,7 @@ namespace NadekoBot.Modules.Utility | ||||
|                 try | ||||
|                 { | ||||
|                     var color = hexColors[i]; | ||||
|                     await role.ModifyAsync(r => r.Color = new Discord.Color(color.R, color.G, color.B)).ConfigureAwait(false); | ||||
|                     await role.ModifyAsync(r => r.Color = new Color(color.R, color.G, color.B)).ConfigureAwait(false); | ||||
|                     ++i; | ||||
|                     if (i >= hexColors.Length) | ||||
|                         i = 0; | ||||
|   | ||||
| @@ -1,319 +0,0 @@ | ||||
| using Discord; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Utility.Models; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using Newtonsoft.Json; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Text.RegularExpressions; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Utility | ||||
| { | ||||
|     public class UtilityService | ||||
|     { | ||||
|         public ConcurrentDictionary<ulong, ConcurrentDictionary<string, string>> AliasMaps { get; } = new ConcurrentDictionary<ulong, ConcurrentDictionary<string, string>>(); | ||||
|  | ||||
|         //messagerepeater | ||||
|         //guildid/RepeatRunners | ||||
|         public ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>> Repeaters { get; set; } | ||||
|         public bool RepeaterReady { get; private set; } | ||||
|  | ||||
|         //remind | ||||
|         public RemindService Remind { get; } | ||||
|  | ||||
|         //unit conversion | ||||
|         public ConverterService Converter { get; } | ||||
|  | ||||
|         public UtilityService(IEnumerable<GuildConfig> guildConfigs, DiscordShardedClient client, BotConfig config, DbHandler db) | ||||
|         { | ||||
|             //commandmap | ||||
|             AliasMaps = new ConcurrentDictionary<ulong, ConcurrentDictionary<string, string>>( | ||||
|                     guildConfigs.ToDictionary( | ||||
|                         x => x.GuildId, | ||||
|                         x => new ConcurrentDictionary<string, string>(x.CommandAliases | ||||
|                             .Distinct(new CommandAliasEqualityComparer()) | ||||
|                             .ToDictionary(ca => ca.Trigger, ca => ca.Mapping)))); | ||||
|  | ||||
|             //crossesrver | ||||
|             _client = client; | ||||
|             _client.MessageReceived += Client_MessageReceived; | ||||
|  | ||||
|             //messagerepeater | ||||
|             var _ = Task.Run(async () => | ||||
|             { | ||||
| #if !GLOBAL_NADEKO | ||||
|                 await Task.Delay(5000).ConfigureAwait(false); | ||||
| #else | ||||
|                     await Task.Delay(30000).ConfigureAwait(false); | ||||
| #endif | ||||
|                 //todo this is pretty terrible :kms: no time | ||||
|                 Repeaters = new ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>>(guildConfigs | ||||
|                     .ToDictionary(gc => gc.GuildId, | ||||
|                         gc => new ConcurrentQueue<RepeatRunner>(gc.GuildRepeaters | ||||
|                             .Select(gr => new RepeatRunner(client, gr)) | ||||
|                             .Where(x => x.Guild != null)))); | ||||
|                 RepeaterReady = true; | ||||
|             }); | ||||
|  | ||||
|             //reminder | ||||
|             Remind = new RemindService(client, config, db); | ||||
|  | ||||
|             //unit converter | ||||
|             Converter = new ConverterService(db); | ||||
|         } | ||||
|  | ||||
|         private async Task Client_MessageReceived(Discord.WebSocket.SocketMessage imsg) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 if (imsg.Author.IsBot) | ||||
|                     return; | ||||
|                 var msg = imsg as IUserMessage; | ||||
|                 if (msg == null) | ||||
|                     return; | ||||
|                 var channel = imsg.Channel as ITextChannel; | ||||
|                 if (channel == null) | ||||
|                     return; | ||||
|                 if (msg.Author.Id == _client.CurrentUser.Id) return; | ||||
|                 foreach (var subscriber in Subscribers) | ||||
|                 { | ||||
|                     var set = subscriber.Value; | ||||
|                     if (!set.Contains(channel)) | ||||
|                         continue; | ||||
|                     foreach (var chan in set.Except(new[] { channel })) | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             await chan.SendMessageAsync(GetMessage(channel, (IGuildUser)msg.Author, | ||||
|                                 msg)).ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             // ignored | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 // ignored | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private string GetMessage(ITextChannel channel, IGuildUser user, IUserMessage message) => | ||||
|             $"**{channel.Guild.Name} | {channel.Name}** `{user.Username}`: " + message.Content.SanitizeMentions(); | ||||
|  | ||||
|         public readonly ConcurrentDictionary<int, ConcurrentHashSet<ITextChannel>> Subscribers = | ||||
|             new ConcurrentDictionary<int, ConcurrentHashSet<ITextChannel>>(); | ||||
|         private DiscordShardedClient _client; | ||||
|     } | ||||
|  | ||||
|     public class ConverterService | ||||
|     { | ||||
|         public class MeasurementUnit | ||||
|         { | ||||
|             public List<string> Triggers { get; set; } | ||||
|             public string UnitType { get; set; } | ||||
|             public decimal Modifier { get; set; } | ||||
|         } | ||||
|  | ||||
|         public class Rates | ||||
|         { | ||||
|             public string Base { get; set; } | ||||
|             public DateTime Date { get; set; } | ||||
|             [JsonProperty("rates")] | ||||
|             public Dictionary<string, decimal> ConversionRates { get; set; } | ||||
|         } | ||||
|  | ||||
|         public List<ConvertUnit> Units { get; set; } = new List<ConvertUnit>(); | ||||
|         private readonly Logger _log; | ||||
|         private Timer _timer; | ||||
|         private readonly TimeSpan _updateInterval = new TimeSpan(12, 0, 0); | ||||
|         private readonly DbHandler _db; | ||||
|  | ||||
|         public ConverterService(DbHandler db) | ||||
|         { | ||||
|             _log = LogManager.GetCurrentClassLogger(); | ||||
|             _db = db; | ||||
|             try | ||||
|             { | ||||
|                 var data = JsonConvert.DeserializeObject<List<MeasurementUnit>>(File.ReadAllText("data/units.json")).Select(u => new ConvertUnit() | ||||
|                 { | ||||
|                     Modifier = u.Modifier, | ||||
|                     UnitType = u.UnitType, | ||||
|                     InternalTrigger = string.Join("|", u.Triggers) | ||||
|                 }).ToArray(); | ||||
|  | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     if (uow.ConverterUnits.Empty()) | ||||
|                     { | ||||
|                         uow.ConverterUnits.AddRange(data); | ||||
|                         uow.Complete(); | ||||
|                     } | ||||
|                 } | ||||
|                 Units = data.ToList(); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 _log.Warn("Could not load units: " + ex.Message); | ||||
|             } | ||||
|  | ||||
|             _timer = new Timer(async (obj) => await UpdateCurrency(), null, _updateInterval, _updateInterval); | ||||
|         } | ||||
|          | ||||
|         public static async Task<Rates> UpdateCurrencyRates() | ||||
|         { | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var res = await http.GetStringAsync("http://api.fixer.io/latest").ConfigureAwait(false); | ||||
|                 return JsonConvert.DeserializeObject<Rates>(res); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async Task UpdateCurrency() | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var currencyRates = await UpdateCurrencyRates(); | ||||
|                 var unitTypeString = "currency"; | ||||
|                 var range = currencyRates.ConversionRates.Select(u => new ConvertUnit() | ||||
|                 { | ||||
|                     InternalTrigger = u.Key, | ||||
|                     Modifier = u.Value, | ||||
|                     UnitType = unitTypeString | ||||
|                 }).ToArray(); | ||||
|                 var baseType = new ConvertUnit() | ||||
|                 { | ||||
|                     Triggers = new[] { currencyRates.Base }, | ||||
|                     Modifier = decimal.One, | ||||
|                     UnitType = unitTypeString | ||||
|                 }; | ||||
|                 var toRemove = Units.Where(u => u.UnitType == unitTypeString); | ||||
|  | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     uow.ConverterUnits.RemoveRange(toRemove.ToArray()); | ||||
|                     uow.ConverterUnits.Add(baseType); | ||||
|                     uow.ConverterUnits.AddRange(range); | ||||
|  | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|                 Units.RemoveAll(u => u.UnitType == unitTypeString); | ||||
|                 Units.Add(baseType); | ||||
|                 Units.AddRange(range); | ||||
|                 _log.Info("Updated Currency"); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 _log.Warn("Failed updating currency. Ignore this."); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public class RemindService | ||||
|     { | ||||
|         public readonly Regex Regex = new Regex(@"^(?:(?<months>\d)mo)?(?:(?<weeks>\d)w)?(?:(?<days>\d{1,2})d)?(?:(?<hours>\d{1,2})h)?(?:(?<minutes>\d{1,2})m)?$", | ||||
|                                 RegexOptions.Compiled | RegexOptions.Multiline); | ||||
|  | ||||
|         public string RemindMessageFormat { get; } | ||||
|  | ||||
|         public readonly IDictionary<string, Func<Reminder, string>> _replacements = new Dictionary<string, Func<Reminder, string>> | ||||
|             { | ||||
|                 { "%message%" , (r) => r.Message }, | ||||
|                 { "%user%", (r) => $"<@!{r.UserId}>" }, | ||||
|                 { "%target%", (r) =>  r.IsPrivate ? "Direct Message" : $"<#{r.ChannelId}>"} | ||||
|             }; | ||||
|  | ||||
|         private readonly Logger _log; | ||||
|         private readonly CancellationTokenSource cancelSource; | ||||
|         private readonly CancellationToken cancelAllToken; | ||||
|         private readonly BotConfig _config; | ||||
|         private readonly DiscordShardedClient _client; | ||||
|         private readonly DbHandler _db; | ||||
|  | ||||
|         public RemindService(DiscordShardedClient client, BotConfig config, DbHandler db) | ||||
|         { | ||||
|             _config = config; | ||||
|             _client = client; | ||||
|             _log = LogManager.GetCurrentClassLogger(); | ||||
|             _db = db; | ||||
|  | ||||
|             cancelSource = new CancellationTokenSource(); | ||||
|             cancelAllToken = cancelSource.Token; | ||||
|             List<Reminder> reminders; | ||||
|             using (var uow = _db.UnitOfWork) | ||||
|             { | ||||
|                 reminders = uow.Reminders.GetAll().ToList(); | ||||
|             } | ||||
|             RemindMessageFormat = _config.RemindMessageFormat; | ||||
|  | ||||
|             foreach (var r in reminders) | ||||
|             { | ||||
|                 Task.Run(() => StartReminder(r)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async Task StartReminder(Reminder r) | ||||
|         { | ||||
|             var t = cancelAllToken; | ||||
|             var now = DateTime.Now; | ||||
|  | ||||
|             var time = r.When - now; | ||||
|  | ||||
|             if (time.TotalMilliseconds > int.MaxValue) | ||||
|                 return; | ||||
|  | ||||
|             await Task.Delay(time, t).ConfigureAwait(false); | ||||
|             try | ||||
|             { | ||||
|                 IMessageChannel ch; | ||||
|                 if (r.IsPrivate) | ||||
|                 { | ||||
|                     var user = _client.GetGuild(r.ServerId).GetUser(r.ChannelId); | ||||
|                     if (user == null) | ||||
|                         return; | ||||
|                     ch = await user.CreateDMChannelAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     ch = _client.GetGuild(r.ServerId)?.GetTextChannel(r.ChannelId); | ||||
|                 } | ||||
|                 if (ch == null) | ||||
|                     return; | ||||
|  | ||||
|                 await ch.SendMessageAsync( | ||||
|                     _replacements.Aggregate(RemindMessageFormat, | ||||
|                         (cur, replace) => cur.Replace(replace.Key, replace.Value(r))) | ||||
|                         .SanitizeMentions() | ||||
|                         ).ConfigureAwait(false); //it works trust me | ||||
|             } | ||||
|             catch (Exception ex) { _log.Warn(ex); } | ||||
|             finally | ||||
|             { | ||||
|                 using (var uow = _db.UnitOfWork) | ||||
|                 { | ||||
|                     uow.Reminders.Remove(r); | ||||
|                     await uow.CompleteAsync(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public class CommandAliasEqualityComparer : IEqualityComparer<CommandAlias> | ||||
|     { | ||||
|         public bool Equals(CommandAlias x, CommandAlias y) => x.Trigger == y.Trigger; | ||||
|  | ||||
|         public int GetHashCode(CommandAlias obj) => obj.Trigger.GetHashCode(); | ||||
|     } | ||||
| } | ||||
| @@ -16,13 +16,14 @@ using System.Collections.Immutable; | ||||
| using System.Diagnostics; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System.Threading; | ||||
| using NadekoBot.Modules.Utility; | ||||
| using NadekoBot.Services.Searches; | ||||
| using NadekoBot.Services.ClashOfClans; | ||||
| using NadekoBot.Services.Music; | ||||
| using NadekoBot.Services.CustomReactions; | ||||
| using NadekoBot.Services.Games; | ||||
| using NadekoBot.Services.Administration; | ||||
| using NadekoBot.Services.Permissions; | ||||
| using NadekoBot.Services.Utility; | ||||
|  | ||||
| namespace NadekoBot | ||||
| { | ||||
| @@ -44,20 +45,24 @@ namespace NadekoBot | ||||
|  | ||||
|         public ImmutableArray<GuildConfig> AllGuildConfigs { get; } | ||||
|         public BotConfig BotConfig { get; } | ||||
|         public DbHandler Db { get; } | ||||
|         public CommandService CommandService { get; } | ||||
|  | ||||
|         public DiscordShardedClient Client { get; } | ||||
|         public bool Ready { get; private set; } | ||||
|  | ||||
|         public INServiceProvider Services { get; } | ||||
|         public INServiceProvider Services { get; private set; } | ||||
|         public BotCredentials Credentials { get; } | ||||
|  | ||||
|         public NadekoBot() | ||||
|         { | ||||
|             SetupLogger(); | ||||
|             _log = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|             var credentials = new BotCredentials(); | ||||
|             var db = new DbHandler(credentials); | ||||
|             using (var uow = db.UnitOfWork) | ||||
|             Credentials = new BotCredentials(); | ||||
|             Db = new DbHandler(Credentials); | ||||
|  | ||||
|             using (var uow = Db.UnitOfWork) | ||||
|             { | ||||
|                 AllGuildConfigs = uow.GuildConfigs.GetAllGuildConfigs().ToImmutableArray(); | ||||
|                 BotConfig = uow.BotConfig.GetOrCreate(); | ||||
| @@ -69,55 +74,66 @@ namespace NadekoBot | ||||
|             { | ||||
|                 MessageCacheSize = 10, | ||||
|                 LogLevel = LogSeverity.Warning, | ||||
|                 TotalShards = credentials.TotalShards, | ||||
|                 TotalShards = Credentials.TotalShards, | ||||
|                 ConnectionTimeout = int.MaxValue, | ||||
|                 AlwaysDownloadUsers = true, | ||||
|             }); | ||||
|  | ||||
|             var google = new GoogleApiService(credentials); | ||||
|             var localization = new Localization(BotConfig.Locale, AllGuildConfigs.ToDictionary(x => x.GuildId, x => x.Locale), db); | ||||
|             var strings = new NadekoStrings(localization); | ||||
|  | ||||
|             var greetSettingsService = new GreetSettingsService(Client, AllGuildConfigs, db); | ||||
|  | ||||
|             var commandService = new CommandService(new CommandServiceConfig() | ||||
|             CommandService = new CommandService(new CommandServiceConfig() | ||||
|             { | ||||
|                 CaseSensitiveCommands = false, | ||||
|                 DefaultRunMode = RunMode.Sync, | ||||
|             }); | ||||
|  | ||||
|             var commandHandler = new CommandHandler(Client, commandService, credentials, this); | ||||
|  | ||||
|             var stats = new StatsService(Client, commandHandler, credentials); | ||||
| #if GLOBAL_NADEKO | ||||
|             Client.Log += Client_Log; | ||||
| #endif | ||||
|         } | ||||
|  | ||||
|         private void AddServices() | ||||
|         { | ||||
|             var googleApiService = new GoogleApiService(Credentials); | ||||
|             var soundcloudApiService = new SoundCloudApiService(Credentials); | ||||
|             var localization = new Localization(BotConfig.Locale, AllGuildConfigs.ToDictionary(x => x.GuildId, x => x.Locale), Db); | ||||
|             var strings = new NadekoStrings(localization); | ||||
|             var commandHandler = new CommandHandler(Client, CommandService, Credentials, this); | ||||
|             var stats = new StatsService(Client, commandHandler, Credentials); | ||||
|             var images = new ImagesService(); | ||||
|  | ||||
|             var currencyHandler = new CurrencyHandler(BotConfig, db); | ||||
|  | ||||
|             var soundcloud = new SoundCloudApiService(credentials); | ||||
|             var currencyHandler = new CurrencyHandler(BotConfig, Db); | ||||
|  | ||||
|             //module services | ||||
|             //todo 90 - Make this automatic | ||||
|             var utilityService = new UtilityService(AllGuildConfigs, Client, BotConfig, db); | ||||
| #region Searches | ||||
|             var searchesService = new SearchesService(Client, google, db); | ||||
|             var streamNotificationService = new StreamNotificationService(db, Client, strings); | ||||
|             //todo 90 - autodiscover, DI, and add instead of manual like this | ||||
|             #region utility | ||||
|             var utilityService = new UtilityService(AllGuildConfigs, Client); | ||||
|             var remindService = new RemindService(Client, BotConfig, Db); | ||||
|             var repeaterService = new MessageRepeaterService(Client, AllGuildConfigs); | ||||
|             var converterService = new ConverterService(Db); | ||||
|             #endregion | ||||
|             var clashService = new ClashOfClansService(Client, db, localization, strings); | ||||
|             var musicService = new MusicService(google, strings, localization, db, soundcloud, credentials); | ||||
|             var crService = new CustomReactionsService(db, Client); | ||||
|             #region Searches | ||||
|             var searchesService = new SearchesService(Client, googleApiService, Db); | ||||
|             var streamNotificationService = new StreamNotificationService(Db, Client, strings); | ||||
|             #endregion | ||||
|             var clashService = new ClashOfClansService(Client, Db, localization, strings); | ||||
|             var musicService = new MusicService(googleApiService, strings, localization, Db, soundcloudApiService, Credentials); | ||||
|             var crService = new CustomReactionsService(Db, Client); | ||||
|             var gamesService = new GamesService(Client, BotConfig, AllGuildConfigs, strings, images); | ||||
|             #region administration | ||||
|             var administrationService = new AdministrationService(AllGuildConfigs, commandHandler); | ||||
|             var selfService = new SelfService(this, commandHandler, db, BotConfig); | ||||
|             var greetSettingsService = new GreetSettingsService(Client, AllGuildConfigs, Db); | ||||
|             var selfService = new SelfService(this, commandHandler, Db, BotConfig); | ||||
|             var vcRoleService = new VcRoleService(Client, AllGuildConfigs); | ||||
|             var vPlusTService = new VplusTService(Client, AllGuildConfigs, strings, db); | ||||
|             var muteService = new MuteService(Client, AllGuildConfigs, db); | ||||
|             var vPlusTService = new VplusTService(Client, AllGuildConfigs, strings, Db); | ||||
|             var muteService = new MuteService(Client, AllGuildConfigs, Db); | ||||
|             var ratelimitService = new RatelimitService(Client, AllGuildConfigs); | ||||
|             var protectionService = new ProtectionService(Client, AllGuildConfigs, muteService); | ||||
|             var playingRotateService = new PlayingRotateService(Client, BotConfig, musicService); | ||||
|             var gameVcService = new GameVoiceChannelService(Client, db, AllGuildConfigs); | ||||
|             var gameVcService = new GameVoiceChannelService(Client, Db, AllGuildConfigs); | ||||
|             var autoAssignRoleService = new AutoAssignRoleService(Client, AllGuildConfigs); | ||||
|             var permissionsService = new PermissionsService(Db); | ||||
|             var blacklistService = new BlacklistService(BotConfig); | ||||
|             var cmdcdsService = new CmdCdService(AllGuildConfigs); | ||||
|             var filterService = new FilterService(AllGuildConfigs); | ||||
|             var globalPermsService = new GlobalPermissionService(BotConfig); | ||||
|             #endregion | ||||
|  | ||||
|             //initialize Services | ||||
| @@ -125,18 +141,21 @@ namespace NadekoBot | ||||
|                 .Add<ILocalization>(localization) | ||||
|                 .Add<IStatsService>(stats) | ||||
|                 .Add<IImagesService>(images) | ||||
|                 .Add<IGoogleApiService>(google) | ||||
|                 .Add<IGoogleApiService>(googleApiService) | ||||
|                 .Add<IStatsService>(stats) | ||||
|                 .Add<IBotCredentials>(credentials) | ||||
|                 .Add<CommandService>(commandService) | ||||
|                 .Add<IBotCredentials>(Credentials) | ||||
|                 .Add<CommandService>(CommandService) | ||||
|                 .Add<NadekoStrings>(strings) | ||||
|                 .Add<DiscordShardedClient>(Client) | ||||
|                 .Add<BotConfig>(BotConfig) | ||||
|                 .Add<CurrencyHandler>(currencyHandler) | ||||
|                 .Add<CommandHandler>(commandHandler) | ||||
|                 .Add<DbHandler>(db) | ||||
|                 .Add<DbHandler>(Db) | ||||
|                 //modules | ||||
|                 .Add<UtilityService>(utilityService) | ||||
|                     .Add(remindService) | ||||
|                     .Add(repeaterService) | ||||
|                     .Add(converterService) | ||||
|                 .Add<SearchesService>(searchesService) | ||||
|                     .Add(streamNotificationService) | ||||
|                 .Add<ClashOfClansService>(clashService) | ||||
| @@ -154,35 +173,28 @@ namespace NadekoBot | ||||
|                     .Add(gameVcService) | ||||
|                     .Add(autoAssignRoleService) | ||||
|                     .Add(protectionService) | ||||
|                 .Add<PermissionsService>(permissionsService) | ||||
|                     .Add(blacklistService) | ||||
|                     .Add(cmdcdsService) | ||||
|                     .Add(filterService) | ||||
|                     .Add(globalPermsService) | ||||
|                 .Build(); | ||||
|  | ||||
|             commandHandler.AddServices(Services); | ||||
|  | ||||
|             //setup typereaders | ||||
|             commandService.AddTypeReader<PermissionAction>(new PermissionActionTypeReader()); | ||||
|             commandService.AddTypeReader<CommandInfo>(new CommandTypeReader(commandService)); | ||||
|             //commandService.AddTypeReader<CommandOrCrInfo>(new CommandOrCrTypeReader()); | ||||
|             commandService.AddTypeReader<ModuleInfo>(new ModuleTypeReader(commandService)); | ||||
|             commandService.AddTypeReader<ModuleOrCrInfo>(new ModuleOrCrTypeReader(commandService)); | ||||
|             commandService.AddTypeReader<IGuild>(new GuildTypeReader(Client)); | ||||
|  | ||||
| #if GLOBAL_NADEKO | ||||
|             Client.Log += Client_Log; | ||||
| #endif | ||||
|             CommandService.AddTypeReader<PermissionAction>(new PermissionActionTypeReader()); | ||||
|             CommandService.AddTypeReader<CommandInfo>(new CommandTypeReader(CommandService)); | ||||
|             CommandService.AddTypeReader<CommandOrCrInfo>(new CommandOrCrTypeReader(crService, CommandService)); | ||||
|             CommandService.AddTypeReader<ModuleInfo>(new ModuleTypeReader(CommandService)); | ||||
|             CommandService.AddTypeReader<ModuleOrCrInfo>(new ModuleOrCrTypeReader(CommandService)); | ||||
|             CommandService.AddTypeReader<IGuild>(new GuildTypeReader(Client)); | ||||
|         } | ||||
|  | ||||
|         public async Task RunAsync(params string[] args) | ||||
|         private async Task LoginAsync(string token) | ||||
|         { | ||||
|             var creds = Services.GetService<IBotCredentials>(); | ||||
|             var stats = Services.GetService<IStatsService>(); | ||||
|             var commandHandler = Services.GetService<CommandHandler>(); | ||||
|             var commandService = Services.GetService<CommandService>(); | ||||
|  | ||||
|             _log.Info("Starting NadekoBot v" + StatsService.BotVersion); | ||||
|  | ||||
|             var sw = Stopwatch.StartNew(); | ||||
|             //connect | ||||
|             await Client.LoginAsync(TokenType.Bot, creds.Token).ConfigureAwait(false); | ||||
|             await Client.LoginAsync(TokenType.Bot, token).ConfigureAwait(false); | ||||
|             await Client.StartAsync().ConfigureAwait(false); | ||||
|  | ||||
|             // wait for all shards to be ready | ||||
| @@ -192,19 +204,33 @@ namespace NadekoBot | ||||
|  | ||||
|             while (readyCount < Client.Shards.Count) | ||||
|                 await Task.Delay(100).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|             stats.Initialize(); | ||||
|         public async Task RunAsync(params string[] args) | ||||
|         { | ||||
|             _log.Info("Starting NadekoBot v" + StatsService.BotVersion); | ||||
|  | ||||
|             var sw = Stopwatch.StartNew(); | ||||
|  | ||||
|             await LoginAsync(Credentials.Token).ConfigureAwait(false); | ||||
|  | ||||
|             AddServices(); | ||||
|  | ||||
|             sw.Stop(); | ||||
|             _log.Info("Connected in " + sw.Elapsed.TotalSeconds.ToString("F2")); | ||||
|  | ||||
|             var stats = Services.GetService<IStatsService>(); | ||||
|             stats.Initialize(); | ||||
|             var commandHandler = Services.GetService<CommandHandler>(); | ||||
|             var CommandService = Services.GetService<CommandService>(); | ||||
|  | ||||
|             // start handling messages received in commandhandler | ||||
|             await commandHandler.StartHandling().ConfigureAwait(false); | ||||
|  | ||||
|             var _ = await Task.Run(() => commandService.AddModulesAsync(this.GetType().GetTypeInfo().Assembly)).ConfigureAwait(false); | ||||
|             var _ = await CommandService.AddModulesAsync(this.GetType().GetTypeInfo().Assembly); | ||||
| #if !GLOBAL_NADEKO | ||||
|             //todo uncomment this | ||||
|             //await commandService.AddModuleAsync<Music>().ConfigureAwait(false); | ||||
|             //await CommandService.AddModuleAsync<Music>().ConfigureAwait(false); | ||||
| #endif | ||||
|             Ready = true; | ||||
|             _log.Info(await stats.Print().ConfigureAwait(false)); | ||||
|   | ||||
| @@ -30,13 +30,10 @@ | ||||
|     <Compile Remove="data\**\*;credentials.json;credentials_example.json" /> | ||||
|     <Compile Remove="Modules\Administration\**" /> | ||||
|     <Compile Remove="Modules\NSFW\**" /> | ||||
|     <Compile Remove="Modules\Permissions\**" /> | ||||
|     <EmbeddedResource Remove="Modules\Administration\**" /> | ||||
|     <EmbeddedResource Remove="Modules\NSFW\**" /> | ||||
|     <EmbeddedResource Remove="Modules\Permissions\**" /> | ||||
|     <None Remove="Modules\Administration\**" /> | ||||
|     <None Remove="Modules\NSFW\**" /> | ||||
|     <None Remove="Modules\Permissions\**" /> | ||||
|     <Compile Remove="Modules\Gambling\Commands\Lucky7Commands.cs" /> | ||||
|     <Compile Include="Modules\Administration\Administration.cs" /> | ||||
|     <Compile Include="Modules\Administration\Commands\AutoAssignRoleCommands.cs" /> | ||||
|   | ||||
| @@ -7,7 +7,6 @@ using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Administration | ||||
|   | ||||
| @@ -6,9 +6,7 @@ using NLog; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Administration | ||||
| { | ||||
|   | ||||
| @@ -6,7 +6,6 @@ using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Administration | ||||
|   | ||||
| @@ -3,7 +3,6 @@ using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|   | ||||
| @@ -1,9 +1,4 @@ | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Administration | ||||
|   | ||||
| @@ -1,11 +1,8 @@ | ||||
| using Discord; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Administration | ||||
| { | ||||
|   | ||||
| @@ -6,7 +6,6 @@ using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Administration | ||||
|   | ||||
| @@ -7,7 +7,6 @@ using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.RegularExpressions; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| using Discord; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.DataStructures.ModuleBehaviors; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| @@ -13,8 +12,8 @@ using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.ClashOfClans | ||||
| { | ||||
|     // todo, just made this compile, it's a complete mess. A lot of the things here should actually be in the actual module.  | ||||
|     // service should just handle the state, module should print out what happened, so everything that has to do with strings | ||||
|     // todo 99 rewrite, just made this compile, it's a complete mess. A lot of the things here should actually be in the actual module.  | ||||
|     // service should just handle the state, module should print out what happened, so anything that has to do with strings | ||||
|     // shouldn't be here | ||||
|     public class ClashOfClansService | ||||
|     { | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.DataStructures; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using Discord; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations.Schema; | ||||
| using System.Collections.Generic; | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class AntiRaidSetting : DbEntity | ||||
|   | ||||
| @@ -104,6 +104,7 @@ Nadeko Support Server: https://discord.gg/nadekobot"; | ||||
|     { | ||||
|         public ulong ItemId { get; set; } | ||||
|         public BlacklistType Type { get; set; } | ||||
|     } | ||||
|  | ||||
|     public enum BlacklistType | ||||
|     { | ||||
| @@ -111,7 +112,6 @@ Nadeko Support Server: https://discord.gg/nadekobot"; | ||||
|         Channel, | ||||
|         User | ||||
|     } | ||||
|     } | ||||
|  | ||||
|     public class EightBallResponse : DbEntity | ||||
|     { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class CommandCost : DbEntity | ||||
|     { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class CommandPrice : DbEntity | ||||
|     { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class DiscordUser : DbEntity | ||||
|     { | ||||
|   | ||||
| @@ -1,9 +1,4 @@ | ||||
| using NadekoBot.Extensions; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class WaifuUpdate : DbEntity | ||||
|     { | ||||
|   | ||||
| @@ -1,10 +1,5 @@ | ||||
| using Discord; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Repositories | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Repositories | ||||
|   | ||||
| @@ -24,6 +24,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl | ||||
|                              .Include(bc => bc.StartupCommands) | ||||
|                              .Include(bc => bc.BlockedCommands) | ||||
|                              .Include(bc => bc.BlockedModules) | ||||
|                              .Include(bc => bc.Blacklist) | ||||
|                              //.Include(bc => bc.CommandCosts) | ||||
|                              .FirstOrDefault(); | ||||
|             else | ||||
|   | ||||
| @@ -1,9 +1,5 @@ | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Discord; | ||||
|  | ||||
|   | ||||
| @@ -2,8 +2,6 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Repositories.Impl | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using System; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user