public async Task <string> UpdateUnverifyAsync(SocketGuildUser user, SocketGuild guild, string time, SocketUser fromUser) { var task = Queue.Get <UnverifyBackgroundTask>(o => o.GuildId == guild.Id && o.UserId == user.Id); if (task == null) { throw new NotFoundException("Aktualizace času nelze pro hledaného uživatele provést. Unverify nenalezeno."); } if (task.CanProcess() || (task.At - DateTime.Now).TotalSeconds < 30.0D) { throw new ValidationException("Aktualizace data a času již není možná. Vypršel čas, nebo zbývá méně, než půl minuty."); } var endDateTime = TimeParser.Parse(time, minimumMinutes: 10); await UnverifyLogger.LogUpdateAsync(DateTime.Now, endDateTime, guild, fromUser, user); var userEntity = await GrillBotRepository.UsersRepository.GetUserAsync(guild.Id, user.Id, UsersIncludes.Unverify); userEntity.Unverify.EndDateTime = endDateTime; userEntity.Unverify.StartDateTime = DateTime.Now; await GrillBotRepository.CommitAsync(); task.At = endDateTime; var pmMessage = MessageGenerator.CreateUpdatePMMessage(guild, endDateTime); await user.SendPrivateMessageAsync(pmMessage); return(MessageGenerator.CreateUpdateChannelMessage(user, endDateTime)); }
public UnverifyService(UnverifyChecker checker, UnverifyProfileGenerator profileGenerator, UnverifyLogger logger, UnverifyMessageGenerator messageGenerator, UnverifyTimeParser timeParser, BotState botState, DiscordSocketClient discord, BotLoggingService loggingService, ILogger <UnverifyService> appLogger, IGrillBotRepository grillBotRepository, BackgroundTaskQueue queue) { Checker = checker; UnverifyProfileGenerator = profileGenerator; UnverifyLogger = logger; MessageGenerator = messageGenerator; TimeParser = timeParser; BotState = botState; DiscordClient = discord; Logger = loggingService; AppLogger = appLogger; GrillBotRepository = grillBotRepository; Queue = queue; }
public async Task RecoverToStateAsync(long id, SocketGuildUser fromUser) { var record = await GrillBotRepository.UnverifyRepository.FindLogItemByIDAsync(id); if (record == null) { throw new NotFoundException($"Záznam o unverify s ID {id} nebyl nalezen."); } if (record.Operation != UnverifyLogOperation.Unverify && record.Operation != UnverifyLogOperation.Selfunverify) { throw new ValidationException("Obnovení lze provést pouze přes operace Unverify a SelfUnverify"); } if (record.ToUser.Unverify != null) { throw new ValidationException("Nelze provést obnovení stavu před unverify uživateli, který má unverify."); } var guild = DiscordClient.GetGuild(record.ToUser.GuildIDSnowflake); if (guild == null) { throw new NotFoundException("Nelze najít server, na kterém bylo uživateli uděleno unverify."); } var user = await guild.GetUserFromGuildAsync(record.ToUser.UserIDSnowflake); if (user == null) { throw new NotFoundException($"Nelze vyhledat uživatele na serveru {guild.Name}"); } var unverifyConfig = (await GrillBotRepository.ConfigRepository.FindConfigAsync(guild.Id, "unverify", null, false))?.GetData <UnverifyConfig>(); var mutedRole = unverifyConfig == null ? null : guild.GetRole(unverifyConfig.MutedRoleID); var data = record.Json.ToObject <UnverifyLogSet>(); var rolesToReturn = data.RolesToRemove.Where(o => !user.Roles.Any(x => x.Id == o)) .Select(o => guild.GetRole(o)).Where(role => role != null).ToList(); var channelsToReturn = data.ChannelsToRemove .Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue))) .Where(o => o.Channel is SocketGuildChannel) .Where(o => { var perms = ((SocketGuildChannel)o.Channel).GetPermissionOverwrite(user); return(perms != null && (perms.Value.AllowValue != o.AllowValue || perms.Value.DenyValue != o.DenyValue)); }) .ToList(); await UnverifyLogger.LogRecoverAsync(rolesToReturn, channelsToReturn, guild, user, fromUser); if (rolesToReturn.Count > 0) { await user.AddRolesAsync(rolesToReturn); } if (channelsToReturn.Count > 0) { foreach (var channel in channelsToReturn) { if (channel.Channel is SocketGuildChannel socketGuildChannel) { await socketGuildChannel.AddPermissionOverwriteAsync(user, channel.Perms); } } } if (mutedRole != null) { await user.RemoveRoleAsync(mutedRole); } }
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); } }
private async Task <string> SetUnverifyAsync(SocketUser socketUser, string time, string data, SocketGuild guild, SocketUser fromUser, bool selfUnverify, List <string> toKeep, SocketRole mutedRole) { var user = await guild.GetUserFromGuildAsync(socketUser.Id); await Checker.ValidateAsync(user, guild, selfUnverify); var profile = await UnverifyProfileGenerator.CreateProfileAsync(user, guild, time, data, selfUnverify, toKeep, mutedRole); UnverifyLog unverifyLogEntity; if (selfUnverify) { unverifyLogEntity = await UnverifyLogger.LogSelfUnverifyAsync(profile, guild); } else { unverifyLogEntity = await UnverifyLogger.LogUnverifyAsync(profile, guild, fromUser); } try { if (mutedRole != null) { await user.SetRoleAsync(mutedRole); } await user.RemoveRolesAsync(profile.RolesToRemove); foreach (var channelOverride in profile.ChannelsToRemove) { var channel = guild.GetChannel(channelOverride.ChannelID); await channel?.AddPermissionOverwriteAsync(user, new OverwritePermissions(viewChannel : PermValue.Deny)); } var userEntity = await GrillBotRepository.UsersRepository.GetOrCreateUserAsync(guild.Id, user.Id, UsersIncludes.Unverify); userEntity.Unverify = new Database.Entity.Unverify.Unverify() { DeserializedChannels = profile.ChannelsToRemove.ConvertAll(o => new ChannelOverride(o.ChannelID, o.Perms)), DeserializedRoles = profile.RolesToRemove.ConvertAll(o => o.Id), EndDateTime = profile.EndDateTime, Reason = profile.Reason, StartDateTime = profile.StartDateTime, SetLogOperation = unverifyLogEntity }; await GrillBotRepository.CommitAsync(); Queue.Add(new UnverifyBackgroundTask(guild.Id, user.Id, profile.EndDateTime)); var pmMessage = MessageGenerator.CreateUnverifyPMMessage(profile, guild); await user.SendPrivateMessageAsync(pmMessage); return(MessageGenerator.CreateUnverifyMessageToChannel(profile)); } catch (Exception ex) { if (mutedRole != null) { await user.RemoveRoleAsync(mutedRole); } await user.AddRolesAsync(profile.RolesToRemove); foreach (var channelOverride in profile.ChannelsToRemove) { var channel = guild.GetChannel(channelOverride.ChannelID); if (channel != null) { await channel.AddPermissionOverwriteAsync(user, channelOverride.Perms); } } var errorMessage = new LogMessage(LogSeverity.Warning, nameof(UnverifyService), "An error occured when unverify removing access.", ex); await Logger.OnLogAsync(errorMessage); return(MessageGenerator.CreateUnverifyFailedToChannel(user)); } }