using Discord; using Discord.Commands; using NadekoBot.Services; using NadekoBot.Services.Database.Models; using System.Threading.Tasks; using NadekoBot.Common.Attributes; using NadekoBot.Common.Collections; using NadekoBot.Modules.Permissions.Services; using NadekoBot.Common.TypeReaders; namespace NadekoBot.Modules.Permissions { public partial class Permissions { [Group] public class BlacklistCommands : NadekoSubmodule { private readonly BlacklistService _bs; private readonly DbService _db; private readonly IBotCredentials _creds; private ConcurrentHashSet BlacklistedUsers => _bs.BlacklistedUsers; private ConcurrentHashSet BlacklistedGuilds => _bs.BlacklistedGuilds; private ConcurrentHashSet BlacklistedChannels => _bs.BlacklistedChannels; public BlacklistCommands(BlacklistService bs, DbService db, IBotCredentials creds) { _bs = bs; _db = db; _creds = creds; } [NadekoCommand, Usage, Description, Aliases] [OwnerOnly] public Task UserBlacklist(AddRemove action, ulong id) => Blacklist(action, id, BlacklistType.User); [NadekoCommand, Usage, Description, Aliases] [OwnerOnly] public Task UserBlacklist(AddRemove action, IUser usr) => Blacklist(action, usr.Id, BlacklistType.User); [NadekoCommand, Usage, Description, Aliases] [OwnerOnly] public Task ChannelBlacklist(AddRemove action, ulong id) => Blacklist(action, id, BlacklistType.Channel); [NadekoCommand, Usage, Description, Aliases] [OwnerOnly] public Task ServerBlacklist(AddRemove action, ulong id) => Blacklist(action, id, BlacklistType.Server); [NadekoCommand, Usage, Description, Aliases] [OwnerOnly] public Task ServerBlacklist(AddRemove action, IGuild guild) => Blacklist(action, guild.Id, BlacklistType.Server); private async Task Blacklist(AddRemove action, ulong id, BlacklistType type) { if(action == AddRemove.Add && _creds.OwnerIds.Contains(id)) return; using (var uow = _db.UnitOfWork) { if (action == AddRemove.Add) { var item = new BlacklistItem { ItemId = id, Type = type }; uow.BotConfig.GetOrCreate().Blacklist.Add(item); if (type == BlacklistType.Server) { BlacklistedGuilds.Add(id); } else if (type == BlacklistType.Channel) { BlacklistedChannels.Add(id); } else if (type == BlacklistType.User) { BlacklistedUsers.Add(id); } } else { uow.BotConfig.GetOrCreate().Blacklist.RemoveWhere(bi => bi.ItemId == id && bi.Type == type); if (type == BlacklistType.Server) { BlacklistedGuilds.TryRemove(id); } else if (type == BlacklistType.Channel) { BlacklistedChannels.TryRemove(id); } else if (type == BlacklistType.User) { BlacklistedUsers.TryRemove(id); } } await uow.CompleteAsync().ConfigureAwait(false); } if(action == AddRemove.Add) await ReplyConfirmLocalized("blacklisted", Format.Code(type.ToString()), Format.Code(id.ToString())).ConfigureAwait(false); else await ReplyConfirmLocalized("unblacklisted", Format.Code(type.ToString()), Format.Code(id.ToString())).ConfigureAwait(false); } } } }