//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); }
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); }
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); }
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); } }
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); }
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()); }
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); }
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 }); }