public async Task CleanupOops() { var systemContext = new SystemAppContext(); var utcNow = DateTime.UtcNow; var suspensions = await suspensionRepository.GetSuspensions(DateTime.UtcNow.AddYears(-1)).ConfigureAwait(false); var timeOfOops = DateTime.Parse("2020-10-04T01:18:14.7468436Z"); var timeOfFix = new DateTime(2020, 10, 7, 22, 0, 0); var suspensionsFromTime = suspensions.Where(x => x.Timestamp >= timeOfOops && x.Timestamp <= timeOfFix).ToList(); var systemSuspensionsThatNeedReplay = suspensionsFromTime.Where(x => x.SuspensionSource == SuspensionSource.System); foreach (var suspension in systemSuspensionsThatNeedReplay) { suspension.UpdateValidity(true, "Tranquiliza made a mistake, rolling back system bans in the period to replay", systemContext, DateTime.UtcNow); await suspensionRepository.Save(suspension).ConfigureAwait(false); } var names = systemSuspensionsThatNeedReplay.Select(x => x.Username).Distinct().ToList(); var actualSuspensions = suspensionsFromTime.Where(x => names.Contains(x.Username) && x.SuspensionSource != SuspensionSource.System); foreach (var suspension in actualSuspensions) { suspension.UpdateAuditedState(false, systemContext, utcNow); await suspensionRepository.Save(suspension).ConfigureAwait(false); } }
public async Task <IResult <List <Suspension> > > GetAllSuspensionsAnonymised() { var suspensions = await suspensionRepository.GetSuspensions(datetimeProvider.UtcNow.AddYears(-1)).ConfigureAwait(false); if (suspensions.Count == 0) { return(Result <List <Suspension> > .NoContentFound()); } var auditedAndValidSuspensions = suspensions.Where(x => x.Audited && !x.InvalidSuspension).ToList(); return(Result <List <Suspension> > .Succeeded(auditedAndValidSuspensions)); }
public async Task <IResult <List <UserRulesExceeded> > > GetUsersWhoExceedsRules(string channelName, IApplicationContext context) { var suspensionsForSystem = await suspensionRepository.GetSuspensions(datetimeProvider.UtcNow.AddYears(-1)).ConfigureAwait(false); var usersFromSuspensions = suspensionsForSystem.Select(x => x.Username); var channel = await channelRepository.GetChannel(channelName).ConfigureAwait(false); if (!context.HaveAccessTo(channel)) { return(Result <List <UserRulesExceeded> > .Unauthorized()); } var allSuspensionsForChannel = await suspensionRepository.GetSuspensionsForChannel(channelName).ConfigureAwait(false); var allValidAuditedSuspensionForChannel = allSuspensionsForChannel.Where(x => !x.InvalidSuspension && x.Audited); var usersWhoExceeded = new List <UserRulesExceeded>(); foreach (var user in usersFromSuspensions.Distinct(StringComparer.OrdinalIgnoreCase)) { // If we already have a ban if (allValidAuditedSuspensionForChannel.Any(x => string.Equals(x.Username, user, StringComparison.OrdinalIgnoreCase) && x.SuspensionType == SuspensionType.Ban)) { continue; } var suspensionsForUser = await suspensionRepository.GetSuspensionsForUser(user).ConfigureAwait(false); var report = new UserReport(user, suspensionsForUser); foreach (var rule in channel.ChannelRules.Where(x => x.ActionOnTrigger == ChannelRuleAction.Ban)) { if (report.Exceeds(rule)) { var userRulesExceeded = usersWhoExceeded.Find(x => string.Equals(x.Username, user, StringComparison.OrdinalIgnoreCase)) ?? new UserRulesExceeded { Username = user }; usersWhoExceeded.Remove(userRulesExceeded); userRulesExceeded.RulesBroken.Add(rule); usersWhoExceeded.Add(userRulesExceeded); } } } return(Result <List <UserRulesExceeded> > .Succeeded(usersWhoExceeded)); }
public async Task <IResult <List <string> > > GetUsersMatchedByTag(Guid tagId) { var suspensionsForSystem = await suspensionRepository.GetSuspensions(DateTime.UtcNow.AddYears(-10)).ConfigureAwait(false); if (suspensionsForSystem.Count == 0) { return(Result <List <string> > .NoContentFound()); } var suspensionsWithTag = suspensionsForSystem.Where(x => x.Audited && !x.InvalidSuspension && x.Tags.Any(y => y.TagId == tagId) ); var users = suspensionsWithTag.Select(x => x.Username).Distinct().OrderBy(x => x); return(Result <List <string> > .Succeeded(users.ToList())); }
public async Task <IResult <SystemReport> > GetSystemReport(IApplicationContext context) { if (!context.User.HasRole(Roles.Admin)) { return(Result <SystemReport> .Unauthorized()); } var allSuspensions = await suspensionRepository.GetSuspensions(datetimeProvider.UtcNow.AddYears(-1)).ConfigureAwait(false); var systemSuspensions = allSuspensions.Where(x => x.SuspensionSource == SuspensionSource.System && !x.UnconfirmedSource).ToList(); var allSuspensionsWithoutSystem = allSuspensions.Where(x => x.SuspensionSource != SuspensionSource.System); var auditedSuspensions = allSuspensionsWithoutSystem.Where(x => x.Audited).ToList(); var unauditedSuspensins = allSuspensionsWithoutSystem.Where(x => !x.Audited).ToList(); var uniqueUsersForSystem = await chatRepository.GetUniqueChattersForSystem().ConfigureAwait(false); var systemReport = new SystemReport(unauditedSuspensins, auditedSuspensions, systemSuspensions, uniqueUsersForSystem.Count); return(Result <SystemReport> .Succeeded(systemReport)); }
private async Task <IEnumerable <Suspension> > GetValidAndAuditedSuspensions() { var suspensions = await suspensionRepository.GetSuspensions(datetimeProvider.UtcNow.AddYears(-1)).ConfigureAwait(false); return(suspensions.Where(x => x.Audited && !x.InvalidSuspension)); }