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); } } } }
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)); }