示例#1
0
        //public BasicJsonMessage<Topic> PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func<Topic, string> topicLinkGenerator)
        //{

        //}

        public Topic PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator)
        {
            if (!permissionContext.UserCanPost || !permissionContext.UserCanView)
            {
                throw new Exception($"User {user.Name} can't post to forum {forum.Title}.");
            }
            newPost.Title = _textParsingService.Censor(newPost.Title);
            // TODO: text parsing is controller, see issue #121 https://github.com/POPWorldMedia/POPForums/issues/121
            var urlName   = newPost.Title.ToUniqueUrlName(_topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName()));
            var timeStamp = DateTime.UtcNow;
            var topicID   = _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, urlName);
            var postID    = _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0);

            _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name);
            _forumRepository.IncrementPostAndTopicCount(forum.ForumID);
            _profileRepository.SetLastPostID(user.UserID, postID);
            var topic = new Topic {
                TopicID = topicID, ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0
            };
            // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a>
            var topicLink = topicLinkGenerator(topic);
            var message   = String.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title);
            var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Count > 0;

            _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions);
            _eventPublisher.ProcessEvent(String.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true);
            forum = _forumRepository.Get(forum.ForumID);
            _broker.NotifyForumUpdate(forum);
            _broker.NotifyTopicUpdate(topic, forum, topicLink);
            _searchIndexQueueRepository.Enqueue(new SearchIndexPayload {
                TenantID = _tenantService.GetTenant(), TopicID = topic.TopicID
            });
            return(topic);
        }
示例#2
0
        public Post PostReply(Topic topic, User user, int parentPostID, string ip, bool isFirstInTopic, NewPost newPost, DateTime postTime, string topicLink, Func <User, string> unsubscribeLinkGenerator, string userUrl, Func <Post, string> postLinkGenerator)
        {
            newPost.Title = _textParsingService.Censor(newPost.Title);
            if (newPost.IsPlainText)
            {
                newPost.FullText = _textParsingService.ForumCodeToHtml(newPost.FullText);
            }
            else
            {
                newPost.FullText = _textParsingService.ClientHtmlToHtml(newPost.FullText);
            }
            var postID = _postRepository.Create(topic.TopicID, parentPostID, ip, isFirstInTopic, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, postTime, false, user.Name, null, false, 0);
            var post   = new Post
            {
                PostID         = postID,
                FullText       = newPost.FullText,
                IP             = ip,
                IsDeleted      = false,
                IsEdited       = false,
                IsFirstInTopic = isFirstInTopic,
                LastEditName   = user.Name,
                LastEditTime   = null,
                Name           = user.Name,
                ParentPostID   = parentPostID,
                PostTime       = postTime,
                ShowSig        = newPost.IncludeSignature,
                Title          = newPost.Title,
                TopicID        = topic.TopicID,
                UserID         = user.UserID
            };

            _topicRepository.IncrementReplyCount(topic.TopicID);
            _topicRepository.UpdateLastTimeAndUser(topic.TopicID, user.UserID, user.Name, postTime);
            _forumRepository.UpdateLastTimeAndUser(topic.ForumID, postTime, user.Name);
            _forumRepository.IncrementPostCount(topic.ForumID);
            _topicRepository.MarkTopicForIndexing(topic.TopicID);
            _profileRepository.SetLastPostID(user.UserID, postID);
            if (unsubscribeLinkGenerator != null)
            {
                _subscribedTopicService.NotifySubscribers(topic, user, topicLink, unsubscribeLinkGenerator);
            }
            // <a href="{0}">{1}</a> made a post in the topic: <a href="{2}">{3}</a>
            var message = String.Format(Resources.NewReplyPublishMessage, userUrl, user.Name, postLinkGenerator(post), topic.Title);
            var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(topic.ForumID).Count > 0;

            _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewPost, forumHasViewRestrictions);
            _broker.NotifyNewPosts(topic, post.PostID);
            _broker.NotifyNewPost(topic, post.PostID);
            var forum = _forumRepository.Get(topic.ForumID);

            _broker.NotifyForumUpdate(forum);
            topic = _topicRepository.Get(topic.TopicID);
            _broker.NotifyTopicUpdate(topic, forum, topicLink);
            return(post);
        }
示例#3
0
        public Post PostReply(Topic topic, User user, int parentPostID, string ip, bool isFirstInTopic, NewPost newPost, DateTime postTime, string topicLink, Func <User, string> unsubscribeLinkGenerator, string userUrl, Func <Post, string> postLinkGenerator)
        {
            newPost.Title = _textParsingService.Censor(newPost.Title);
            // TODO: text parsing is controller, see issue #121 https://github.com/POPWorldMedia/POPForums/issues/121
            var postID = _postRepository.Create(topic.TopicID, parentPostID, ip, isFirstInTopic, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, postTime, false, user.Name, null, false, 0);
            var post   = new Post
            {
                PostID         = postID,
                FullText       = newPost.FullText,
                IP             = ip,
                IsDeleted      = false,
                IsEdited       = false,
                IsFirstInTopic = isFirstInTopic,
                LastEditName   = user.Name,
                LastEditTime   = null,
                Name           = user.Name,
                ParentPostID   = parentPostID,
                PostTime       = postTime,
                ShowSig        = newPost.IncludeSignature,
                Title          = newPost.Title,
                TopicID        = topic.TopicID,
                UserID         = user.UserID
            };

            _topicRepository.IncrementReplyCount(topic.TopicID);
            _topicRepository.UpdateLastTimeAndUser(topic.TopicID, user.UserID, user.Name, postTime);
            _forumRepository.UpdateLastTimeAndUser(topic.ForumID, postTime, user.Name);
            _forumRepository.IncrementPostCount(topic.ForumID);
            _searchIndexQueueRepository.Enqueue(new SearchIndexPayload {
                TenantID = _tenantService.GetTenant(), TopicID = topic.TopicID
            });
            _profileRepository.SetLastPostID(user.UserID, postID);
            if (unsubscribeLinkGenerator != null)
            {
                _subscribedTopicService.NotifySubscribers(topic, user, topicLink, unsubscribeLinkGenerator);
            }
            // <a href="{0}">{1}</a> made a post in the topic: <a href="{2}">{3}</a>
            var message = String.Format(Resources.NewReplyPublishMessage, userUrl, user.Name, postLinkGenerator(post), topic.Title);
            var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(topic.ForumID).Count > 0;

            _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewPost, forumHasViewRestrictions);
            _broker.NotifyNewPosts(topic, post.PostID);
            _broker.NotifyNewPost(topic, post.PostID);
            var forum = _forumRepository.Get(topic.ForumID);

            _broker.NotifyForumUpdate(forum);
            topic = _topicRepository.Get(topic.TopicID);
            _broker.NotifyTopicUpdate(topic, forum, topicLink);
            return(post);
        }
示例#4
0
        public void VotePost(Post post, User user, string userUrl, string topicUrl, string topicTitle)
        {
            if (post.UserID == user.UserID)
            {
                return;
            }
            var voters = _postRepository.GetVotes(post.PostID);

            if (voters.ContainsKey(user.UserID))
            {
                return;
            }
            _postRepository.VotePost(post.PostID, user.UserID);
            var votes = _postRepository.CalculateVoteCount(post.PostID);

            _postRepository.SetVoteCount(post.PostID, votes);
            var votedUpUser = _userService.GetUser(post.UserID);

            if (votedUpUser != null)
            {
                // <a href="{0}">{1}</a> voted for a post in the topic: <a href="{2}">{3}</a>
                var message = String.Format(Resources.VoteUpPublishMessage, userUrl, user.Name, topicUrl, topicTitle);
                _eventPublisher.ProcessEvent(message, votedUpUser, EventDefinitionService.StaticEventIDs.PostVote, false);
            }
        }
示例#5
0
        public async void GetOnlinePlayers(ITibiaService tibiaService, IEventPublisher eventPublisher)
        {
            if (_hasRun)
            {
                var members = await tibiaService.GetMemberCharacters();

                var onlinePlayers = tibiaService.GetOnlineCharactersFromTibia();
                foreach (var member in members)
                {
                    if (onlinePlayers.Any(o => o.Name == member.Name))
                    {
                        tibiaService.LogOnlineTime(member);
                        var onlinePlayer = onlinePlayers.Single(o => o.Name == member.Name);
                        if (member.Level == 0)
                        {
                            member.Level = onlinePlayer.Level;
                            tibiaService.UpdateCharacter(member);
                        }
                        if (member.Level < onlinePlayer.Level)
                        {
                            await eventPublisher.ProcessEvent($"{member.Name} has leveled up!", member.User, EventDefinitionService.StaticEventIDs.LevelUp, false);

                            member.Level = onlinePlayer.Level;
                            tibiaService.UpdateCharacter(member);
                        }
                    }
                }
            }
        }
        public ActionResult ManualExistingEvent(int userID, string feedMessage, string eventDefinitionID)
        {
            var user            = _userService.GetUser(userID);
            var eventDefinition = _eventDefinitionService.GetEventDefinition(eventDefinitionID);

            if (user != null && eventDefinition != null)
            {
                _eventPublisher.ProcessEvent(feedMessage, user, eventDefinition.EventDefinitionID, false);
            }
            return(RedirectToAction("ManualEvent"));
        }
        public Topic PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator, DateTime timeStamp)
        {
            if (!permissionContext.UserCanPost || !permissionContext.UserCanView)
            {
                throw new Exception(String.Format("User {0} can't post to forum {1}.", user.Name, forum.Title));
            }
            newPost.Title = _textParsingService.EscapeHtmlAndCensor(newPost.Title);
            if (newPost.IsPlainText)
            {
                newPost.FullText = _textParsingService.ForumCodeToHtml(newPost.FullText);
            }
            else
            {
                newPost.FullText = _textParsingService.ClientHtmlToHtml(newPost.FullText);
            }
            var urlName = newPost.Title.ToUniqueUrlName(_topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName()));
            //var timeStamp = DateTime.UtcNow;

            var topicID = _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, false, urlName);
            var postID  = _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0, newPost.IsAnonymous, newPost.FileUrl);

            _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name);
            _forumRepository.IncrementPostAndTopicCount(forum.ForumID);
            _profileRepository.SetLastPostID(user.UserID, postID);
            var topic = new Topic(topicID)
            {
                ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsIndexed = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0
            };
            // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a>
            var topicLink = topicLinkGenerator(topic);
            var message   = String.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title);
            var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Count > 0;

            _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions);
            _eventPublisher.ProcessEvent(String.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true);
            forum = _forumRepository.Get(forum.ForumID);
            _broker.NotifyForumUpdate(forum);
            _broker.NotifyTopicUpdate(topic, forum, topicLink);
            return(topic);
        }
示例#8
0
        public ActionResult CreateExistingManualEvent([FromBody] ManualEvent manualEvent)
        {
            if (string.IsNullOrEmpty(manualEvent.EventDefinitionID))
            {
                return(BadRequest("Must specify an EventDefinitionID."));
            }
            var user = _userService.GetUser(manualEvent.UserID);

            if (user == null)
            {
                return(BadRequest($"UserID {manualEvent.UserID} does not exist."));
            }
            if (manualEvent.Points.HasValue)
            {
                return(BadRequest("Point value can't be specified."));
            }
            _eventPublisher.ProcessEvent(manualEvent.Message, user, manualEvent.EventDefinitionID, false);
            return(Ok());
        }
示例#9
0
        public async Task SetAnswer(User user, Topic topic, Post post, string userUrl, string topicUrl)
        {
            if (user.UserID != topic.StartedByUserID)
            {
                throw new SecurityException("Only the user that started a topic may set its answer.");
            }
            if (post == null || post.TopicID != topic.TopicID)
            {
                throw new InvalidOperationException("You can't use a post as an answer unless it's a child of the topic.");
            }
            var answerUser = await _userRepository.GetUser(post.UserID);

            if (answerUser != null &&          // answer user is still valid
                !topic.AnswerPostID.HasValue &&                    // an answer wasn't already chosen
                topic.StartedByUserID != post.UserID)              // the answer isn't coming from the question asker
            {
                // <a href="{0}">{1}</a> chose an answer for the question: <a href="{2}">{3}</a>
                var message = String.Format(Resources.QuestionAnswered, userUrl, user.Name, topicUrl, topic.Title);
                await _eventPublisher.ProcessEvent(message, answerUser, EventDefinitionService.StaticEventIDs.QuestionAnswered, false);
            }
            await _topicRepository.UpdateAnswerPostID(topic.TopicID, post.PostID);
        }
示例#10
0
        public async Task <BasicServiceResponse <Topic> > PostNewTopic(User user, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator, Func <Topic, string> redirectLinkGenerator)
        {
            if (user == null)
            {
                return(GetPostFailMessage(Resources.LoginToPost));
            }
            var forum = await _forumRepository.Get(newPost.ItemID);

            if (forum == null)
            {
                throw new Exception($"Forum {newPost.ItemID} not found");
            }
            var permissionContext = await _forumPermissionService.GetPermissionContext(forum, user);

            if (!permissionContext.UserCanView)
            {
                return(GetPostFailMessage(Resources.ForumNoView));
            }
            if (!permissionContext.UserCanPost)
            {
                return(GetPostFailMessage(Resources.ForumNoPost));
            }
            newPost.FullText = newPost.IsPlainText ? _textParsingService.ForumCodeToHtml(newPost.FullText) : _textParsingService.ClientHtmlToHtml(newPost.FullText);
            if (await IsNewPostDupeOrInTimeLimit(newPost.FullText, user))
            {
                return(GetPostFailMessage(string.Format(Resources.PostWait, _settingsManager.Current.MinimumSecondsBetweenPosts)));
            }
            if (string.IsNullOrWhiteSpace(newPost.FullText) || string.IsNullOrWhiteSpace(newPost.Title))
            {
                return(GetPostFailMessage(Resources.PostEmpty));
            }
            newPost.Title = _textParsingService.Censor(newPost.Title);
            var urlName   = newPost.Title.ToUniqueUrlName(await _topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName()));
            var timeStamp = DateTime.UtcNow;
            var topicID   = await _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, urlName);

            var postID = await _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0);

            await _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name);

            await _forumRepository.IncrementPostAndTopicCount(forum.ForumID);

            await _profileRepository.SetLastPostID(user.UserID, postID);

            var topic = new Topic {
                TopicID = topicID, ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0
            };
            // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a>
            var topicLink = topicLinkGenerator(topic);
            var message   = string.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title);
            var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Result.Count > 0;
            await _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions);

            await _eventPublisher.ProcessEvent(string.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true);

            forum = await _forumRepository.Get(forum.ForumID);

            _broker.NotifyForumUpdate(forum);
            _broker.NotifyTopicUpdate(topic, forum, topicLink);
            await _searchIndexQueueRepository.Enqueue(new SearchIndexPayload { TenantID = _tenantService.GetTenant(), TopicID = topic.TopicID });

            _topicViewCountService.SetViewedTopic(topic);

            var redirectLink = redirectLinkGenerator(topic);

            return(new BasicServiceResponse <Topic> {
                Data = topic, Message = null, Redirect = redirectLink, IsSuccessful = true
            });
        }