added moderation repository and parsers
This commit is contained in:
parent
f0fce82d27
commit
bcf207acb5
4 changed files with 201 additions and 0 deletions
143
src/BirdsiteLive.Domain/Repository/ModerationRepository.cs
Normal file
143
src/BirdsiteLive.Domain/Repository/ModerationRepository.cs
Normal file
|
@ -0,0 +1,143 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using BirdsiteLive.Common.Settings;
|
||||
using BirdsiteLive.Domain.Tools;
|
||||
using Newtonsoft.Json.Converters;
|
||||
|
||||
namespace BirdsiteLive.Domain.Repository
|
||||
{
|
||||
public class ModerationRepository
|
||||
{
|
||||
private readonly Regex[] _followersWhiteListing;
|
||||
private readonly Regex[] _followersBlackListing;
|
||||
private readonly Regex[] _twitterAccountsWhiteListing;
|
||||
private readonly Regex[] _twitterAccountsBlackListing;
|
||||
|
||||
private readonly Dictionary<ModerationEntityTypeEnum, ModerationTypeEnum> _modMode =
|
||||
new Dictionary<ModerationEntityTypeEnum, ModerationTypeEnum>();
|
||||
|
||||
#region Ctor
|
||||
public ModerationRepository(ModerationSettings settings)
|
||||
{
|
||||
var parsedFollowersWhiteListing = ModerationParser.Parse(settings.FollowersWhiteListing);
|
||||
var parsedFollowersBlackListing = ModerationParser.Parse(settings.FollowersBlackListing);
|
||||
var parsedTwitterAccountsWhiteListing = ModerationParser.Parse(settings.TwitterAccountsWhiteListing);
|
||||
var parsedTwitterAccountsBlackListing = ModerationParser.Parse(settings.TwitterAccountsBlackListing);
|
||||
|
||||
_followersWhiteListing = parsedFollowersWhiteListing
|
||||
.Select(x => ModerationRegexParser.Parse(ModerationEntityTypeEnum.Follower, x))
|
||||
.ToArray();
|
||||
_followersBlackListing = parsedFollowersBlackListing
|
||||
.Select(x => ModerationRegexParser.Parse(ModerationEntityTypeEnum.Follower, x))
|
||||
.ToArray();
|
||||
_twitterAccountsWhiteListing = parsedTwitterAccountsWhiteListing
|
||||
.Select(x => ModerationRegexParser.Parse(ModerationEntityTypeEnum.TwitterAccount, x))
|
||||
.ToArray();
|
||||
_twitterAccountsBlackListing = parsedTwitterAccountsBlackListing
|
||||
.Select(x => ModerationRegexParser.Parse(ModerationEntityTypeEnum.TwitterAccount, x))
|
||||
.ToArray();
|
||||
|
||||
// Set Follower moderation politic
|
||||
if (_followersWhiteListing.Any())
|
||||
_modMode.Add(ModerationEntityTypeEnum.Follower, ModerationTypeEnum.WhiteListing);
|
||||
else if (_followersBlackListing.Any())
|
||||
_modMode.Add(ModerationEntityTypeEnum.Follower, ModerationTypeEnum.BlackListing);
|
||||
else
|
||||
_modMode.Add(ModerationEntityTypeEnum.Follower, ModerationTypeEnum.None);
|
||||
|
||||
// Set Twitter account moderation politic
|
||||
if (_twitterAccountsWhiteListing.Any())
|
||||
_modMode.Add(ModerationEntityTypeEnum.TwitterAccount, ModerationTypeEnum.WhiteListing);
|
||||
else if (_twitterAccountsBlackListing.Any())
|
||||
_modMode.Add(ModerationEntityTypeEnum.TwitterAccount, ModerationTypeEnum.BlackListing);
|
||||
else
|
||||
_modMode.Add(ModerationEntityTypeEnum.TwitterAccount, ModerationTypeEnum.None);
|
||||
}
|
||||
#endregion
|
||||
|
||||
public ModerationTypeEnum GetModerationType(ModerationEntityTypeEnum type)
|
||||
{
|
||||
return _modMode[type];
|
||||
}
|
||||
|
||||
public ModeratedTypeEnum CheckStatus(ModerationEntityTypeEnum type, string entity)
|
||||
{
|
||||
if (_modMode[type] == ModerationTypeEnum.None) return ModeratedTypeEnum.None;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ModerationEntityTypeEnum.Follower:
|
||||
return ProcessFollower(entity);
|
||||
case ModerationEntityTypeEnum.TwitterAccount:
|
||||
return ProcessTwitterAccount(entity);
|
||||
}
|
||||
|
||||
throw new NotImplementedException($"Type {type} is not supported");
|
||||
}
|
||||
|
||||
private ModeratedTypeEnum ProcessFollower(string entity)
|
||||
{
|
||||
var politic = _modMode[ModerationEntityTypeEnum.Follower];
|
||||
|
||||
switch (politic)
|
||||
{
|
||||
case ModerationTypeEnum.None:
|
||||
return ModeratedTypeEnum.None;
|
||||
case ModerationTypeEnum.BlackListing:
|
||||
if (_followersBlackListing.Any(x => x.IsMatch(entity)))
|
||||
return ModeratedTypeEnum.BlackListed;
|
||||
return ModeratedTypeEnum.None;
|
||||
case ModerationTypeEnum.WhiteListing:
|
||||
if (_followersWhiteListing.Any(x => x.IsMatch(entity)))
|
||||
return ModeratedTypeEnum.WhiteListed;
|
||||
return ModeratedTypeEnum.None;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
private ModeratedTypeEnum ProcessTwitterAccount(string entity)
|
||||
{
|
||||
var politic = _modMode[ModerationEntityTypeEnum.TwitterAccount];
|
||||
|
||||
switch (politic)
|
||||
{
|
||||
case ModerationTypeEnum.None:
|
||||
return ModeratedTypeEnum.None;
|
||||
case ModerationTypeEnum.BlackListing:
|
||||
if (_twitterAccountsBlackListing.Any(x => x.IsMatch(entity)))
|
||||
return ModeratedTypeEnum.BlackListed;
|
||||
return ModeratedTypeEnum.None;
|
||||
case ModerationTypeEnum.WhiteListing:
|
||||
if (_twitterAccountsWhiteListing.Any(x => x.IsMatch(entity)))
|
||||
return ModeratedTypeEnum.WhiteListed;
|
||||
return ModeratedTypeEnum.None;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum ModerationEntityTypeEnum
|
||||
{
|
||||
Unknown = 0,
|
||||
Follower = 1,
|
||||
TwitterAccount = 2
|
||||
}
|
||||
|
||||
public enum ModerationTypeEnum
|
||||
{
|
||||
None = 0,
|
||||
BlackListing = 1,
|
||||
WhiteListing = 2
|
||||
}
|
||||
|
||||
public enum ModeratedTypeEnum
|
||||
{
|
||||
None = 0,
|
||||
BlackListed = 1,
|
||||
WhiteListed = 2
|
||||
}
|
||||
}
|
20
src/BirdsiteLive.Domain/Tools/ModerationParser.cs
Normal file
20
src/BirdsiteLive.Domain/Tools/ModerationParser.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace BirdsiteLive.Domain.Tools
|
||||
{
|
||||
public class ModerationParser
|
||||
{
|
||||
public static string[] Parse(string entry)
|
||||
{
|
||||
var separationChar = '|';
|
||||
if (entry.Contains(";")) separationChar = ';';
|
||||
else if (entry.Contains(",")) separationChar = ',';
|
||||
|
||||
var splitEntries = entry
|
||||
.Split(new[] {separationChar}, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(x => x.ToLowerInvariant());
|
||||
return splitEntries.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
28
src/BirdsiteLive.Domain/Tools/ModerationRegexParser.cs
Normal file
28
src/BirdsiteLive.Domain/Tools/ModerationRegexParser.cs
Normal file
|
@ -0,0 +1,28 @@
|
|||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using BirdsiteLive.Domain.Repository;
|
||||
using Org.BouncyCastle.Pkcs;
|
||||
|
||||
namespace BirdsiteLive.Domain.Tools
|
||||
{
|
||||
public class ModerationRegexParser
|
||||
{
|
||||
public static Regex Parse(ModerationEntityTypeEnum type, string data)
|
||||
{
|
||||
data = data.ToLowerInvariant().Trim();
|
||||
|
||||
if (type == ModerationEntityTypeEnum.Follower)
|
||||
{
|
||||
if (data.StartsWith("@"))
|
||||
return new Regex($@"^{data}$");
|
||||
|
||||
if (data.StartsWith("*"))
|
||||
data = data.Replace("*", "(.+)");
|
||||
|
||||
return new Regex($@"^@(.+)@{data}$");
|
||||
}
|
||||
|
||||
return new Regex($@"^{data}$");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace BirdsiteLive.Domain.Tests.Tools
|
||||
{
|
||||
[TestClass]
|
||||
public class ModerationRegexParserTests
|
||||
{
|
||||
|
||||
}
|
||||
}
|
Reference in a new issue