コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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()));
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        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));
        }