public async Task <string> RemoveUnverifyAsync(SocketGuild guild, SocketGuildUser user, SocketUser fromUser, bool isAuto = false) { try { BotState.CurrentReturningUnverifyFor.Add(user); var userEntity = await GrillBotRepository.UsersRepository.GetUserAsync(guild.Id, user.Id, UsersIncludes.Unverify); if (userEntity?.Unverify == null) { return(MessageGenerator.CreateRemoveAccessUnverifyNotFound(user)); } var unverifyConfig = (await GrillBotRepository.ConfigRepository.FindConfigAsync(guild.Id, "unverify", null, false))?.GetData <UnverifyConfig>(); var mutedRole = unverifyConfig == null ? null : guild.GetRole(unverifyConfig.MutedRoleID); var rolesToReturn = userEntity.Unverify.DeserializedRoles.Where(o => !user.Roles.Any(x => x.Id == o)) .Select(o => guild.GetRole(o)).Where(role => role != null).ToList(); var channelsToReturn = userEntity.Unverify.DeserializedChannels .Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelIdSnowflake), o.GetPermissions())) .Where(o => o.Channel != null).ToList(); if (isAuto) { await UnverifyLogger.LogAutoRemoveAsync(rolesToReturn, channelsToReturn, user, guild); } else { await UnverifyLogger.LogRemoveAsync(rolesToReturn, channelsToReturn, guild, user, fromUser); } foreach (var channel in channelsToReturn) { if (channel.Channel is SocketGuildChannel socketGuildChannel) { try { await socketGuildChannel.AddPermissionOverwriteAsync(user, channel.Perms); } catch (HttpException ex) { var message = new LogMessage(LogSeverity.Error, nameof(UnverifyService), $"An error occured when unverify returning access to channel {channel.Channel.Name} for user {user.GetFullName()}", ex); await Logger.OnLogAsync(message); } } } await user.AddRolesAsync(rolesToReturn); if (mutedRole != null) { await user.RemoveRoleAsync(mutedRole); } userEntity.Unverify = null; await GrillBotRepository.CommitAsync(); Queue.TryRemove <UnverifyBackgroundTask>(o => o.GuildId == guild.Id && o.UserId == user.Id); if (!isAuto) { var message = MessageGenerator.CreateRemoveAccessManuallyPMMessage(guild); await user.SendPrivateMessageAsync(message); } return(MessageGenerator.CreateRemoveAccessManuallyToChannel(user)); } catch (Exception ex) { if (!isAuto) { throw; } var message = new LogMessage(LogSeverity.Error, nameof(UnverifyService), "An error occured when unverify returning access.", ex); await Logger.OnLogAsync(message); return(MessageGenerator.CreateRemoveAccessManuallyFailed(user, ex)); } finally { BotState.CurrentReturningUnverifyFor.RemoveAll(o => o.Id == user.Id); } }