Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        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;
            }
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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));
        }
Esempio n. 8
0
        // 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);
            }
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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;
            }
        }