All modules compile, except log commands. Working on todos now
This commit is contained in:
		| @@ -1,8 +1,6 @@ | |||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using System; | using System; | ||||||
| using NadekoBot.Services.Impl; |  | ||||||
| using Discord; |  | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
|  |  | ||||||
| namespace NadekoBot.Attributes | namespace NadekoBot.Attributes | ||||||
|   | |||||||
| @@ -1,8 +1,5 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Runtime.CompilerServices; | using System.Runtime.CompilerServices; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.DataStructures | namespace NadekoBot.DataStructures | ||||||
|   | |||||||
| @@ -1,11 +1,6 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||||
| using NLog; | using NLog; | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.DataStructures | namespace NadekoBot.DataStructures | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,10 +1,6 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections; | using System.Collections; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Collections.Immutable; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.DataStructures | namespace NadekoBot.DataStructures | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,9 +1,5 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.DataStructures.ModuleBehaviors | namespace NadekoBot.DataStructures.ModuleBehaviors | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
|  | using NadekoBot.Services.CustomReactions; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| @@ -29,37 +30,43 @@ namespace NadekoBot.TypeReaders | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     //public class CommandOrCrTypeReader : CommandTypeReader |     public class CommandOrCrTypeReader : CommandTypeReader | ||||||
|     //{ |     { | ||||||
|     //    public override async Task<TypeReaderResult> Read(ICommandContext context, string input) |         private readonly CustomReactionsService _crs; | ||||||
|     //    { |  | ||||||
|     //        input = input.ToUpperInvariant(); |  | ||||||
|              |  | ||||||
|     //        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)); |  | ||||||
|     //                } |  | ||||||
|     //            } |  | ||||||
|     //        } |  | ||||||
|  |  | ||||||
|     //        var cmd = await base.Read(context, input); |         public CommandOrCrTypeReader(CustomReactionsService crs, CommandService cmds) : base(cmds) | ||||||
|     //        if (cmd.IsSuccess) |         { | ||||||
|     //        { |             _crs = crs; | ||||||
|     //            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 |     public class CommandOrCrInfo | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Migrations | namespace NadekoBot.Migrations | ||||||
| { | { | ||||||
|   | |||||||
| @@ -24,38 +24,6 @@ namespace NadekoBot.Modules.Administration | |||||||
|             _admin = admin; |             _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] |         [NadekoCommand, Usage, Description, Aliases] | ||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         [RequireUserPermission(GuildPermission.Administrator)] |         [RequireUserPermission(GuildPermission.Administrator)] | ||||||
|   | |||||||
| @@ -400,9 +400,9 @@ namespace NadekoBot.Modules.Administration | |||||||
|                 }); |                 }); | ||||||
|  |  | ||||||
|                 //Blacklist |                 //Blacklist | ||||||
|                 var blacklist = new HashSet<BlacklistItem>(oldConfig.ServerBlacklist.Select(server => new BlacklistItem() { ItemId = server, Type = BlacklistItem.BlacklistType.Server })); |                 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 = BlacklistItem.BlacklistType.Channel })); |                 blacklist.AddRange(oldConfig.ChannelBlacklist.Select(channel => new BlacklistItem() { ItemId = channel, Type = BlacklistType.Channel })); | ||||||
|                 blacklist.AddRange(oldConfig.UserBlacklist.Select(user => new BlacklistItem() { ItemId = user, Type = BlacklistItem.BlacklistType.User })); |                 blacklist.AddRange(oldConfig.UserBlacklist.Select(user => new BlacklistItem() { ItemId = user, Type = BlacklistType.User })); | ||||||
|                 botConfig.Blacklist = blacklist; |                 botConfig.Blacklist = blacklist; | ||||||
|  |  | ||||||
|                 //Eightball |                 //Eightball | ||||||
|   | |||||||
| @@ -1,16 +1,9 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using Discord.WebSocket; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Administration; | using NadekoBot.Services.Administration; | ||||||
| using NadekoBot.Services.Database.Models; |  | ||||||
| using NLog; |  | ||||||
| using System; | using System; | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Threading; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Administration | namespace NadekoBot.Modules.Administration | ||||||
|   | |||||||
| @@ -1,18 +1,13 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using Discord.WebSocket; |  | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Administration; | using NadekoBot.Services.Administration; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using NLog; |  | ||||||
| using System; |  | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Administration | namespace NadekoBot.Modules.Administration | ||||||
|   | |||||||
| @@ -12,9 +12,6 @@ using Discord.WebSocket; | |||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using System.Collections.Immutable; |  | ||||||
| using NadekoBot.DataStructures; |  | ||||||
| using NLog; |  | ||||||
| using NadekoBot.Services.Administration; | using NadekoBot.Services.Administration; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Administration | namespace NadekoBot.Modules.Administration | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| @@ -32,7 +31,7 @@ namespace NadekoBot.Modules.Administration | |||||||
|             [RequireUserPermission(GuildPermission.ManageRoles)] |             [RequireUserPermission(GuildPermission.ManageRoles)] | ||||||
|             [RequireUserPermission(GuildPermission.ManageChannels)] |             [RequireUserPermission(GuildPermission.ManageChannels)] | ||||||
|             [RequireBotPermission(GuildPermission.ManageRoles)] |             [RequireBotPermission(GuildPermission.ManageRoles)] | ||||||
|             // todo wait for the fix [RequireBotPermission(GuildPermission.ManageChannels)] |             //todo discord.net [RequireBotPermission(GuildPermission.ManageChannels)] | ||||||
|             [RequireContext(ContextType.Guild)] |             [RequireContext(ContextType.Guild)] | ||||||
|             public async Task VcRole([Remainder]IRole role = null) |             public async Task VcRole([Remainder]IRole role = null) | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -1,18 +1,13 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using Discord.WebSocket; |  | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Administration; | using NadekoBot.Services.Administration; | ||||||
| using NLog; |  | ||||||
| using System; | using System; | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Diagnostics; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||||
| using System.Threading; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Administration | namespace NadekoBot.Modules.Administration | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using ImageSharp; |  | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Modules.Gambling.Models; | using NadekoBot.Modules.Gambling.Models; | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ using NadekoBot.Attributes; | |||||||
| using NadekoBot.DataStructures; | using NadekoBot.DataStructures; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database; |  | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using Discord; | ||||||
| using Discord; |  | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
|   | |||||||
| @@ -10,7 +10,6 @@ using System.Collections.Concurrent; | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using Discord; | using Discord.Commands; | ||||||
| using Discord.Commands; |  | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using System.Text; | using System.Text; | ||||||
|   | |||||||
| @@ -1,17 +1,12 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using Discord.WebSocket; |  | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using NadekoBot.Services.Games; | using NadekoBot.Services.Games; | ||||||
| using NLog; |  | ||||||
| using System; |  | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Collections.Immutable; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| @@ -81,9 +76,7 @@ namespace NadekoBot.Modules.Games | |||||||
|  |  | ||||||
|                 var imgData = _games.GetRandomCurrencyImage(); |                 var imgData = _games.GetRandomCurrencyImage(); | ||||||
|  |  | ||||||
|                 //todo upload all currency images to transfer.sh and use that one as cdn |                 //todo 81 upload all currency images to transfer.sh and use that one as cdn | ||||||
|                 //and then  |  | ||||||
|  |  | ||||||
|                 var msgToSend = GetText("planted", |                 var msgToSend = GetText("planted", | ||||||
|                     Format.Bold(Context.User.ToString()), |                     Format.Bold(Context.User.ToString()), | ||||||
|                     amount + _bc.CurrencySign, |                     amount + _bc.CurrencySign, | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using System; | using Discord; | ||||||
| using Discord; |  | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| @@ -9,7 +8,6 @@ using System.Collections.Generic; | |||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; | using System.Text; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using ImageSharp.Processing; |  | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Games | namespace NadekoBot.Modules.Games | ||||||
|   | |||||||
| @@ -4,16 +4,7 @@ using NadekoBot.Services; | |||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Collections.Immutable; |  | ||||||
| using System.IO; |  | ||||||
| using System.Threading; |  | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using System.Net.Http; |  | ||||||
| using ImageSharp; |  | ||||||
| using NadekoBot.DataStructures; |  | ||||||
| using NLog; |  | ||||||
| using NadekoBot.Services.Games; | using NadekoBot.Services.Games; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Games | namespace NadekoBot.Modules.Games | ||||||
|   | |||||||
| @@ -357,7 +357,6 @@ namespace NadekoBot.Modules.Music | |||||||
|             var cancelSource = new CancellationTokenSource(); |             var cancelSource = new CancellationTokenSource(); | ||||||
|  |  | ||||||
|             var gusr = (IGuildUser)Context.User; |             var gusr = (IGuildUser)Context.User; | ||||||
|             //todo use grouping |  | ||||||
|             while (ids.Any() && !cancelSource.IsCancellationRequested) |             while (ids.Any() && !cancelSource.IsCancellationRequested) | ||||||
|             { |             { | ||||||
|                 var tasks = Task.WhenAll(ids.Take(5).Select(async id => |                 var tasks = Task.WhenAll(ids.Take(5).Select(async id => | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ using Discord.Commands; | |||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NLog; | using NLog; | ||||||
| using System; |  | ||||||
| using System.Globalization; | using System.Globalization; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,12 +1,4 @@ | |||||||
| using Discord; | namespace NadekoBot.Modules | ||||||
| using NadekoBot.Extensions; |  | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules |  | ||||||
| { | { | ||||||
|     public static class NadekoModuleExtensions |     public static class NadekoModuleExtensions | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,14 +1,13 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; |  | ||||||
| using NadekoBot.Modules.Games.Trivia; | using NadekoBot.Modules.Games.Trivia; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
|  | using NadekoBot.Services.Permissions; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using static NadekoBot.Services.Database.Models.BlacklistItem; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Permissions | namespace NadekoBot.Modules.Permissions | ||||||
| { | { | ||||||
| @@ -23,19 +22,19 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [Group] |         [Group] | ||||||
|         public class BlacklistCommands : NadekoSubmodule |         public class BlacklistCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             public static ConcurrentHashSet<ulong> BlacklistedUsers { get; set; } |             private readonly BlacklistService _bs; | ||||||
|             public static ConcurrentHashSet<ulong> BlacklistedGuilds { get; set; } |             private readonly DbHandler _db; | ||||||
|             public static ConcurrentHashSet<ulong> BlacklistedChannels { get; set; } |             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()) |                 _bs = bs; | ||||||
|                 { |                 _db = db; | ||||||
|                     var blacklist = uow.BotConfig.GetOrCreate().Blacklist; |                 _creds = creds; | ||||||
|                     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)); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
| @@ -65,10 +64,10 @@ namespace NadekoBot.Modules.Permissions | |||||||
|  |  | ||||||
|             private async Task Blacklist(AddRemove action, ulong id, BlacklistType type) |             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; |                     return; | ||||||
|  |  | ||||||
|                 using (var uow = DbHandler.UnitOfWork()) |                 using (var uow = _db.UnitOfWork) | ||||||
|                 { |                 { | ||||||
|                     if (action == AddRemove.Add) |                     if (action == AddRemove.Add) | ||||||
|                     { |                     { | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ using NadekoBot.Attributes; | |||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
|  | using NadekoBot.Services.Permissions; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| @@ -13,24 +14,23 @@ namespace NadekoBot.Modules.Permissions | |||||||
| { | { | ||||||
|     public partial class Permissions |     public partial class Permissions | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         public class ActiveCooldown |  | ||||||
|         { |  | ||||||
|             public string Command { get; set; } |  | ||||||
|             public ulong UserId { get; set; } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         [Group] |         [Group] | ||||||
|         public class CmdCdsCommands : NadekoSubmodule |         public class CmdCdsCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             public static ConcurrentDictionary<ulong, ConcurrentHashSet<CommandCooldown>> CommandCooldowns { get; } |             private readonly DbHandler _db; | ||||||
|             private static ConcurrentDictionary<ulong, ConcurrentHashSet<ActiveCooldown>> activeCooldowns { get; } = new ConcurrentDictionary<ulong, ConcurrentHashSet<ActiveCooldown>>(); |             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; |                 _service = service; | ||||||
|                 CommandCooldowns = new ConcurrentDictionary<ulong, ConcurrentHashSet<CommandCooldown>>(configs.ToDictionary(k => k.GuildId, v => new ConcurrentHashSet<CommandCooldown>(v.CommandCooldowns))); |                 _db = db; | ||||||
|             } |             } | ||||||
|  |              | ||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|             [RequireContext(ContextType.Guild)] |             [RequireContext(ContextType.Guild)] | ||||||
|             public async Task CmdCooldown(CommandInfo command, int secs) |             public async Task CmdCooldown(CommandInfo command, int secs) | ||||||
| @@ -42,7 +42,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                     return; |                     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 config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.CommandCooldowns)); | ||||||
|                     var localSet = CommandCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<CommandCooldown>()); |                     var localSet = CommandCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet<CommandCooldown>()); | ||||||
| @@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 } |                 } | ||||||
|                 if (secs == 0) |                 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()); |                     activeCds.RemoveWhere(ac => ac.Command == command.Aliases.First().ToLowerInvariant()); | ||||||
|                     await ReplyConfirmLocalized("cmdcd_cleared",  |                     await ReplyConfirmLocalized("cmdcd_cleared",  | ||||||
|                         Format.Bold(command.Aliases.First())).ConfigureAwait(false); |                         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); |                     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) |                 if (guild == null) | ||||||
|                     return false; |                     return false; | ||||||
|                 var cmdcds = CmdCdsCommands.CommandCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet<CommandCooldown>()); |                 var cmdcds = CommandCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet<CommandCooldown>()); | ||||||
|                 CommandCooldown cdRule; |                 CommandCooldown cdRule; | ||||||
|                 if ((cdRule = cmdcds.FirstOrDefault(cc => cc.CommandName == cmd.Aliases.First().ToLowerInvariant())) != null) |                 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) |                     if (activeCdsForGuild.FirstOrDefault(ac => ac.UserId == user.Id && ac.Command == cmd.Aliases.First().ToLowerInvariant()) != null) | ||||||
|                     { |                     { | ||||||
|                         return true; |                         return true; | ||||||
|   | |||||||
| @@ -1,16 +1,6 @@ | |||||||
| using Discord; | using Discord.Commands; | ||||||
| using Discord.Commands; |  | ||||||
| using NadekoBot.Attributes; |  | ||||||
| using NadekoBot.Extensions; |  | ||||||
| using NadekoBot.Services; |  | ||||||
| using NadekoBot.Services.Database; |  | ||||||
| using NadekoBot.Services.Database.Models; |  | ||||||
| using System; |  | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Permissions | namespace NadekoBot.Modules.Permissions | ||||||
| { | { | ||||||
| @@ -67,7 +57,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             //        Cost = cost |             //        Cost = cost | ||||||
|             //    }; |             //    }; | ||||||
|  |  | ||||||
|             //    using (var uow = DbHandler.UnitOfWork()) |             //    using (var uow = _db.UnitOfWork) | ||||||
|             //    { |             //    { | ||||||
|             //        var bc = uow.BotConfig.GetOrCreate(); |             //        var bc = uow.BotConfig.GetOrCreate(); | ||||||
|                      |                      | ||||||
|   | |||||||
| @@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore; | |||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
|  | using NadekoBot.Services.Permissions; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Linq; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Permissions | namespace NadekoBot.Modules.Permissions | ||||||
| @@ -15,46 +15,13 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [Group] |         [Group] | ||||||
|         public class FilterCommands : NadekoSubmodule |         public class FilterCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             public static ConcurrentHashSet<ulong> InviteFilteringChannels { get; } |             private readonly DbHandler _db; | ||||||
|             public static ConcurrentHashSet<ulong> InviteFilteringServers { get; } |             private readonly FilterService _service; | ||||||
|  |  | ||||||
|             //serverid, filteredwords |             public FilterCommands(FilterService service, DbHandler db) | ||||||
|             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) |  | ||||||
|             { |             { | ||||||
|                 ConcurrentHashSet<string> words = new ConcurrentHashSet<string>(); |                 _service = service; | ||||||
|                 if(WordFilteringChannels.Contains(channelId)) |                 _db = db; | ||||||
|                     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))); |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
| @@ -64,21 +31,21 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 var channel = (ITextChannel)Context.Channel; |                 var channel = (ITextChannel)Context.Channel; | ||||||
|  |  | ||||||
|                 bool enabled; |                 bool enabled; | ||||||
|                 using (var uow = DbHandler.UnitOfWork()) |                 using (var uow = _db.UnitOfWork) | ||||||
|                 { |                 { | ||||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set); |                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set); | ||||||
|                     enabled = config.FilterInvites = !config.FilterInvites; |                     enabled = config.FilterInvites = !config.FilterInvites; | ||||||
|                     await uow.CompleteAsync().ConfigureAwait(false); |                     await uow.CompleteAsync().ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|  |                  | ||||||
|                 if (enabled) |                 if (enabled) | ||||||
|                 { |                 { | ||||||
|                     InviteFilteringServers.Add(channel.Guild.Id); |                     _service.InviteFilteringServers.Add(channel.Guild.Id); | ||||||
|                     await ReplyConfirmLocalized("invite_filter_server_on").ConfigureAwait(false); |                     await ReplyConfirmLocalized("invite_filter_server_on").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     InviteFilteringServers.TryRemove(channel.Guild.Id); |                     _service.InviteFilteringServers.TryRemove(channel.Guild.Id); | ||||||
|                     await ReplyConfirmLocalized("invite_filter_server_off").ConfigureAwait(false); |                     await ReplyConfirmLocalized("invite_filter_server_off").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -90,7 +57,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 var channel = (ITextChannel)Context.Channel; |                 var channel = (ITextChannel)Context.Channel; | ||||||
|  |  | ||||||
|                 int removed; |                 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)); |                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.FilterInvitesChannelIds)); | ||||||
|                     removed = config.FilterInvitesChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); |                     removed = config.FilterInvitesChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); | ||||||
| @@ -106,7 +73,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|  |  | ||||||
|                 if (removed == 0) |                 if (removed == 0) | ||||||
|                 { |                 { | ||||||
|                     InviteFilteringChannels.Add(channel.Id); |                     _service.InviteFilteringChannels.Add(channel.Id); | ||||||
|                     await ReplyConfirmLocalized("invite_filter_channel_on").ConfigureAwait(false); |                     await ReplyConfirmLocalized("invite_filter_channel_on").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
| @@ -122,7 +89,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 var channel = (ITextChannel)Context.Channel; |                 var channel = (ITextChannel)Context.Channel; | ||||||
|  |  | ||||||
|                 bool enabled; |                 bool enabled; | ||||||
|                 using (var uow = DbHandler.UnitOfWork()) |                 using (var uow = _db.UnitOfWork) | ||||||
|                 { |                 { | ||||||
|                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set); |                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set); | ||||||
|                     enabled = config.FilterWords = !config.FilterWords; |                     enabled = config.FilterWords = !config.FilterWords; | ||||||
| @@ -131,12 +98,12 @@ namespace NadekoBot.Modules.Permissions | |||||||
|  |  | ||||||
|                 if (enabled) |                 if (enabled) | ||||||
|                 { |                 { | ||||||
|                     WordFilteringServers.Add(channel.Guild.Id); |                     _service.WordFilteringServers.Add(channel.Guild.Id); | ||||||
|                     await ReplyConfirmLocalized("word_filter_server_on").ConfigureAwait(false); |                     await ReplyConfirmLocalized("word_filter_server_on").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     WordFilteringServers.TryRemove(channel.Guild.Id); |                     _service.WordFilteringServers.TryRemove(channel.Guild.Id); | ||||||
|                     await ReplyConfirmLocalized("word_filter_server_off").ConfigureAwait(false); |                     await ReplyConfirmLocalized("word_filter_server_off").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -148,7 +115,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 var channel = (ITextChannel)Context.Channel; |                 var channel = (ITextChannel)Context.Channel; | ||||||
|  |  | ||||||
|                 int removed; |                 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)); |                     var config = uow.GuildConfigs.For(channel.Guild.Id, set => set.Include(gc => gc.FilterWordsChannelIds)); | ||||||
|                     removed = config.FilterWordsChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); |                     removed = config.FilterWordsChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); | ||||||
| @@ -164,12 +131,12 @@ namespace NadekoBot.Modules.Permissions | |||||||
|  |  | ||||||
|                 if (removed == 0) |                 if (removed == 0) | ||||||
|                 { |                 { | ||||||
|                     WordFilteringChannels.Add(channel.Id); |                     _service.WordFilteringChannels.Add(channel.Id); | ||||||
|                     await ReplyConfirmLocalized("word_filter_channel_on").ConfigureAwait(false); |                     await ReplyConfirmLocalized("word_filter_channel_on").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     WordFilteringChannels.TryRemove(channel.Id); |                     _service.WordFilteringChannels.TryRemove(channel.Id); | ||||||
|                     await ReplyConfirmLocalized("word_filter_channel_off").ConfigureAwait(false); |                     await ReplyConfirmLocalized("word_filter_channel_off").ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -186,7 +153,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                     return; |                     return; | ||||||
|  |  | ||||||
|                 int removed; |                 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)); |                     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); |                     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) |                 if (removed == 0) | ||||||
|                 { |                 { | ||||||
| @@ -218,8 +185,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             { |             { | ||||||
|                 var channel = (ITextChannel)Context.Channel; |                 var channel = (ITextChannel)Context.Channel; | ||||||
|  |  | ||||||
|                 ConcurrentHashSet<string> filteredWords; |                 _service.ServerFilteredWords.TryGetValue(channel.Guild.Id, out ConcurrentHashSet<string> filteredWords); | ||||||
|                 serverFilteredWords.TryGetValue(channel.Guild.Id, out filteredWords); |  | ||||||
|  |  | ||||||
|                 await channel.SendConfirmAsync(GetText("filter_word_list"), string.Join("\n", filteredWords)) |                 await channel.SendConfirmAsync(GetText("filter_word_list"), string.Join("\n", filteredWords)) | ||||||
|                         .ConfigureAwait(false); |                         .ConfigureAwait(false); | ||||||
|   | |||||||
| @@ -1,16 +1,11 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.DataStructures; |  | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database; | using NadekoBot.Services.Permissions; | ||||||
| using NadekoBot.TypeReaders; | using NadekoBot.TypeReaders; | ||||||
| using System; |  | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Permissions | namespace NadekoBot.Modules.Permissions | ||||||
| @@ -20,20 +15,20 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [Group] |         [Group] | ||||||
|         public class GlobalPermissionCommands : NadekoSubmodule |         public class GlobalPermissionCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             public static readonly ConcurrentHashSet<string> BlockedModules; |             private GlobalPermissionService _service; | ||||||
|             public static readonly ConcurrentHashSet<string> BlockedCommands; |             private readonly DbHandler _db; | ||||||
|  |  | ||||||
|             static GlobalPermissionCommands() |             public GlobalPermissionCommands(GlobalPermissionService service, DbHandler db) | ||||||
|             { |             { | ||||||
|                 BlockedModules = new ConcurrentHashSet<string>(NadekoBot.BotConfig.BlockedModules.Select(x => x.Name)); |                 _service = service; | ||||||
|                 BlockedCommands = new ConcurrentHashSet<string>(NadekoBot.BotConfig.BlockedCommands.Select(x => x.Name)); |                 _db = db; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|             [OwnerOnly] |             [OwnerOnly] | ||||||
|             public async Task Lgp() |             public async Task Lgp() | ||||||
|             { |             { | ||||||
|                 if (!BlockedModules.Any() && !BlockedCommands.Any()) |                 if (!_service.BlockedModules.Any() && !_service.BlockedCommands.Any()) | ||||||
|                 { |                 { | ||||||
|                     await ReplyErrorLocalized("lgp_none").ConfigureAwait(false); |                     await ReplyErrorLocalized("lgp_none").ConfigureAwait(false); | ||||||
|                     return; |                     return; | ||||||
| @@ -41,11 +36,11 @@ namespace NadekoBot.Modules.Permissions | |||||||
|  |  | ||||||
|                 var embed = new EmbedBuilder().WithOkColor(); |                 var embed = new EmbedBuilder().WithOkColor(); | ||||||
|  |  | ||||||
|                 if (BlockedModules.Any()) |                 if (_service.BlockedModules.Any()) | ||||||
|                     embed.AddField(efb => efb.WithName(GetText("blocked_modules")).WithValue(string.Join("\n", BlockedModules)).WithIsInline(false)); |                     embed.AddField(efb => efb.WithName(GetText("blocked_modules")).WithValue(string.Join("\n", _service.BlockedModules)).WithIsInline(false)); | ||||||
|  |  | ||||||
|                 if (BlockedCommands.Any()) |                 if (_service.BlockedCommands.Any()) | ||||||
|                     embed.AddField(efb => efb.WithName(GetText("blocked_commands")).WithValue(string.Join("\n", BlockedCommands)).WithIsInline(false)); |                     embed.AddField(efb => efb.WithName(GetText("blocked_commands")).WithValue(string.Join("\n", _service.BlockedCommands)).WithIsInline(false)); | ||||||
|  |  | ||||||
|                 await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); |                 await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); | ||||||
|             } |             } | ||||||
| @@ -55,9 +50,9 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             public async Task Gmod(ModuleOrCrInfo module) |             public async Task Gmod(ModuleOrCrInfo module) | ||||||
|             { |             { | ||||||
|                 var moduleName = module.Name.ToLowerInvariant(); |                 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(); |                         var bc = uow.BotConfig.GetOrCreate(); | ||||||
|                         bc.BlockedModules.Add(new Services.Database.Models.BlockedCmdOrMdl |                         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); |                     await ReplyConfirmLocalized("gmod_add", Format.Bold(module.Name)).ConfigureAwait(false); | ||||||
|                     return; |                     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(); |                         var bc = uow.BotConfig.GetOrCreate(); | ||||||
|                         bc.BlockedModules.RemoveWhere(x => x.Name == moduleName); |                         bc.BlockedModules.RemoveWhere(x => x.Name == moduleName); | ||||||
| @@ -87,9 +82,9 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             public async Task Gcmd(CommandOrCrInfo cmd) |             public async Task Gcmd(CommandOrCrInfo cmd) | ||||||
|             { |             { | ||||||
|                 var commandName = cmd.Name.ToLowerInvariant(); |                 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(); |                         var bc = uow.BotConfig.GetOrCreate(); | ||||||
|                         bc.BlockedCommands.Add(new Services.Database.Models.BlockedCmdOrMdl |                         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); |                     await ReplyConfirmLocalized("gcmd_add", Format.Bold(cmd.Name)).ConfigureAwait(false); | ||||||
|                     return; |                     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(); |                         var bc = uow.BotConfig.GetOrCreate(); | ||||||
|                         bc.BlockedCommands.RemoveWhere(x => x.Name == commandName); |                         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 NadekoBot.Services; | ||||||
| using Discord; | using Discord; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using System.Diagnostics; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using NadekoBot.DataStructures; |  | ||||||
| using NadekoBot.TypeReaders; | using NadekoBot.TypeReaders; | ||||||
| using NLog; | using NadekoBot.Services.Permissions; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Permissions | namespace NadekoBot.Modules.Permissions | ||||||
| { | { | ||||||
|     [NadekoModule("Permissions", ";")] |  | ||||||
|     public partial class Permissions : NadekoTopLevelModule |     public partial class Permissions : NadekoTopLevelModule | ||||||
|     { |     { | ||||||
|         //guildid, root permission |         private readonly DbHandler _db; | ||||||
|         public static ConcurrentDictionary<ulong, PermissionCache> Cache { get; } = |         private readonly PermissionsService _service; | ||||||
|             new ConcurrentDictionary<ulong, PermissionCache>(); |  | ||||||
|  |  | ||||||
|         static Permissions() |         public Permissions(PermissionsService service, DbHandler db) | ||||||
|         { |         { | ||||||
|             var log = LogManager.GetCurrentClassLogger(); |             _db = db; | ||||||
|             var sw = Stopwatch.StartNew(); |             _service = service; | ||||||
|  |  | ||||||
|             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; |  | ||||||
|             }); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         [NadekoCommand, Usage, Description, Aliases] |         [NadekoCommand, Usage, Description, Aliases] | ||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task Verbose(PermissionAction action) |         public async Task Verbose(PermissionAction action) | ||||||
|         { |         { | ||||||
|             using (var uow = DbHandler.UnitOfWork()) |             using (var uow = _db.UnitOfWork) | ||||||
|             { |             { | ||||||
|                 var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); |                 var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||||
|                 config.VerbosePermissions = action.Value; |                 config.VerbosePermissions = action.Value; | ||||||
|                 await uow.CompleteAsync().ConfigureAwait(false); |                 await uow.CompleteAsync().ConfigureAwait(false); | ||||||
|                 UpdateCache(config); |                 _service.UpdateCache(config); | ||||||
|             } |             } | ||||||
|             if (action.Value) |             if (action.Value) | ||||||
|             { |             { | ||||||
| @@ -187,7 +52,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             if (role != null && role == role.Guild.EveryoneRole) |             if (role != null && role == role.Guild.EveryoneRole) | ||||||
|                 return; |                 return; | ||||||
|  |  | ||||||
|             using (var uow = DbHandler.UnitOfWork()) |             using (var uow = _db.UnitOfWork) | ||||||
|             { |             { | ||||||
|                 var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); |                 var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||||
|                 if (role == null) |                 if (role == null) | ||||||
| @@ -197,7 +62,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 } |                 } | ||||||
|                 config.PermissionRole = role.Name.Trim(); |                 config.PermissionRole = role.Name.Trim(); | ||||||
|                 await uow.CompleteAsync().ConfigureAwait(false); |                 await uow.CompleteAsync().ConfigureAwait(false); | ||||||
|                 UpdateCache(config); |                 _service.UpdateCache(config); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             await ReplyConfirmLocalized("permrole_changed", Format.Bold(role.Name)).ConfigureAwait(false); |             await ReplyConfirmLocalized("permrole_changed", Format.Bold(role.Name)).ConfigureAwait(false); | ||||||
| @@ -210,10 +75,9 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             if (page < 1) |             if (page < 1) | ||||||
|                 return; |                 return; | ||||||
|  |  | ||||||
|             PermissionCache permCache; |  | ||||||
|             IList<Permissionv2> perms; |             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(); |                 perms = permCache.Permissions.Source.ToList(); | ||||||
|             } |             } | ||||||
| @@ -249,7 +113,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 Permissionv2 p; |                 Permissionv2 p; | ||||||
|                 using (var uow = DbHandler.UnitOfWork()) |                 using (var uow = _db.UnitOfWork) | ||||||
|                 { |                 { | ||||||
|                     var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); |                     var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||||
|                     var permsCol = new PermissionsCollection<Permissionv2>(config.Permissions); |                     var permsCol = new PermissionsCollection<Permissionv2>(config.Permissions); | ||||||
| @@ -257,7 +121,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                     permsCol.RemoveAt(index); |                     permsCol.RemoveAt(index); | ||||||
|                     uow._context.Remove(p); |                     uow._context.Remove(p); | ||||||
|                     await uow.CompleteAsync().ConfigureAwait(false); |                     await uow.CompleteAsync().ConfigureAwait(false); | ||||||
|                     UpdateCache(config); |                     _service.UpdateCache(config); | ||||||
|                 } |                 } | ||||||
|                 await ReplyConfirmLocalized("removed", |                 await ReplyConfirmLocalized("removed", | ||||||
|                     index + 1, |                     index + 1, | ||||||
| @@ -280,7 +144,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     Permissionv2 fromPerm; |                     Permissionv2 fromPerm; | ||||||
|                     using (var uow = DbHandler.UnitOfWork()) |                     using (var uow = _db.UnitOfWork) | ||||||
|                     { |                     { | ||||||
|                         var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); |                         var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); | ||||||
|                         var permsCol = new PermissionsCollection<Permissionv2>(config.Permissions); |                         var permsCol = new PermissionsCollection<Permissionv2>(config.Permissions); | ||||||
| @@ -304,7 +168,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                         permsCol.RemoveAt(from); |                         permsCol.RemoveAt(from); | ||||||
|                         permsCol.Insert(to, fromPerm); |                         permsCol.Insert(to, fromPerm); | ||||||
|                         await uow.CompleteAsync().ConfigureAwait(false); |                         await uow.CompleteAsync().ConfigureAwait(false); | ||||||
|                         UpdateCache(config); |                         _service.UpdateCache(config); | ||||||
|                     } |                     } | ||||||
|                     await ReplyConfirmLocalized("moved_permission", |                     await ReplyConfirmLocalized("moved_permission", | ||||||
|                             Format.Code(fromPerm.GetCommand((SocketGuild) Context.Guild)), |                             Format.Code(fromPerm.GetCommand((SocketGuild) Context.Guild)), | ||||||
| @@ -324,7 +188,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task SrvrCmd(CommandOrCrInfo command, PermissionAction action) |         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, |                 PrimaryTarget = PrimaryPermissionType.Server, | ||||||
|                 PrimaryTargetId = 0, |                 PrimaryTargetId = 0, | ||||||
| @@ -351,7 +215,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task SrvrMdl(ModuleOrCrInfo module, PermissionAction action) |         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, |                 PrimaryTarget = PrimaryPermissionType.Server, | ||||||
|                 PrimaryTargetId = 0, |                 PrimaryTargetId = 0, | ||||||
| @@ -378,7 +242,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task UsrCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] IGuildUser user) |         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, |                 PrimaryTarget = PrimaryPermissionType.User, | ||||||
|                 PrimaryTargetId = user.Id, |                 PrimaryTargetId = user.Id, | ||||||
| @@ -407,7 +271,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task UsrMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] IGuildUser user) |         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, |                 PrimaryTarget = PrimaryPermissionType.User, | ||||||
|                 PrimaryTargetId = user.Id, |                 PrimaryTargetId = user.Id, | ||||||
| @@ -439,7 +303,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             if (role == role.Guild.EveryoneRole) |             if (role == role.Guild.EveryoneRole) | ||||||
|                 return; |                 return; | ||||||
|  |  | ||||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 |             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||||
|             { |             { | ||||||
|                 PrimaryTarget = PrimaryPermissionType.Role, |                 PrimaryTarget = PrimaryPermissionType.Role, | ||||||
|                 PrimaryTargetId = role.Id, |                 PrimaryTargetId = role.Id, | ||||||
| @@ -471,7 +335,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             if (role == role.Guild.EveryoneRole) |             if (role == role.Guild.EveryoneRole) | ||||||
|                 return; |                 return; | ||||||
|  |  | ||||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 |             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||||
|             { |             { | ||||||
|                 PrimaryTarget = PrimaryPermissionType.Role, |                 PrimaryTarget = PrimaryPermissionType.Role, | ||||||
|                 PrimaryTargetId = role.Id, |                 PrimaryTargetId = role.Id, | ||||||
| @@ -501,7 +365,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task ChnlCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] ITextChannel chnl) |         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, |                 PrimaryTarget = PrimaryPermissionType.Channel, | ||||||
|                 PrimaryTargetId = chnl.Id, |                 PrimaryTargetId = chnl.Id, | ||||||
| @@ -530,7 +394,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task ChnlMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] ITextChannel chnl) |         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, |                 PrimaryTarget = PrimaryPermissionType.Channel, | ||||||
|                 PrimaryTargetId = chnl.Id, |                 PrimaryTargetId = chnl.Id, | ||||||
| @@ -559,7 +423,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task AllChnlMdls(PermissionAction action, [Remainder] ITextChannel chnl) |         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, |                 PrimaryTarget = PrimaryPermissionType.Channel, | ||||||
|                 PrimaryTargetId = chnl.Id, |                 PrimaryTargetId = chnl.Id, | ||||||
| @@ -587,7 +451,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|             if (role == role.Guild.EveryoneRole) |             if (role == role.Guild.EveryoneRole) | ||||||
|                 return; |                 return; | ||||||
|  |  | ||||||
|             await AddPermissions(Context.Guild.Id, new Permissionv2 |             await _service.AddPermissions(Context.Guild.Id, new Permissionv2 | ||||||
|             { |             { | ||||||
|                 PrimaryTarget = PrimaryPermissionType.Role, |                 PrimaryTarget = PrimaryPermissionType.Role, | ||||||
|                 PrimaryTargetId = role.Id, |                 PrimaryTargetId = role.Id, | ||||||
| @@ -612,7 +476,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         public async Task AllUsrMdls(PermissionAction action, [Remainder] IUser user) |         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, |                 PrimaryTarget = PrimaryPermissionType.User, | ||||||
|                 PrimaryTargetId = user.Id, |                 PrimaryTargetId = user.Id, | ||||||
| @@ -655,7 +519,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|                 State = true, |                 State = true, | ||||||
|             }; |             }; | ||||||
|  |  | ||||||
|             await AddPermissions(Context.Guild.Id, |             await _service.AddPermissions(Context.Guild.Id, | ||||||
|                 newPerm, |                 newPerm, | ||||||
|                 allowUser); |                 allowUser); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,14 +1,9 @@ | |||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Modules.Searches.Models; |  | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Searches; | using NadekoBot.Services.Searches; | ||||||
| using Newtonsoft.Json; |  | ||||||
| using Newtonsoft.Json.Linq; | using Newtonsoft.Json.Linq; | ||||||
| using NLog; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.IO; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Net.Http; | using System.Net.Http; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||||
| using System.IO; | using System.IO; | ||||||
|   | |||||||
| @@ -1,8 +1,4 @@ | |||||||
| using System; | using System.Collections.Generic; | ||||||
| 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 | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Modules.Searches.Commands.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Searches.Commands.Models |  | ||||||
| { | { | ||||||
|     public struct GoogleSearchResult |     public struct GoogleSearchResult | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||||
| using System; |  | ||||||
| using System.Text.RegularExpressions; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Searches.Models | namespace NadekoBot.Modules.Searches.Models | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,9 +1,4 @@ | |||||||
| using Newtonsoft.Json; | 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 | namespace NadekoBot.Modules.Searches.Commands.Models | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,8 +1,4 @@ | |||||||
| using System; | using System.Collections.Generic; | ||||||
| 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 | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.API; |  | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||||
|   | |||||||
| @@ -2,12 +2,8 @@ | |||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Modules.Searches.Models; |  | ||||||
| using NadekoBot.Services.Searches; | using NadekoBot.Services.Searches; | ||||||
| using Newtonsoft.Json; |  | ||||||
| using NLog; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.IO; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ using Discord; | |||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using System.Threading; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
|   | |||||||
| @@ -2,11 +2,8 @@ | |||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using System; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using Discord.WebSocket; |  | ||||||
| using NadekoBot.Services.Searches; | using NadekoBot.Services.Searches; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ using NadekoBot.Attributes; | |||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
|  | using NadekoBot.Services.Utility; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|   | |||||||
| @@ -3,9 +3,8 @@ using Discord.Commands; | |||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using System; | using NadekoBot.Services.Utility; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Linq; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Utility | namespace NadekoBot.Modules.Utility | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ using System.Linq; | |||||||
| using System.Text; | using System.Text; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using NadekoBot.Modules.Utility.Models; | using NadekoBot.Services.Utility; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Utility | namespace NadekoBot.Modules.Utility | ||||||
| { | { | ||||||
| @@ -20,11 +20,11 @@ namespace NadekoBot.Modules.Utility | |||||||
|         [Group] |         [Group] | ||||||
|         public class RepeatCommands : NadekoSubmodule |         public class RepeatCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             private readonly UtilityService _service; |             private readonly MessageRepeaterService _service; | ||||||
|             private readonly DiscordShardedClient _client; |             private readonly DiscordShardedClient _client; | ||||||
|             private readonly DbHandler _db; |             private readonly DbHandler _db; | ||||||
|  |  | ||||||
|             public RepeatCommands(UtilityService service, DiscordShardedClient client, DbHandler db) |             public RepeatCommands(MessageRepeaterService service, DiscordShardedClient client, DbHandler db) | ||||||
|             { |             { | ||||||
|                 _service = service; |                 _service = service; | ||||||
|                 _client = client; |                 _client = client; | ||||||
|   | |||||||
| @@ -4,12 +4,10 @@ using NadekoBot.Attributes; | |||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; | using NadekoBot.Services; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using NLog; | using NadekoBot.Services.Utility; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; |  | ||||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||||
| using System.Threading; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Utility | namespace NadekoBot.Modules.Utility | ||||||
| @@ -19,10 +17,10 @@ namespace NadekoBot.Modules.Utility | |||||||
|         [Group] |         [Group] | ||||||
|         public class RemindCommands : NadekoSubmodule |         public class RemindCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             private readonly UtilityService _service; |             private readonly RemindService _service; | ||||||
|             private readonly DbHandler _db; |             private readonly DbHandler _db; | ||||||
|  |  | ||||||
|             public RemindCommands(UtilityService service, DbHandler db) |             public RemindCommands(RemindService service, DbHandler db) | ||||||
|             { |             { | ||||||
|                 _service = service; |                 _service = service; | ||||||
|                 _db = db; |                 _db = db; | ||||||
| @@ -63,7 +61,7 @@ namespace NadekoBot.Modules.Utility | |||||||
|  |  | ||||||
|             public async Task RemindInternal(ulong targetId, bool isPrivate, string timeStr, [Remainder] string message) |             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) |                 if (m.Length == 0) | ||||||
|                 { |                 { | ||||||
| @@ -74,7 +72,7 @@ namespace NadekoBot.Modules.Utility | |||||||
|                 string output = ""; |                 string output = ""; | ||||||
|                 var namesAndValues = new Dictionary<string, int>(); |                 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; |                     if (groupName == "0") continue; | ||||||
|                     int value; |                     int value; | ||||||
| @@ -134,7 +132,7 @@ namespace NadekoBot.Modules.Utility | |||||||
|                 { |                 { | ||||||
|                     // ignored |                     // ignored | ||||||
|                 } |                 } | ||||||
|                 await _service.Remind.StartReminder(rem); |                 await _service.StartReminder(rem); | ||||||
|             } |             } | ||||||
|              |              | ||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
| using Discord.Commands; | using Discord.Commands; | ||||||
| using NadekoBot.Attributes; | using NadekoBot.Attributes; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
|  | using NadekoBot.Services.Utility; | ||||||
| using System; | using System; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| @@ -13,9 +14,9 @@ namespace NadekoBot.Modules.Utility | |||||||
|         [Group] |         [Group] | ||||||
|         public class UnitConverterCommands : NadekoSubmodule |         public class UnitConverterCommands : NadekoSubmodule | ||||||
|         { |         { | ||||||
|             private readonly UtilityService _service; |             private readonly ConverterService _service; | ||||||
|  |  | ||||||
|             public UnitConverterCommands(UtilityService service) |             public UnitConverterCommands(ConverterService service) | ||||||
|             { |             { | ||||||
|                 _service = service; |                 _service = service; | ||||||
|             } |             } | ||||||
| @@ -23,7 +24,7 @@ namespace NadekoBot.Modules.Utility | |||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|             public async Task ConvertList() |             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")) |                                .Aggregate(new EmbedBuilder().WithTitle(GetText("convertlist")) | ||||||
|                                                             .WithColor(NadekoBot.OkColor), |                                                             .WithColor(NadekoBot.OkColor), | ||||||
|                                           (embed, g) => embed.AddField(efb => |                                           (embed, g) => embed.AddField(efb => | ||||||
| @@ -35,8 +36,8 @@ namespace NadekoBot.Modules.Utility | |||||||
|             [NadekoCommand, Usage, Description, Aliases] |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|             public async Task Convert(string origin, string target, decimal value) |             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 originUnit = _service.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 targetUnit = _service.Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(target.ToLowerInvariant())); | ||||||
|                 if (originUnit == null || targetUnit == null) |                 if (originUnit == null || targetUnit == null) | ||||||
|                 { |                 { | ||||||
|                     await ReplyErrorLocalized("convert_not_found", Format.Bold(origin), Format.Bold(target)).ConfigureAwait(false); |                     await ReplyErrorLocalized("convert_not_found", Format.Bold(origin), Format.Bold(target)).ConfigureAwait(false); | ||||||
|   | |||||||
| @@ -1,9 +1,4 @@ | |||||||
| using Newtonsoft.Json.Linq; | 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 | namespace NadekoBot.Modules.Utility.Models | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Modules.Utility.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Utility.Models |  | ||||||
| { | { | ||||||
|     public class Attributes |     public class Attributes | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Modules.Utility.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Utility.Models |  | ||||||
| { | { | ||||||
|     public class DiscordConnection |     public class DiscordConnection | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -15,10 +15,11 @@ using ImageSharp; | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using NadekoBot.Services; |  | ||||||
| using System.Diagnostics; | using System.Diagnostics; | ||||||
|  | using NadekoBot.Modules; | ||||||
|  | using Color = Discord.Color; | ||||||
|  |  | ||||||
| namespace NadekoBot.Modules.Utility | namespace NadekoBot.Services.Utility | ||||||
| { | { | ||||||
|     public partial class Utility : NadekoTopLevelModule |     public partial class Utility : NadekoTopLevelModule | ||||||
|     { |     { | ||||||
| @@ -164,7 +165,7 @@ namespace NadekoBot.Modules.Utility | |||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     var color = hexColors[i]; |                     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; |                     ++i; | ||||||
|                     if (i >= hexColors.Length) |                     if (i >= hexColors.Length) | ||||||
|                         i = 0; |                         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,20 +16,21 @@ using System.Collections.Immutable; | |||||||
| using System.Diagnostics; | using System.Diagnostics; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using NadekoBot.Modules.Utility; |  | ||||||
| using NadekoBot.Services.Searches; | using NadekoBot.Services.Searches; | ||||||
| using NadekoBot.Services.ClashOfClans; | using NadekoBot.Services.ClashOfClans; | ||||||
| using NadekoBot.Services.Music; | using NadekoBot.Services.Music; | ||||||
| using NadekoBot.Services.CustomReactions; | using NadekoBot.Services.CustomReactions; | ||||||
| using NadekoBot.Services.Games; | using NadekoBot.Services.Games; | ||||||
| using NadekoBot.Services.Administration; | using NadekoBot.Services.Administration; | ||||||
|  | using NadekoBot.Services.Permissions; | ||||||
|  | using NadekoBot.Services.Utility; | ||||||
|  |  | ||||||
| namespace NadekoBot | namespace NadekoBot | ||||||
| { | { | ||||||
|     public class NadekoBot |     public class NadekoBot | ||||||
|     { |     { | ||||||
|         private Logger _log; |         private Logger _log; | ||||||
|          |  | ||||||
|         /* I don't know how to make this not be static |         /* I don't know how to make this not be static | ||||||
|          * and keep the convenience of .WithOkColor |          * and keep the convenience of .WithOkColor | ||||||
|          * and .WithErrorColor extensions methods. |          * and .WithErrorColor extensions methods. | ||||||
| @@ -38,26 +39,30 @@ namespace NadekoBot | |||||||
|          * I'll keep this for now */ |          * I'll keep this for now */ | ||||||
|         public static Color OkColor { get; private set; } |         public static Color OkColor { get; private set; } | ||||||
|         public static Color ErrorColor { get; private set; } |         public static Color ErrorColor { get; private set; } | ||||||
|          |  | ||||||
|         //todo placeholder, will be guild-based |         //todo placeholder, will be guild-based | ||||||
|         public static string Prefix { get; } = "."; |         public static string Prefix { get; } = "."; | ||||||
|  |  | ||||||
|         public ImmutableArray<GuildConfig> AllGuildConfigs { get; } |         public ImmutableArray<GuildConfig> AllGuildConfigs { get; } | ||||||
|         public BotConfig BotConfig { get; } |         public BotConfig BotConfig { get; } | ||||||
|  |         public DbHandler Db { get; } | ||||||
|  |         public CommandService CommandService { get; } | ||||||
|  |  | ||||||
|         public DiscordShardedClient Client { get; } |         public DiscordShardedClient Client { get; } | ||||||
|         public bool Ready { get; private set; } |         public bool Ready { get; private set; } | ||||||
|  |  | ||||||
|         public INServiceProvider Services { get; } |         public INServiceProvider Services { get; private set; } | ||||||
|  |         public BotCredentials Credentials { get; } | ||||||
|  |  | ||||||
|         public NadekoBot() |         public NadekoBot() | ||||||
|         { |         { | ||||||
|             SetupLogger(); |             SetupLogger(); | ||||||
|             _log = LogManager.GetCurrentClassLogger(); |             _log = LogManager.GetCurrentClassLogger(); | ||||||
|  |  | ||||||
|             var credentials = new BotCredentials(); |             Credentials = new BotCredentials(); | ||||||
|             var db = new DbHandler(credentials); |             Db = new DbHandler(Credentials); | ||||||
|             using (var uow = db.UnitOfWork) |  | ||||||
|  |             using (var uow = Db.UnitOfWork) | ||||||
|             { |             { | ||||||
|                 AllGuildConfigs = uow.GuildConfigs.GetAllGuildConfigs().ToImmutableArray(); |                 AllGuildConfigs = uow.GuildConfigs.GetAllGuildConfigs().ToImmutableArray(); | ||||||
|                 BotConfig = uow.BotConfig.GetOrCreate(); |                 BotConfig = uow.BotConfig.GetOrCreate(); | ||||||
| @@ -69,74 +74,88 @@ namespace NadekoBot | |||||||
|             { |             { | ||||||
|                 MessageCacheSize = 10, |                 MessageCacheSize = 10, | ||||||
|                 LogLevel = LogSeverity.Warning, |                 LogLevel = LogSeverity.Warning, | ||||||
|                 TotalShards = credentials.TotalShards, |                 TotalShards = Credentials.TotalShards, | ||||||
|                 ConnectionTimeout = int.MaxValue, |                 ConnectionTimeout = int.MaxValue, | ||||||
|                 AlwaysDownloadUsers = true, |                 AlwaysDownloadUsers = true, | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             var google = new GoogleApiService(credentials); |             CommandService = new CommandService(new CommandServiceConfig() | ||||||
|             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() |  | ||||||
|             { |             { | ||||||
|                 CaseSensitiveCommands = false, |                 CaseSensitiveCommands = false, | ||||||
|                 DefaultRunMode = RunMode.Sync, |                 DefaultRunMode = RunMode.Sync, | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             var commandHandler = new CommandHandler(Client, commandService, credentials, this); | #if GLOBAL_NADEKO | ||||||
|  |             Client.Log += Client_Log; | ||||||
|             var stats = new StatsService(Client, commandHandler, credentials); | #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 images = new ImagesService(); | ||||||
|  |             var currencyHandler = new CurrencyHandler(BotConfig, Db); | ||||||
|             var currencyHandler = new CurrencyHandler(BotConfig, db); |  | ||||||
|  |  | ||||||
|             var soundcloud = new SoundCloudApiService(credentials); |  | ||||||
|  |  | ||||||
|             //module services |             //module services | ||||||
|             //todo 90 - Make this automatic |             //todo 90 - autodiscover, DI, and add instead of manual like this | ||||||
|             var utilityService = new UtilityService(AllGuildConfigs, Client, BotConfig, db); |             #region utility | ||||||
| #region Searches |             var utilityService = new UtilityService(AllGuildConfigs, Client); | ||||||
|             var searchesService = new SearchesService(Client, google, db); |             var remindService = new RemindService(Client, BotConfig, Db); | ||||||
|             var streamNotificationService = new StreamNotificationService(db, Client, strings); |             var repeaterService = new MessageRepeaterService(Client, AllGuildConfigs); | ||||||
| #endregion |             var converterService = new ConverterService(Db); | ||||||
|             var clashService = new ClashOfClansService(Client, db, localization, strings); |             #endregion | ||||||
|             var musicService = new MusicService(google, strings, localization, db, soundcloud, credentials); |             #region Searches | ||||||
|             var crService = new CustomReactionsService(db, Client); |             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); |             var gamesService = new GamesService(Client, BotConfig, AllGuildConfigs, strings, images); | ||||||
| #region administration |             #region administration | ||||||
|             var administrationService = new AdministrationService(AllGuildConfigs, commandHandler); |             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 vcRoleService = new VcRoleService(Client, AllGuildConfigs); | ||||||
|             var vPlusTService = new VplusTService(Client, AllGuildConfigs, strings, db); |             var vPlusTService = new VplusTService(Client, AllGuildConfigs, strings, Db); | ||||||
|             var muteService = new MuteService(Client, AllGuildConfigs, db); |             var muteService = new MuteService(Client, AllGuildConfigs, Db); | ||||||
|             var ratelimitService = new RatelimitService(Client, AllGuildConfigs); |             var ratelimitService = new RatelimitService(Client, AllGuildConfigs); | ||||||
|             var protectionService = new ProtectionService(Client, AllGuildConfigs, muteService); |             var protectionService = new ProtectionService(Client, AllGuildConfigs, muteService); | ||||||
|             var playingRotateService = new PlayingRotateService(Client, BotConfig, musicService); |             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 autoAssignRoleService = new AutoAssignRoleService(Client, AllGuildConfigs); | ||||||
| #endregion |             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 |             //initialize Services | ||||||
|             Services = new NServiceProvider.ServiceProviderBuilder() |             Services = new NServiceProvider.ServiceProviderBuilder() | ||||||
|                 .Add<ILocalization>(localization) |                 .Add<ILocalization>(localization) | ||||||
|                 .Add<IStatsService>(stats) |                 .Add<IStatsService>(stats) | ||||||
|                 .Add<IImagesService>(images) |                 .Add<IImagesService>(images) | ||||||
|                 .Add<IGoogleApiService>(google) |                 .Add<IGoogleApiService>(googleApiService) | ||||||
|                 .Add<IStatsService>(stats) |                 .Add<IStatsService>(stats) | ||||||
|                 .Add<IBotCredentials>(credentials) |                 .Add<IBotCredentials>(Credentials) | ||||||
|                 .Add<CommandService>(commandService) |                 .Add<CommandService>(CommandService) | ||||||
|                 .Add<NadekoStrings>(strings) |                 .Add<NadekoStrings>(strings) | ||||||
|                 .Add<DiscordShardedClient>(Client) |                 .Add<DiscordShardedClient>(Client) | ||||||
|                 .Add<BotConfig>(BotConfig) |                 .Add<BotConfig>(BotConfig) | ||||||
|                 .Add<CurrencyHandler>(currencyHandler) |                 .Add<CurrencyHandler>(currencyHandler) | ||||||
|                 .Add<CommandHandler>(commandHandler) |                 .Add<CommandHandler>(commandHandler) | ||||||
|                 .Add<DbHandler>(db) |                 .Add<DbHandler>(Db) | ||||||
|                 //modules |                 //modules | ||||||
|                 .Add<UtilityService>(utilityService) |                 .Add<UtilityService>(utilityService) | ||||||
|  |                     .Add(remindService) | ||||||
|  |                     .Add(repeaterService) | ||||||
|  |                     .Add(converterService) | ||||||
|                 .Add<SearchesService>(searchesService) |                 .Add<SearchesService>(searchesService) | ||||||
|                     .Add(streamNotificationService) |                     .Add(streamNotificationService) | ||||||
|                 .Add<ClashOfClansService>(clashService) |                 .Add<ClashOfClansService>(clashService) | ||||||
| @@ -154,37 +173,30 @@ namespace NadekoBot | |||||||
|                     .Add(gameVcService) |                     .Add(gameVcService) | ||||||
|                     .Add(autoAssignRoleService) |                     .Add(autoAssignRoleService) | ||||||
|                     .Add(protectionService) |                     .Add(protectionService) | ||||||
|  |                 .Add<PermissionsService>(permissionsService) | ||||||
|  |                     .Add(blacklistService) | ||||||
|  |                     .Add(cmdcdsService) | ||||||
|  |                     .Add(filterService) | ||||||
|  |                     .Add(globalPermsService) | ||||||
|                 .Build(); |                 .Build(); | ||||||
|  |  | ||||||
|             commandHandler.AddServices(Services); |             commandHandler.AddServices(Services); | ||||||
|  |  | ||||||
|             //setup typereaders |             //setup typereaders | ||||||
|             commandService.AddTypeReader<PermissionAction>(new PermissionActionTypeReader()); |             CommandService.AddTypeReader<PermissionAction>(new PermissionActionTypeReader()); | ||||||
|             commandService.AddTypeReader<CommandInfo>(new CommandTypeReader(commandService)); |             CommandService.AddTypeReader<CommandInfo>(new CommandTypeReader(CommandService)); | ||||||
|             //commandService.AddTypeReader<CommandOrCrInfo>(new CommandOrCrTypeReader()); |             CommandService.AddTypeReader<CommandOrCrInfo>(new CommandOrCrTypeReader(crService, CommandService)); | ||||||
|             commandService.AddTypeReader<ModuleInfo>(new ModuleTypeReader(commandService)); |             CommandService.AddTypeReader<ModuleInfo>(new ModuleTypeReader(CommandService)); | ||||||
|             commandService.AddTypeReader<ModuleOrCrInfo>(new ModuleOrCrTypeReader(commandService)); |             CommandService.AddTypeReader<ModuleOrCrInfo>(new ModuleOrCrTypeReader(CommandService)); | ||||||
|             commandService.AddTypeReader<IGuild>(new GuildTypeReader(Client)); |             CommandService.AddTypeReader<IGuild>(new GuildTypeReader(Client)); | ||||||
|  |  | ||||||
| #if GLOBAL_NADEKO |  | ||||||
|             Client.Log += Client_Log; |  | ||||||
| #endif |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         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 |             //connect | ||||||
|             await Client.LoginAsync(TokenType.Bot, creds.Token).ConfigureAwait(false); |             await Client.LoginAsync(TokenType.Bot, token).ConfigureAwait(false); | ||||||
|             await Client.StartAsync().ConfigureAwait(false); |             await Client.StartAsync().ConfigureAwait(false); | ||||||
|              |  | ||||||
|             // wait for all shards to be ready |             // wait for all shards to be ready | ||||||
|             int readyCount = 0; |             int readyCount = 0; | ||||||
|             foreach (var s in Client.Shards) |             foreach (var s in Client.Shards) | ||||||
| @@ -192,19 +204,33 @@ namespace NadekoBot | |||||||
|  |  | ||||||
|             while (readyCount < Client.Shards.Count) |             while (readyCount < Client.Shards.Count) | ||||||
|                 await Task.Delay(100).ConfigureAwait(false); |                 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(); |             sw.Stop(); | ||||||
|             _log.Info("Connected in " + sw.Elapsed.TotalSeconds.ToString("F2")); |             _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 |             // start handling messages received in commandhandler | ||||||
|             await commandHandler.StartHandling().ConfigureAwait(false); |             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 | #if !GLOBAL_NADEKO | ||||||
|             //todo uncomment this |             //todo uncomment this | ||||||
|             //await commandService.AddModuleAsync<Music>().ConfigureAwait(false); |             //await CommandService.AddModuleAsync<Music>().ConfigureAwait(false); | ||||||
| #endif | #endif | ||||||
|             Ready = true; |             Ready = true; | ||||||
|             _log.Info(await stats.Print().ConfigureAwait(false)); |             _log.Info(await stats.Print().ConfigureAwait(false)); | ||||||
|   | |||||||
| @@ -30,13 +30,10 @@ | |||||||
|     <Compile Remove="data\**\*;credentials.json;credentials_example.json" /> |     <Compile Remove="data\**\*;credentials.json;credentials_example.json" /> | ||||||
|     <Compile Remove="Modules\Administration\**" /> |     <Compile Remove="Modules\Administration\**" /> | ||||||
|     <Compile Remove="Modules\NSFW\**" /> |     <Compile Remove="Modules\NSFW\**" /> | ||||||
|     <Compile Remove="Modules\Permissions\**" /> |  | ||||||
|     <EmbeddedResource Remove="Modules\Administration\**" /> |     <EmbeddedResource Remove="Modules\Administration\**" /> | ||||||
|     <EmbeddedResource Remove="Modules\NSFW\**" /> |     <EmbeddedResource Remove="Modules\NSFW\**" /> | ||||||
|     <EmbeddedResource Remove="Modules\Permissions\**" /> |  | ||||||
|     <None Remove="Modules\Administration\**" /> |     <None Remove="Modules\Administration\**" /> | ||||||
|     <None Remove="Modules\NSFW\**" /> |     <None Remove="Modules\NSFW\**" /> | ||||||
|     <None Remove="Modules\Permissions\**" /> |  | ||||||
|     <Compile Remove="Modules\Gambling\Commands\Lucky7Commands.cs" /> |     <Compile Remove="Modules\Gambling\Commands\Lucky7Commands.cs" /> | ||||||
|     <Compile Include="Modules\Administration\Administration.cs" /> |     <Compile Include="Modules\Administration\Administration.cs" /> | ||||||
|     <Compile Include="Modules\Administration\Commands\AutoAssignRoleCommands.cs" /> |     <Compile Include="Modules\Administration\Commands\AutoAssignRoleCommands.cs" /> | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ using System; | |||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Administration | namespace NadekoBot.Services.Administration | ||||||
|   | |||||||
| @@ -6,9 +6,7 @@ using NLog; | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Administration | namespace NadekoBot.Services.Administration | ||||||
| { | { | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ using System; | |||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Administration | namespace NadekoBot.Services.Administration | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ using System; | |||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,4 @@ | |||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using NLog; |  | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Administration | namespace NadekoBot.Services.Administration | ||||||
|   | |||||||
| @@ -1,11 +1,8 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Administration | namespace NadekoBot.Services.Administration | ||||||
| { | { | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ using System; | |||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Administration | namespace NadekoBot.Services.Administration | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ using System; | |||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using NadekoBot.DataStructures.ModuleBehaviors; |  | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System; | using System; | ||||||
| @@ -13,8 +12,8 @@ using System.Threading.Tasks; | |||||||
|  |  | ||||||
| namespace NadekoBot.Services.ClashOfClans | 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.  |     // 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 everything that has to do with strings |     // service should just handle the state, module should print out what happened, so anything that has to do with strings | ||||||
|     // shouldn't be here |     // shouldn't be here | ||||||
|     public class ClashOfClansService |     public class ClashOfClansService | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -2,7 +2,6 @@ | |||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using NadekoBot.DataStructures; | using NadekoBot.DataStructures; | ||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| using NadekoBot.Services; |  | ||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|   | |||||||
| @@ -1,8 +1,4 @@ | |||||||
| using Discord; | using System.Collections.Generic; | ||||||
| using NadekoBot.Services.Database.Models; |  | ||||||
| using System.Collections.Concurrent; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.ComponentModel.DataAnnotations.Schema; |  | ||||||
| namespace NadekoBot.Services.Database.Models | namespace NadekoBot.Services.Database.Models | ||||||
| { | { | ||||||
|     public class AntiRaidSetting : DbEntity |     public class AntiRaidSetting : DbEntity | ||||||
|   | |||||||
| @@ -104,13 +104,13 @@ Nadeko Support Server: https://discord.gg/nadekobot"; | |||||||
|     { |     { | ||||||
|         public ulong ItemId { get; set; } |         public ulong ItemId { get; set; } | ||||||
|         public BlacklistType Type { get; set; } |         public BlacklistType Type { get; set; } | ||||||
|  |     } | ||||||
|  |  | ||||||
|         public enum BlacklistType |     public enum BlacklistType | ||||||
|         { |     { | ||||||
|             Server, |         Server, | ||||||
|             Channel, |         Channel, | ||||||
|             User |         User | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public class EightBallResponse : DbEntity |     public class EightBallResponse : DbEntity | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Services.Database.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Database.Models |  | ||||||
| { | { | ||||||
|     public class CommandCost : DbEntity |     public class CommandCost : DbEntity | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Services.Database.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Database.Models |  | ||||||
| { | { | ||||||
|     public class CommandPrice : DbEntity |     public class CommandPrice : DbEntity | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Services.Database.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Database.Models |  | ||||||
| { | { | ||||||
|     public class DiscordUser : DbEntity |     public class DiscordUser : DbEntity | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,9 +1,4 @@ | |||||||
| using NadekoBot.Extensions; | using NadekoBot.Extensions; | ||||||
| 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 | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace NadekoBot.Services.Database.Models | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Database.Models |  | ||||||
| { | { | ||||||
|     public class WaifuUpdate : DbEntity |     public class WaifuUpdate : DbEntity | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,10 +1,5 @@ | |||||||
| using Discord; | using Discord; | ||||||
| using NadekoBot.Services.Database.Models; | 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 | namespace NadekoBot.Services.Database.Repositories | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Database.Repositories | namespace NadekoBot.Services.Database.Repositories | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl | |||||||
|                              .Include(bc => bc.StartupCommands) |                              .Include(bc => bc.StartupCommands) | ||||||
|                              .Include(bc => bc.BlockedCommands) |                              .Include(bc => bc.BlockedCommands) | ||||||
|                              .Include(bc => bc.BlockedModules) |                              .Include(bc => bc.BlockedModules) | ||||||
|  |                              .Include(bc => bc.Blacklist) | ||||||
|                              //.Include(bc => bc.CommandCosts) |                              //.Include(bc => bc.CommandCosts) | ||||||
|                              .FirstOrDefault(); |                              .FirstOrDefault(); | ||||||
|             else |             else | ||||||
|   | |||||||
| @@ -1,9 +1,5 @@ | |||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Discord; | using Discord; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,8 +2,6 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace NadekoBot.Services.Database.Repositories.Impl | namespace NadekoBot.Services.Database.Repositories.Impl | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| using NadekoBot.Services.Database.Models; | using NadekoBot.Services.Database.Models; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using System; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | 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