Beispiel #1
0
        public async Task CheckRulesForUserInChannel(string username, string channelName)
        {
            var channelOfOrigin = await channelRepository.GetChannel(channelName).ConfigureAwait(false);

            if (channelOfOrigin == null)
            {
                logger.LogWarning("We're attemping to check rules for a channel that doesn't exist in our system");
                return;
            }

            var suspensionsForUser = await suspensionRepository.GetSuspensionsForUser(username).ConfigureAwait(false);

            if (suspensionsForUser.Count == 0)
            {
                return;
            }

            var userReport = new UserReport(username, suspensionsForUser);

            var channelRules = channelOfOrigin.ChannelRules;

            foreach (var rule in channelRules.Where(x => x.ActionOnTrigger == ChannelRuleAction.NotifyWebsite))
            {
                if (userReport.Exceeds(rule))
                {
                    await SendUserExceededRuleNotifyEvent(username, channelOfOrigin.ChannelName, rule.RuleName).ConfigureAwait(false);
                }
            }

            foreach (var rule in channelRules.Where(x => x.ActionOnTrigger == ChannelRuleAction.NotifyDiscord))
            {
                if (userReport.Exceeds(rule))
                {
                    await SendDiscordNotifications(username, channelOfOrigin.ChannelName, rule.RuleId).ConfigureAwait(false);
                }
            }

            if (channelOfOrigin.SystemIsModerator && channelOfOrigin.ShouldListen)
            {
                foreach (var rule in channelRules.Where(x => x.ActionOnTrigger == ChannelRuleAction.Ban))
                {
                    if (userReport.Exceeds(rule))
                    {
                        await SendBanCommandFor(username, channelOfOrigin.ChannelName, rule.RuleName).ConfigureAwait(false);
                    }
                }
            }
        }
Beispiel #2
0
        public async Task CheckBanAction(RuleExceedCheckCommand command)
        {
            var suspensionsForUser = await suspensionRepository.GetSuspensionsForUser(command.TwitchUsername).ConfigureAwait(false);

            if (suspensionsForUser.Count == 0)
            {
                return;
            }

            var userReport = new UserReport(command.TwitchUsername, suspensionsForUser);
            var channels   = await channelRepository.GetChannels().ConfigureAwait(false);

            foreach (var channel in channels.Where(x => x.ChannelRules.Count > 0))
            {
                foreach (var rule in channel.ChannelRules.Where(x => x.ActionOnTrigger == ChannelRuleAction.Ban))
                {
                    if (userReport.Exceeds(rule))
                    {
                        if (channel.SystemIsModerator && channel.ShouldListen)
                        {
                            await SendBanCommandFor(command.TwitchUsername, channel.ChannelName, rule.RuleName).ConfigureAwait(false);
                        }
                        else
                        {
                            logger.LogInformation("Channel Rule triggered ban, but channel does not have moderation / listening enabled for: {arg}", channel.ChannelName);
                        }
                    }
                }
            }
        }
        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));
        }