コード例 #1
0
        public async Task Ban(ICommand command, ILogger logger)
        {
            if (command["Users"].Repeats.Count > 10)
            {
                throw new Framework.Exceptions.IncorrectParametersCommandException("The maximum number of bans per command is 10.", false);
            }

            var banningUser        = (IGuildUser)command.Author;
            var banningUserTopRole = banningUser.GetTopRole()?.Position ?? 0;
            var result             = new StringBuilder();
            var bans = new Dictionary <ulong, (Task Task, string User, ulong UserId)>();

            foreach (var id in command["Users"].Repeats.Select(x => x.AsMentionOrId.Value))
            {
                string userName;
                var    guildUser = await command.Guild.GetUserAsync(id) ?? await _userFetcher.FetchGuildUserAsync(command.GuildId, id);

                if (guildUser != null)
                {
                    userName = $"{guildUser.GetFullName()} ({guildUser.Id})";
                    if (!banningUser.IsOwner() && (banningUserTopRole <= (guildUser.GetTopRole()?.Position ?? 0) || guildUser.IsOwner()))
                    {
                        result.AppendLine(_communicator.FormatFailure($"You don't have permission to ban user `{userName}` on this server."));
                        continue;
                    }
                }
                else
                {
                    var user = (IUser)_client.GetUser(id) ?? await _userFetcher.FetchUserAsync(id);

                    userName = user != null ? $"{user.GetFullName()} ({user.Id})" : id.ToString();
                }

                bans[id] = (command.Guild.AddBanAsync(id, Math.Min(command["DeleteDays"].AsInt ?? 0, 7), command["Reason"].HasValue ? command["Reason"].AsString : null), userName, id);
            }

            try
            {
                await Task.WhenAll(bans.Select(x => x.Value.Task));
            }
            catch (Exception)
            {
                // Handled below
            }

            foreach (var ban in bans.Values)
            {
                if (ban.Task.Exception != null && ban.Task.Exception.InnerException is Discord.Net.HttpException ex && ex.HttpCode == HttpStatusCode.Forbidden)
                {
                    result.AppendLine(_communicator.FormatFailure($"Missing permissions to ban user `{ban.User}`."));
                }