/Orchard.Web/Modules/Orchard.AntiSpam/Services/DefaultSpamService.cs

https://bitbucket.org/oleg_ator/orchard.test
C# | 113 lines | 86 code | 23 blank | 4 comment | 7 complexity | d1f6c5fce4b05044bbefb42d3aa173dc MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Orchard.AntiSpam.Models;
  5. using Orchard.AntiSpam.Rules;
  6. using Orchard.AntiSpam.Settings;
  7. using Orchard.Tokens;
  8. namespace Orchard.AntiSpam.Services {
  9. public class DefaultSpamService : ISpamService {
  10. private readonly ITokenizer _tokenizer;
  11. private readonly IEnumerable<ISpamFilterProvider> _providers;
  12. private readonly ISpamEventHandler _spamEventHandler;
  13. private readonly IRulesManager _rulesManager;
  14. public DefaultSpamService(
  15. ITokenizer tokenizer,
  16. IEnumerable<ISpamFilterProvider> providers,
  17. ISpamEventHandler spamEventHandler,
  18. IRulesManager rulesManager
  19. ) {
  20. _tokenizer = tokenizer;
  21. _providers = providers;
  22. _spamEventHandler = spamEventHandler;
  23. _rulesManager = rulesManager;
  24. }
  25. public SpamStatus CheckForSpam(string text, SpamFilterAction action) {
  26. var spamFilters = GetSpamFilters().ToList();
  27. switch (action) {
  28. case SpamFilterAction.AllOrNothing:
  29. if (spamFilters.All(x => x.CheckForSpam(text) == SpamStatus.Spam)) {
  30. return SpamStatus.Spam;
  31. }
  32. return SpamStatus.Ham;
  33. case SpamFilterAction.One:
  34. if (spamFilters.Any(x => x.CheckForSpam(text) == SpamStatus.Spam)) {
  35. return SpamStatus.Spam;
  36. }
  37. return SpamStatus.Ham;
  38. default:
  39. throw new ArgumentOutOfRangeException();
  40. }
  41. }
  42. public SpamStatus CheckForSpam(SpamFilterPart part) {
  43. var settings = part.TypePartDefinition.Settings.GetModel<SpamFilterPartSettings>();
  44. // evaluate the text to submit to the spam filters
  45. var text = _tokenizer.Replace(settings.Pattern, new Dictionary<string, object> { { "Content", part.ContentItem } });
  46. var result = CheckForSpam(text, settings.Action);
  47. // trigger events and rules
  48. switch (result) {
  49. case SpamStatus.Spam:
  50. _spamEventHandler.SpamReported(part);
  51. _rulesManager.TriggerEvent("AntiSpam", "Spam", () => new Dictionary<string, object> { { "Content", part.ContentItem } });
  52. break;
  53. case SpamStatus.Ham:
  54. _spamEventHandler.HamReported(part);
  55. _rulesManager.TriggerEvent("AntiSpam", "Ham", () => new Dictionary<string, object> { { "Content", part.ContentItem } });
  56. break;
  57. default:
  58. throw new ArgumentOutOfRangeException();
  59. }
  60. return result;
  61. }
  62. public void ReportSpam(string text) {
  63. var spamFilters = GetSpamFilters().ToList();
  64. foreach(var filter in spamFilters) {
  65. filter.ReportSpam(text);
  66. }
  67. }
  68. public void ReportSpam(SpamFilterPart part) {
  69. var settings = part.TypePartDefinition.Settings.GetModel<SpamFilterPartSettings>();
  70. // evaluate the text to submit to the spam filters
  71. var text = _tokenizer.Replace(settings.Pattern, new Dictionary<string, object> { { "Content", part.ContentItem } });
  72. ReportSpam(text);
  73. }
  74. public void ReportHam(string text) {
  75. var spamFilters = GetSpamFilters().ToList();
  76. foreach (var filter in spamFilters) {
  77. filter.ReportHam(text);
  78. }
  79. }
  80. public void ReportHam(SpamFilterPart part) {
  81. var settings = part.TypePartDefinition.Settings.GetModel<SpamFilterPartSettings>();
  82. // evaluate the text to submit to the spam filters
  83. var text = _tokenizer.Replace(settings.Pattern, new Dictionary<string, object> { { "Content", part.ContentItem } });
  84. ReportHam(text);
  85. }
  86. public IEnumerable<ISpamFilter> GetSpamFilters() {
  87. return _providers.SelectMany(x => x.GetSpamFilters()).Where(x => x != null);
  88. }
  89. }
  90. }