private string ParseContent(DataRow dr, string tempate, int rowcount) { var sOutput = tempate; var replyId = dr.GetInt("ReplyId"); var topicId = dr.GetInt("TopicId"); var postId = replyId == 0 ? topicId : replyId; var contentId = dr.GetInt("ContentId"); var dateCreated = dr.GetDateTime("DateCreated"); var dateUpdated = dr.GetDateTime("DateUpdated"); var authorId = dr.GetInt("AuthorId"); var username = dr.GetString("Username"); var firstName = dr.GetString("FirstName"); var lastName = dr.GetString("LastName"); var displayName = dr.GetString("DisplayName"); var userTopicCount = dr.GetInt("TopicCount"); var userReplyCount = dr.GetInt("ReplyCount"); var postCount = userTopicCount + userReplyCount; var userCaption = dr.GetString("UserCaption"); var body = dr.GetString("Body"); var subject = dr.GetString("Subject"); var tags = dr.GetString("Tags"); var signature = dr.GetString("Signature"); var ipAddress = dr.GetString("IPAddress"); var memberSince = dr.GetDateTime("MemberSince"); var avatarDisabled = dr.GetBoolean("AvatarDisabled"); var userRoles = dr.GetString("UserRoles"); var isUserOnline = dr.GetBoolean("IsUserOnline"); var replyStatusId = dr.GetInt("StatusId"); var totalPoints = _enablePoints ? dr.GetInt("UserTotalPoints") : 0; var answerCount = dr.GetInt("AnswerCount"); var rewardPoints = dr.GetInt("RewardPoints"); var dateLastActivity = dr.GetDateTime("DateLastActivity"); var signatureDisabled = dr.GetBoolean("SignatureDisabled"); DotNetNuke.Entities.Users.UserController uc = new DotNetNuke.Entities.Users.UserController(); DotNetNuke.Entities.Users.UserInfo author = uc.GetUser(DotNetNuke.Entities.Portals.PortalController.GetCurrentPortalSettings().PortalId, authorId); // Populate the user object with the post author info. var up = new User { UserId = authorId, UserName = username, FirstName = firstName.Replace("&#", "&#"), LastName = lastName.Replace("&#", "&#"), DisplayName = displayName.Replace("&#", "&#"), Profile = { UserCaption = userCaption, Signature = signature, DateCreated = memberSince, AvatarDisabled = avatarDisabled, Roles = userRoles, ReplyCount = userReplyCount, TopicCount = userTopicCount, AnswerCount = answerCount, RewardPoints = rewardPoints, DateLastActivity = dateLastActivity, PrefBlockAvatars = UserPrefHideAvatars, PrefBlockSignatures = UserPrefHideSigs, IsUserOnline = isUserOnline, SignatureDisabled = signatureDisabled } }; if (author != null) up.Email = author.Email; //Perform Profile Related replacements sOutput = TemplateUtils.ParseProfileTemplate(sOutput, up, PortalId, ModuleId, ImagePath, CurrentUserType, true, UserPrefHideAvatars, UserPrefHideSigs, ipAddress, UserId, TimeZoneOffset); // Replace Tags Control if (string.IsNullOrWhiteSpace(tags)) sOutput = TemplateUtils.ReplaceSubSection(sOutput, string.Empty, "[AF:CONTROL:TAGS]", "[/AF:CONTROL:TAGS]"); else { sOutput = sOutput.Replace("[AF:CONTROL:TAGS]", string.Empty); sOutput = sOutput.Replace("[/AF:CONTROL:TAGS]", string.Empty); var tagList = string.Empty; foreach (var tag in tags.Split(',')) { if (tagList != string.Empty) tagList += ", "; tagList += "<a href=\"" + Utilities.NavigateUrl(TabId, string.Empty, new[] { ParamKeys.ViewType + "=search", ParamKeys.Tags + "=" + HttpUtility.UrlEncode(tag) }) + "\">" + tag + "</a>"; } sOutput = sOutput.Replace("[AF:LABEL:TAGS]", tagList); } // Use a string builder from here on out. var sbOutput = new StringBuilder(sOutput); if (_bModSplit) { sbOutput = sbOutput.Replace("[SPLITCHECKBOX]", "<div class=\"split-checkbox\" style=\"display:none;\"><input type=\"checkbox\" onChange=\"amaf_splitCheck(this);\" value=\"" + replyId + "\" /></div>"); } else { sbOutput = sbOutput.Replace("[SPLITCHECKBOX]", string.Empty); } // Row CSS Classes if (rowcount % 2 == 0) { sbOutput.Replace("[POSTINFOCSS]", "afpostinfo afpostinfo1"); sbOutput.Replace("[POSTTOPICCSS]", "afposttopic afpostreply1"); sbOutput.Replace("[POSTREPLYCSS]", "afpostreply afpostreply1"); } else { sbOutput.Replace("[POSTTOPICCSS]", "afposttopic afpostreply2"); sbOutput.Replace("[POSTINFOCSS]", "afpostinfo afpostinfo2"); sbOutput.Replace("[POSTREPLYCSS]", "afpostreply afpostreply2"); } // Description if (replyId == 0) { sbOutput.Replace("[POSTID]", topicId.ToString()); _topicDescription = Utilities.StripHTMLTag(body).Trim(); _topicDescription = _topicDescription.Replace(System.Environment.NewLine, string.Empty); if (_topicDescription.Length > 255) _topicDescription = _topicDescription.Substring(0, 255); } else { sbOutput.Replace("[POSTID]", replyId.ToString()); } sbOutput.Replace("[FORUMID]", ForumId.ToString()); sbOutput.Replace("[REPLYID]", replyId.ToString()); sbOutput.Replace("[TOPICID]", topicId.ToString()); sbOutput.Replace("[POSTDATE]", GetDate(dateCreated)); sbOutput.Replace("[DATECREATED]", GetDate(dateCreated)); // Parse Roles -- This should actually be taken care of in ParseProfileTemplate //if (sOutput.Contains("[ROLES:")) // sOutput = TemplateUtils.ParseRoles(sOutput, (up.UserId == -1) ? string.Empty : up.Profile.Roles); // Delete Action if (_bModDelete || ((_bDelete && authorId == UserId && !_bLocked) && ((replyId == 0 && _replyCount == 0) || replyId > 0))) { if (_useListActions) sbOutput.Replace("[ACTIONS:DELETE]", "<li onclick=\"amaf_postDel(" + topicId + "," + replyId + ");\" title=\"[RESX:Delete]\"><i class=\"fa fa-trash-o fa-fw fa-blue\"></i> [RESX:Delete]</li>"); else sbOutput.Replace("[ACTIONS:DELETE]", "<a href=\"javascript:void(0);\" class=\"af-actions\" onclick=\"amaf_postDel(" + topicId + "," + replyId + ");\" title=\"[RESX:Delete]\"><i class=\"fa fa-trash-o fa-fw fa-blue\"></i> [RESX:Delete]</a>"); } else { sbOutput.Replace("[ACTIONS:DELETE]", string.Empty); } // Edit Action if (_bModEdit || (_bEdit && authorId == UserId && (_editInterval == 0 || SimulateDateDiff.DateDiff(SimulateDateDiff.DateInterval.Minute, dateCreated, DateTime.Now) < _editInterval))) { var sAction = "re"; if (replyId == 0) sAction = "te"; //var editParams = new[] { ParamKeys.ViewType + "=post", "action=" + sAction, ParamKeys.ForumId + "=" + ForumId, ParamKeys.TopicId + "=" + topicId, "postid=" + postId }; var editParams = new List<string>() { ParamKeys.ViewType + "=post", "action=" + sAction, ParamKeys.ForumId + "=" + ForumId, ParamKeys.TopicId + "=" + topicId, "postid=" + postId }; if (SocialGroupId > 0) editParams.Add(ParamKeys.GroupIdName + "=" + SocialGroupId); if (_useListActions) sbOutput.Replace("[ACTIONS:EDIT]", "<li onclick=\"window.location.href='" + Utilities.NavigateUrl(TabId, "", editParams) + "';\" title=\"[RESX:Edit]\"><i class=\"fa fa-pencil fa-fw fa-blue\"></i> [RESX:Edit]</li>"); else sbOutput.Replace("[ACTIONS:EDIT]", "<a class=\"af-actions\" href=\"" + Utilities.NavigateUrl(TabId, "", editParams) + "\" title=\"[RESX:Edit]\"><i class=\"fa fa-pencil fa-fw fa-blue\"></i> [RESX:Edit]</a>"); } else { sbOutput.Replace("[ACTIONS:EDIT]", string.Empty); } // Reply and Quote Actions if (!_bLocked && CanReply) { var quoteParams = new List<string> { ParamKeys.ViewType + "=post", ParamKeys.ForumId + "=" + ForumId, ParamKeys.TopicId + "=" + topicId, ParamKeys.QuoteId + "=" + postId }; var replyParams = new List<string> { ParamKeys.ViewType + "=post", ParamKeys.ForumId + "=" + ForumId, ParamKeys.TopicId + "=" + topicId, ParamKeys.ReplyId + "=" + postId }; if (SocialGroupId > 0) { quoteParams.Add(ParamKeys.GroupIdName + "=" + SocialGroupId); replyParams.Add(ParamKeys.GroupIdName + "=" + SocialGroupId); } if (_useListActions) { sbOutput.Replace("[ACTIONS:QUOTE]", "<li onclick=\"window.location.href='" + Utilities.NavigateUrl(TabId, "", quoteParams) + "';\" title=\"[RESX:Quote]\"><i class=\"fa fa-quote-left fa-fw fa-blue\"></i> [RESX:Quote]</li>"); sbOutput.Replace("[ACTIONS:REPLY]", "<li onclick=\"window.location.href='" + Utilities.NavigateUrl(TabId, "", replyParams) + "';\" title=\"[RESX:Reply]\"><i class=\"fa fa-reply fa-fw fa-blue\"></i> [RESX:Reply]</li>"); } else { sbOutput.Replace("[ACTIONS:QUOTE]", "<a class=\"af-actions\" href=\"" + Utilities.NavigateUrl(TabId, "", quoteParams) + "\" title=\"[RESX:Quote]\"><i class=\"fa fa-quote-left fa-fw fa-blue\"></i> [RESX:Quote]</a>"); sbOutput.Replace("[ACTIONS:REPLY]", "<a class=\"af-actions\" href=\"" + Utilities.NavigateUrl(TabId, "", replyParams) + "\" title=\"[RESX:Reply]\"><i class=\"fa fa-reply fa-fw fa-blue\"></i> [RESX:Reply]</a>"); } } else { sbOutput.Replace("[ACTIONS:QUOTE]", string.Empty); sbOutput.Replace("[ACTIONS:REPLY]", string.Empty); } if (_bModMove) { sbOutput.Replace("[ACTIONS:MOVE]", "<li onclick=\"javascript:amaf_openMove([TOPICID])\"';\" title=\"[RESX:Move]\"><i class=\"fa fa-exchange fa-rotate-90 fa-blue\"></i> [RESX:Move]</li>"); } else { sbOutput = sbOutput.Replace("[ACTIONS:MOVE]", string.Empty); } sbOutput = sbOutput.Replace("[TOPICID]", TopicId.ToString()); // Status if (_statusId <= 0 || (_statusId == 3 && replyStatusId == 0)) { sbOutput.Replace("[ACTIONS:ANSWER]", string.Empty); } else if (replyStatusId == 1) { // Answered if (_useListActions) sbOutput.Replace("[ACTIONS:ANSWER]", "<li class=\"af-answered\" title=\"[RESX:Status:Answer]\"><em></em>[RESX:Status:Answer]</li>"); else sbOutput.Replace("[ACTIONS:ANSWER]", "<span class=\"af-actions af-answered\" title=\"[RESX:Status:Answer]\"><em></em>[RESX:Status:Answer]</span>"); } else { // Not Answered if ((UserId == _topicAuthorId && !_bLocked) || _bModEdit) { // Can mark answer if (_useListActions) sbOutput.Replace("[ACTIONS:ANSWER]", "<li class=\"af-markanswer\" onclick=\"amaf_markAnswer(" + topicId.ToString() + "," + replyId.ToString() + ");\" title=\"[RESX:Status:SelectAnswer]\"><em></em>[RESX:Status:SelectAnswer]</li>"); else sbOutput.Replace("[ACTIONS:ANSWER]", "<a class=\"af-actions af-markanswer\" href=\"#\" onclick=\"amaf_markAnswer(" + topicId.ToString() + "," + replyId.ToString() + "); return false;\" title=\"[RESX:Status:SelectAnswer]\"><em></em>[RESX:Status:SelectAnswer]</a>"); } else { // Display Nothing sbOutput.Replace("[ACTIONS:ANSWER]", string.Empty); } } // User Edit Date if (dateUpdated == dateCreated || dateUpdated == DateTime.MinValue || dateUpdated == Utilities.NullDate()) { sbOutput.Replace("[EDITDATE]", string.Empty); } else { sbOutput.Replace("[EDITDATE]", Utilities.GetDate(dateUpdated, ModuleId, TimeZoneOffset)); } // Mod Edit Date if (_bModEdit) { if (dateCreated == dateUpdated || dateUpdated == DateTime.MinValue || dateUpdated == Utilities.NullDate()) sbOutput.Replace("[MODEDITDATE]", string.Empty); else sbOutput.Replace("[MODEDITDATE]", Utilities.GetDate(dateUpdated, ModuleId, TimeZoneOffset)); } else { sbOutput.Replace("[MODEDITDATE]", string.Empty); } if (_allowLikes) { Image likeImage = new Image(); var likesController = new LikesController(); var likes = likesController.GetForPost(contentId); bool youLike = likes.Where(o => o.UserId == UserId) .Select(o => o.Checked) .FirstOrDefault(); string image = string.Empty; if (youLike) image = "fa-thumbs-o-up"; else image = "fa-thumbs-up"; likeImage.ImageUrl = image; if (CanReply) { sbOutput = sbOutput.Replace("[LIKES]", "<i class=\"fa " + image + "\" onclick=\"amaf_likePost(" + UserId + "," + contentId + ")\" > " + likes.Count.ToString() + "</i>"); sbOutput = sbOutput.Replace("[LIKESx2]", "<i class=\"fa " + image + " fa-2x\" onclick=\"amaf_likePost(" + UserId + "," + contentId + ")\" > " + likes.Count.ToString() + "</i>"); sbOutput = sbOutput.Replace("[LIKESx3]", "<i class=\"fa " + image + " fa-3x\" onclick=\"amaf_likePost(" + UserId + "," + contentId + ")\" > " + likes.Count.ToString() + "</i>"); } else { sbOutput = sbOutput.Replace("[LIKES]", "<i class=\"fa " + image + "\" /> " + likes.Count.ToString()); sbOutput = sbOutput.Replace("[LIKESx2]", "<i class=\"fa " + image + " fa-2x\" /> " + likes.Count.ToString()); sbOutput = sbOutput.Replace("[LIKESx3]", "<i class=\"fa " + image + " fa-3x\" /> " + likes.Count.ToString()); //sbOutput = sbOutput.Replace("[LIKES]", "<img src=\"" + image + "\" onclick=\"amaf_likePost(" + UserId + "," + contentId + ")\" /> " + likes.Count.ToString()); } } else { sbOutput = sbOutput.Replace("[LIKES]", string.Empty); sbOutput = sbOutput.Replace("[LIKESx2]", string.Empty); sbOutput = sbOutput.Replace("[LIKESx3]", string.Empty); } // Poll Results if (sOutput.Contains("[POLLRESULTS]")) { if (_topicType == 1) { var polls = new Polls(); sbOutput.Replace("[POLLRESULTS]", polls.PollResults(topicId, ImagePath)); } else { sbOutput.Replace("[POLLRESULTS]", string.Empty); } } // Mod Alert //var alertParams = new[] { ParamKeys.ViewType + "=modreport", ParamKeys.ForumId + "=" + ForumId, ParamKeys.TopicId + "=" + topicId, ParamKeys.ReplyId + "=" + postId }; var alertParams = new List<string> { ParamKeys.ViewType + "=modreport", ParamKeys.ForumId + "=" + ForumId, ParamKeys.TopicId + "=" + topicId, ParamKeys.ReplyId + "=" + postId }; if (SocialGroupId > 0) alertParams.Add(String.Format("{0}={1}", ParamKeys.GroupIdName, SocialGroupId)); if (Request.IsAuthenticated) { if (_useListActions) sbOutput.Replace("[ACTIONS:ALERT]", "<li onclick=\"window.location.href='" + Utilities.NavigateUrl(TabId, "", alertParams) + "';\" title=\"[RESX:Alert]\"><i class=\"fa fa-bell-o fa-fw fa-blue\"></i> [RESX:Alert]</li>"); else sbOutput.Replace("[ACTIONS:ALERT]", "<a class=\"af-actions\" href=\"" + Utilities.NavigateUrl(TabId, "", alertParams) + "\" title=\"[RESX:Alert]\"><i class=\"fa fa-bell-o fa-fw fa-blue\"></i> [RESX:Alert]</a>"); } else { sbOutput.Replace("[ACTIONS:ALERT]", string.Empty); } // Process Body if (string.IsNullOrEmpty(body)) body = " <br />"; var sBody = Utilities.ManageImagePath(body); sBody = sBody.Replace("[", "["); sBody = sBody.Replace("]", "]"); if (sBody.ToUpper().Contains("[CODE]")) { sBody = Regex.Replace(sBody, "([CODE])", "[CODE]", RegexOptions.IgnoreCase); sBody = Regex.Replace(sBody, "([\\/CODE])", "[/CODE]", RegexOptions.IgnoreCase); } //sBody = sBody.Replace("<CODE>", "<CODE>") if (Regex.IsMatch(sBody, "\\[CODE([^>]*)\\]", RegexOptions.IgnoreCase)) { var objCode = new CodeParser(); sBody = CodeParser.ParseCode(Utilities.HTMLDecode(sBody)); } sBody = Utilities.StripExecCode(sBody); if (MainSettings.AutoLinkEnabled) sBody = Utilities.AutoLinks(sBody, Request.Url.Host); if (sBody.Contains("<%@")) sBody = sBody.Replace("<%@ ", "<%@ "); if (body.ToLowerInvariant().Contains("runat")) sBody = Regex.Replace(sBody, "runat", "runat", RegexOptions.IgnoreCase); sbOutput.Replace("[BODY]", sBody); // Subject sbOutput.Replace("[SUBJECT]", subject); // Attachments sbOutput.Replace("[ATTACHMENTS]", GetAttachments(contentId, true, PortalId, ModuleId)); // Switch back from the string builder to a normal string before we perform the image/thumbnail replacements. sOutput = sbOutput.ToString(); // Legacy attachment functionality, uses "attachid" // [IMAGE:38] if (sOutput.Contains("[IMAGE:")) { var strHost = Common.Globals.AddHTTP(Common.Globals.GetDomainName(Request)) + "/"; const string pattern = "([IMAGE:(.+?)])"; sOutput = Regex.Replace(sOutput, pattern, match => "<img src=\"" + strHost + "DesktopModules/ActiveForums/viewer.aspx?portalid=" + PortalId + "&moduleid=" + ModuleId + "&attachid=" + match.Groups[2].Value + "\" border=\"0\" class=\"afimg\" />"); } // Legacy attachment functionality, uses "attachid" // [THUMBNAIL:38] if (sOutput.Contains("[THUMBNAIL:")) { var strHost = Common.Globals.AddHTTP(Common.Globals.GetDomainName(Request)) + "/"; const string pattern = "([THUMBNAIL:(.+?)])"; sOutput = Regex.Replace(sOutput, pattern, match => { var thumbId = match.Groups[2].Value.Split(':')[0]; var parentId = match.Groups[2].Value.Split(':')[1]; return "<a href=\"" + strHost + "DesktopModules/ActiveForums/viewer.aspx?portalid=" + PortalId + "&moduleid=" + ModuleId + "&attachid=" + parentId + "\" target=\"_blank\"><img src=\"" + strHost + "DesktopModules/ActiveForums/viewer.aspx?portalid=" + PortalId + "&moduleid=" + ModuleId + "&attachid=" + thumbId + "\" border=\"0\" class=\"afimg\" /></a>"; }); } return sOutput; }