public async Task SoftBan([Summary("The user to softban")] SocketGuildUser user, [Summary("Reason for softban")] string reason, [Summary("Number of days for which to prune the user's messages")] int pruneDays = 0) { var author = Context.User as SocketGuildUser; var authorsHighestRole = author.Roles.OrderByDescending(x => x.Position).First(); var usersHighestRole = user.Roles.OrderByDescending(x => x.Position).First(); if (usersHighestRole.Position >= authorsHighestRole.Position) { await ReplyAsync(":x: You cannot softban someone above or equal to you in the role hierarchy."); return; } if (_service.SoftBanMessage != null && _service.UnmuteMessage != "") { var dmChannel = await user.GetOrCreateDMChannelAsync(); await dmChannel.SendMessageAsync(_service.SoftBanMessage.Replace("{g}", user.Guild.Name) .Replace("{r}", reason)); } await Context.Guild.AddBanAsync(user, pruneDays); await Context.Guild.RemoveBanAsync(user); var name = user.Nickname == null ? user.Username : $"{user.Username} (nickname: {user.Nickname})"; await _records.AddSoftBanAsync(new SoftBan { GuildId = Context.Guild.Id, SubjectId = user.Id, SubjectName = user.Username, ModeratorId = Context.User.Id, Timestamp = DateTime.UtcNow, Reason = reason }); _records.DisposeContext(); await _log.LogModMessageAsync($"**{author.Nickname ?? author.Username}** softbanned **{name} ({user.Id})** for `{reason}`"); await ReplyAsync(":ok:"); }