public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log, ExecutionContext context) { var formContents = await FormContentsFactory.Create(req); var comment = CommentFactory.Create(formContents); var settings = SettingsFactory.Create(formContents.Options.Origin, log); var reCaptcha = new ReCaptchaService(settings.ReCaptchaSecretKey, log); var reCaptchaResponse = await reCaptcha.Validate(formContents.Options.Recaptcha.Token); var akismetService = new AkismetService(settings, log); var akismetResponse = await akismetService.IsSpam(req, comment, formContents); var gitHubService = new GitHubService(settings.GitHubOwner, settings.GitHubRepository, settings.GitHubBranch, settings.GitHubCommentPath, settings.GitHubToken); var knownCommenterResponse = await gitHubService.IsKnownCommenter(comment.Name, comment.Email); var analyzer = new ModerationAnalyzer(settings, log); var analysisReport = analyzer.NeedsModeration(comment, reCaptchaResponse, akismetResponse, knownCommenterResponse); await gitHubService.AddComment(comment, analysisReport, knownCommenterResponse); return(new OkResult()); }
public override void Execute() { var post = DocumentSession .Include <Post>(x => x.AuthorId) .Include(x => x.CommentsId) .Load(postId); var postAuthor = DocumentSession.Load <User>(post.AuthorId); var comments = DocumentSession.Load <PostComments>(post.CommentsId); var comment = new PostComments.Comment { Id = comments.GenerateNewCommentId().ToString(), Author = commentInput.Name, Body = commentInput.Body, CreatedAt = DateTimeOffset.Now, Email = commentInput.Email, Url = commentInput.Url, Important = requestValues.IsAuthenticated, // TODO: Don't mark as important based on that UserAgent = requestValues.UserAgent, UserHostAddress = requestValues.UserHostAddress, }; comment.IsSpam = AkismetService.CheckForSpam(comment); var commenter = DocumentSession.GetCommenter(commentInput.CommenterKey) ?? new Commenter { Key = commentInput.CommenterKey ?? Guid.Empty }; SetCommenter(commenter, comment); if (requestValues.IsAuthenticated == false && comment.IsSpam) { if (commenter.NumberOfSpamComments > 4) { return; } comments.Spam.Add(comment); } else { post.CommentsCount++; comments.Comments.Add(comment); } SendNewCommentEmail(post, comment, postAuthor); }
public ActionResult CommentsAdmin(int id, CommentCommandOptions command, int[] commentIds) { if (commentIds == null || commentIds.Length == 0) { ModelState.AddModelError("CommentIdsAreEmpty", "Not comments was selected."); } var post = RavenSession.Load <Post>(id); if (post == null) { return(HttpNotFound()); } if (ModelState.IsValid == false) { if (Request.IsAjaxRequest()) { return(Json(new { Success = false, message = ModelState.FirstErrorMessage() })); } return(Details(id)); } var comments = RavenSession.Load <PostComments>(post.CommentsId); switch (command) { case CommentCommandOptions.Delete: comments.Comments.RemoveAll(c => commentIds.Contains(c.Id)); comments.Spam.RemoveAll(c => commentIds.Contains(c.Id)); break; case CommentCommandOptions.MarkSpam: var spams = comments.Comments.Concat(comments.Spam) .Where(c => commentIds.Contains(c.Id)) .ToArray(); comments.Comments.RemoveAll(spams.Contains); comments.Spam.RemoveAll(spams.Contains); foreach (var comment in spams) { AkismetService.MarkSpam(comment); } break; case CommentCommandOptions.MarkHam: var ham = comments.Spam .Where(c => commentIds.Contains(c.Id)) .ToArray(); comments.Spam.RemoveAll(ham.Contains); comments.Comments.AddRange(ham); comments.Comments .Where(c => c.IsSpam) .ForEach(comment => { comment.IsSpam = false; AkismetService.MarkHam(comment); ResetNumberOfSpamComments(comment); }); break; default: throw new InvalidOperationException(command + " command is not recognized."); } post.CommentsCount = comments.Comments.Count; if (Request.IsAjaxRequest()) { return(Json(new { Success = true })); } return(RedirectToAction("Details", new { id })); }
public AkismetHelper(string key, string site, string agent = "") { api = new AkismetService(key, new Uri(site), null); }