public static Domain.Models.Submission Map(this Data.Models.Submission submission) { Domain.Models.Submission result = null; if (submission != null) { result = new Domain.Models.Submission() { ID = submission.ID, UserName = (submission.IsAnonymized ? submission.ID.ToString() : submission.UserName), Title = submission.Title, Url = submission.Url, Content = (submission.Type == 1 ? submission.Content : (string)null), //Support For Backwards compat, if FormattedContent is empty, do it here. FormattedContent = (submission.Type == 1 && String.IsNullOrEmpty(submission.FormattedContent) ? Formatting.FormatMessage(submission.Content, true) : submission.FormattedContent), LastEditDate = submission.LastEditDate, ThumbnailUrl = VoatPathHelper.ThumbnailPath(submission.Thumbnail, true, true), CommentCount = CommentCounter.CommentCount(submission.ID), CreationDate = submission.CreationDate, UpCount = (int)submission.UpCount, Views = (int)submission.Views, DownCount = (int)submission.DownCount, Type = submission.Type == 1 ? SubmissionType.Text : SubmissionType.Link, Subverse = submission.Subverse, IsAnonymized = submission.IsAnonymized, IsDeleted = submission.IsDeleted, Rank = submission.Rank, RelativeRank = submission.RelativeRank }; } return(result); }
protected override RuleOutcome EvaluateRule(VoatRuleContext context) { UserSubmission submission = context.PropertyBag.UserSubmission; switch (submission.Type) { case SubmissionType.Link: Data.Models.Submission recentlySubmitted = null; using (var repo = new Repository()) { recentlySubmitted = repo.FindSubverseLinkSubmission(context.Subverse.Name, submission.Url, TimeSpan.FromDays(15)); } if (recentlySubmitted != null) { string url = VoatUrlFormatter.BuildUrlPath(null, new Common.PathOptions() { FullyQualified = true, ProvideProtocol = true }, $"v/{recentlySubmitted.Subverse}/{recentlySubmitted.ID}"); return(CreateOutcome(RuleResult.Denied, $"Sorry, this link has already been submitted recently. {url}")); } break; case SubmissionType.Text: //containsBannedDomain = BanningUtility.ContentContainsBannedDomain(context.Subverse.Name, submission.Content); break; } return(Allowed); }
protected override RuleOutcome EvaluateRule(VoatRuleContext context) { UserSubmission submission = context.PropertyBag.UserSubmission; switch (submission.Type) { case SubmissionType.Link: Data.Models.Submission recentlySubmitted = null; using (var repo = new Repository()) { recentlySubmitted = repo.FindSubverseLinkSubmission(context.Subverse.Name, submission.Url, TimeSpan.FromDays(15)); } if (recentlySubmitted != null) { return(CreateOutcome(RuleResult.Denied, $"Sorry, this link has already been submitted recently. https://voat.co/v/{recentlySubmitted.Subverse}/{recentlySubmitted.ID}")); } break; case SubmissionType.Text: //containsBannedDomain = BanningUtility.ContentContainsBannedDomain(context.Subverse.Name, submission.Content); break; } return(Allowed); }
public static async Task OnSubmissionPosted(IPrincipal user, Data.Models.Submission submission) { string input = submission.Title + " " + submission.Content; var users = FindMentions(input); if (users.Any()) { await SendUserMentionNotification(submission, users); } }
internal static async Task SendSubmissionReplyNotification(IPrincipal user, Data.Models.Submission submission, Data.Models.Comment comment) { try { // comment reply is sent to a root comment which has no parent id, trigger post reply notification //var submission = DataCache.Submission.Retrieve(comment.SubmissionID); //var q = new QuerySubmission(comment.SubmissionID.Value); //var submission = await q.ExecuteAsync().ConfigureAwait(CONSTANTS.AWAIT_CAPTURE_CONTEXT); if (submission != null) { // check if recipient exists if (UserHelper.UserExists(submission.UserName)) { // do not send notification if author is the same as comment author if (submission.UserName != comment.UserName) { //BlockedUser Implementation - Submission Reply if (!MesssagingUtility.IsSenderBlocked(comment.UserName, submission.UserName)) { var message = new Domain.Models.Message(); message.IsAnonymized = submission.IsAnonymized; message.Recipient = submission.UserName; message.RecipientType = Domain.Models.IdentityType.User; message.Sender = comment.UserName; message.SenderType = Domain.Models.IdentityType.User; message.Subverse = submission.Subverse; message.SubmissionID = submission.ID; message.CommentID = comment.ID; message.Type = Domain.Models.MessageType.SubmissionReply; message.CreationDate = Repository.CurrentDate; using (var repo = new Repository(user)) { var response = await repo.SendMessage(message); if (response.Success) { EventNotification.Instance.SendMessageNotice(message.Recipient, message.Sender, Domain.Models.MessageTypeFlag.CommentReply, Domain.Models.ContentType.Comment, comment.ID); } } } } } } } catch (Exception ex) { throw ex; } }
public static async Task OnCommentPosted(IPrincipal user, Data.Models.Submission submission, Data.Models.Comment comment) { if (comment.ParentID != null && comment.Content != null) { await SendCommentReplyNotification(user, submission, comment); } else { await SendSubmissionReplyNotification(user, submission, comment); } var users = FindMentions(comment.Content); if (users.Any()) { await SendUserMentionNotification(comment, users); } }
protected override void UpdateCache(Data.Models.Submission result) { var key = CachingKey.Submission(result.ID); if (CacheHandler.Instance.Exists(key)) { CacheHandler.Instance.Replace <Submission>(key, x => { x.Title = result.Title; x.Content = result.Content; x.Url = result.Url; x.LastEditDate = result.LastEditDate; return(x); }); } //Legacy item removal //CacheHandler.Instance.Remove(DataCache.Keys.Submission(result.ID)); }
// generate a thumbnail if submission is a direct link to image or video public static async Task <string> ThumbnailFromSubmissionModel(Data.Models.Submission submissionModel) { var extension = Path.GetExtension(submissionModel.Content); // this is a direct link to image if (extension != String.Empty) { if (extension == ".jpg" || extension == ".JPG" || extension == ".png" || extension == ".PNG" || extension == ".gif" || extension == ".GIF") { try { var thumbFileName = await GenerateThumbFromUrl(submissionModel.Content); return(thumbFileName); } catch (Exception) { // thumnail generation failed, skip adding thumbnail return(null); } } // try generating a thumbnail by using the Open Graph Protocol try { var graphUri = new Uri(submissionModel.Content); var graph = OpenGraph.ParseUrl(graphUri, userAgent: "Voat.co OpenGraph Parser"); // open graph failed to find og:image element, abort thumbnail generation if (graph.Image == null) { return(null); } var thumbFileName = await GenerateThumbFromUrl(graph.Image.ToString()); return(thumbFileName); } catch (Exception) { // thumnail generation failed, skip adding thumbnail return(null); } } // this is not a direct link to an image, it could be a link to an article or video // try generating a thumbnail by using the Open Graph Protocol try { var graphUri = new Uri(submissionModel.Content); var graph = OpenGraph.ParseUrl(graphUri, userAgent: "Voat.co OpenGraph Parser"); // open graph failed to find og:image element, abort thumbnail generation if (graph.Image == null) { return(null); } var thumbFileName = await GenerateThumbFromUrl(graph.Image.ToString()); return(thumbFileName); } catch (Exception) { // thumnail generation failed, skip adding thumbnail return(null); } }
public static Domain.Models.Submission Map(this Data.Models.Submission submission) { Domain.Models.Submission result = null; if (submission != null) { result = new Domain.Models.Submission(); result.ID = submission.ID; result.UserName = (submission.IsAnonymized ? submission.ID.ToString() : submission.UserName); result.Title = submission.Title; result.Url = submission.Url; result.Content = (submission.Type == 1 ? submission.Content : (string)null); //Support For Backwards compat, if FormattedContent is empty, do it here. result.FormattedContent = (submission.Type == 1 && String.IsNullOrEmpty(submission.FormattedContent) ? Formatting.FormatMessage(submission.Content, true) : submission.FormattedContent); result.LastEditDate = submission.LastEditDate; result.ThumbnailUrl = FileManager.Instance.Uri(new FileKey(submission.Thumbnail, FileType.Thumbnail)); //result.ThumbnailUrl = VoatUrlFormatter.ThumbnailPath(submission.Thumbnail, true, true); result.CommentCount = CommentCounter.CommentCount(submission.ID); result.CreationDate = submission.CreationDate; result.UpCount = (int)submission.UpCount; result.Views = (int)submission.Views; result.DownCount = (int)submission.DownCount; result.Type = submission.Type == 1 ? SubmissionType.Text : SubmissionType.Link; result.Subverse = submission.Subverse; result.IsAnonymized = submission.IsAnonymized; result.IsAdult = submission.IsAdult; result.IsDeleted = submission.IsDeleted; result.Rank = submission.Rank; result.RelativeRank = submission.RelativeRank; result.ArchiveDate = submission.ArchiveDate; result.Domain = submission.DomainReversed.ReverseSplit(); //add flair if present if (!String.IsNullOrEmpty(submission.FlairLabel)) { result.Attributes.Add(new ContentAttribute() { ID = -1, Type = AttributeType.Flair, Name = submission.FlairLabel, CssClass = submission.FlairCss }); } if (result.IsAdult) { result.Attributes.Add(new ContentAttribute() { ID = -1, Type = AttributeType.Data, Name = "NSFW", CssClass = "linkflairlabel" }); } if (result.ArchiveDate.HasValue) { result.Attributes.Add(new ContentAttribute() { ID = -1, Type = AttributeType.Data, Name = "Archived", CssClass = "linkflairlabel" }); } } return(result); }
internal static async Task SendCommentReplyNotification(IPrincipal user, Data.Models.Submission submission, Data.Models.Comment comment) { try { using (var _db = new VoatOutOfRepositoryDataContextAccessor()) { Random _rnd = new Random(); if (comment.ParentID != null && comment.Content != null) { // find the parent comment and its author var parentComment = _db.Comment.Find(comment.ParentID); if (parentComment != null) { // check if recipient exists if (UserHelper.UserExists(parentComment.UserName)) { // do not send notification if author is the same as comment author if (parentComment.UserName != comment.UserName) { // send the message //BlockedUser Implementation - Comment Reply if (!MesssagingUtility.IsSenderBlocked(comment.UserName, parentComment.UserName)) { //var submission = DataCache.Submission.Retrieve(comment.SubmissionID); //var q = new QuerySubmission(comment.SubmissionID.Value); //var submission = await q.ExecuteAsync().ConfigureAwait(CONSTANTS.AWAIT_CAPTURE_CONTEXT); if (submission != null) { //var subverse = DataCache.Subverse.Retrieve(submission.Subverse); var message = new Domain.Models.Message(); message.IsAnonymized = submission.IsAnonymized; message.Recipient = parentComment.UserName; message.RecipientType = Domain.Models.IdentityType.User; message.Sender = comment.UserName; message.SenderType = Domain.Models.IdentityType.User; message.Subverse = submission.Subverse; message.SubmissionID = submission.ID; message.CommentID = comment.ID; message.Type = Domain.Models.MessageType.CommentReply; message.CreationDate = Repository.CurrentDate; using (var repo = new Repository(user)) { var response = await repo.SendMessage(message); if (response.Success) { EventNotification.Instance.SendMessageNotice(message.Recipient, message.Sender, Domain.Models.MessageTypeFlag.CommentReply, Domain.Models.ContentType.Comment, comment.ID); } } } } } } } } } } catch (Exception ex) { throw ex; } }