private ThreadStub CreateThreadStub(Thread thread, IDiscussable discussable, bool hasGroupObjectFilter) { return new ThreadStub() { k = thread.K, authorHtml = thread.AuthorHtml, commentHtmlEnd = thread.CommentHtmlEnd, commentHtmlStart = thread.CommentHtmlStart, favouriteHtml = thread.FavouriteHtml("f"), favouriteScript = thread.FavouriteScript("f"), iconsHtml = thread.IconsHtml(hasGroupObjectFilter), pagesHtml = thread.PagesHtml(discussable, new Bobs.Thread.GetUrlByDiscussableDelegate(thread.GetThreadUrl), "k", thread.K.ToString()), repliesHtml = thread.RepliesHtml, rollover = thread.Rollover, subjectSafe = HttpUtility.HtmlEncode(thread.SubjectSafe), threadUrlSimple = thread.GetThreadUrlSimple(discussable), watchingHtml = thread.WatchingHtml("w"), watchingScript = thread.WatchingScript("w", "") }; }
public static Thread.MakerReturn CreatePublicThread(IDiscussable parentObject, Guid duplicateGuid, string commentHtml, bool isNews, List<int> invitedUsrKs, bool disableLiveChatMessage) { Thread.Maker m = new Thread.Maker(); m.PostingUsr = Usr.Current; string subject = ""; if (parentObject is Article) { subject = Cambro.Misc.Utility.Snip(((Article)parentObject).Title, 50); } else { subject = Cambro.Misc.Utility.Snip(Cambro.Web.Helpers.Strip(commentHtml), 50); } m.Subject = subject; m.Body = commentHtml; m.ParentType = parentObject.ObjectType; m.ParentK = parentObject.K; m.DuplicateGuid = duplicateGuid; if (isNews) m.News = true; m.InviteKs = invitedUsrKs; m.DisableLiveChatMessage = disableLiveChatMessage; Thread.MakerReturn r = m.Post(); if (r.Success) { if (parentObject is IHasPrimaryThread && !r.Thread.Private && r.Thread.GroupK == 0) { ((IHasPrimaryThread)parentObject).UpdateSingleThread(); } //if (parentObject is Article && !r.Thread.Private && r.Thread.GroupK == 0) //{ // Article article = (Article)parentObject; // article.ThreadK = r.Thread.K; // article.Update(); // article.UpdateTotalComments(null); //} //else //{ CheckToPutThreadInCaptionCompetition(parentObject, r.Thread); //} } return r; }
private static void CheckToPutThreadInCaptionCompetition(IDiscussable discussable, Thread thread) { if (Vars.IsCompetitionActive && discussable.ObjectType == Model.Entities.ObjectType.Photo) { Photo photo = (Photo)discussable; if (photo.IsInCaptionCompetition && (!photo.ThreadK.HasValue || !photo.Thread.IsInCaptionCompetition)) { thread.GroupK = Vars.CompetitionGroupK; thread.IsInCaptionCompetition = true; thread.Update(); photo.ThreadK = thread.K; photo.Update(); } } }
public static Thread.MakerReturn CreateNewPublicThread(IDiscussable discussable, Guid duplicateGuid, string commentHtml, bool isNews, List<int> invitedUsrKs) { Thread.Maker m = new Thread.Maker(); m.PostingUsr = Usr.Current; m.Body = commentHtml; m.Subject = Cambro.Misc.Utility.Snip(Cambro.Web.Helpers.Strip(m.Body), 50); m.ParentType = discussable.ObjectType; m.ParentK = discussable.K; m.DuplicateGuid = duplicateGuid; if (isNews) m.News = true; m.InviteKs = invitedUsrKs; Thread.MakerReturn r = m.Post(); if (r.Success) { CheckToPutThreadInCaptionCompetition(discussable, r.Thread); } return r; }
public static Thread.MakerReturn CreatePrivateThread(IDiscussable discussable, Guid duplicateGuid, string commentHtml, List<int> invitedUsrKs, bool isSealed) { Thread.Maker m = new Thread.Maker(); m.PostingUsr = Usr.Current; m.Body = commentHtml; string stripped = Cambro.Web.Helpers.StripHtmlDoubleSpacesLineFeeds(m.Body); if (stripped.Trim().Length == 0) stripped = "[no subject]"; m.Subject = ((stripped.Length > 50) ? stripped.TruncateWithDots(50) : stripped); m.ParentType = discussable.ObjectType; m.ParentK = discussable.K; m.DuplicateGuid = duplicateGuid; m.Private = true; m.InviteKs = invitedUsrKs; m.Sealed = isSealed; Thread.MakerReturn r = m.Post(); return r; }
public static Thread.MakerReturn CreateNewThreadInGroup(int groupK, IDiscussable discussable, Guid duplicateGuid, string commentHtml, bool isNews, List<int> invitedUsrKs, bool isPrivate) { Group g = new Group(groupK); GroupUsr gu = g.GetGroupUsr(Usr.Current); if (!g.CanMember(Usr.Current, gu)) throw new DsiUserFriendlyException("You can't post to this group!"); Thread.Maker m = new Thread.Maker(); m.PostingUsr = Usr.Current; m.Body = commentHtml; string stripped = Cambro.Web.Helpers.StripHtmlDoubleSpacesLineFeeds(m.Body); if (stripped.Trim().Length == 0) stripped = "[no subject]"; m.Subject = ((stripped.Length > 50) ? (stripped.Substring(0, 47) + "...") : stripped); m.ParentType = discussable.ObjectType; m.ParentK = discussable.K; m.DuplicateGuid = duplicateGuid; m.Private = isPrivate; if (isNews) m.News = true; m.InviteKs = invitedUsrKs; m.GroupK = g.K; Thread.MakerReturn r = m.Post(); return r; }
public string GetThreadUrlSimple(IDiscussable discussable) { if (discussable != null && (discussable.UsedDiscussable is Photo || discussable.UsedDiscussable is Article)) return this.Url(); else if (discussable != null && discussable.UsedDiscussable is IDiscussable) return ((IDiscussable)discussable.UsedDiscussable).UrlDiscussion("k", this.K.ToString()); else return UrlInfo.MakeUrl("", "chat", "k", this.K.ToString()); }
public string GetThreadUrl(IDiscussable discussable, object[] par) { string[] sA = new string[par.Length]; for (int i = 0; i < par.Length; i++) { sA[i] = par[i].ToString(); } if (discussable == null) { return UrlInfo.MakeUrl("", "chat", par); } else if (discussable.UsedDiscussable is Photo || discussable.UsedDiscussable is Article) { return this.Url(sA); } else if (discussable.UsedDiscussable is IDiscussable) { return ((IDiscussable)discussable.UsedDiscussable).UrlDiscussion(sA); } else return ""; }
public static ThreadSet GetThreadsByIDiscussable(IDiscussable discussable, int threadsCount, bool hotTopicsOnly) { int usrK = 0; if (Usr.Current != null) usrK = Usr.Current.K; Query q = new Query(); q.TopRecords = threadsCount; #region Columns q.Columns = new ColumnSet( Thread.Columns.K, Thread.Columns.Private, Thread.Columns.GroupPrivate, Thread.Columns.PrivateGroup, Thread.Columns.Subject, Thread.Columns.LastPost, Thread.Columns.TotalComments, Thread.Columns.TotalParticipants, Thread.Columns.TotalWatching, Thread.Columns.IsNews, Thread.Columns.IsReview, Thread.Columns.ParentObjectType, Thread.Columns.ParentObjectK, Thread.Columns.GroupK, Thread.Columns.UsrK, Thread.Columns.UrlFragment, ThreadUsr.Columns.ThreadK, ThreadUsr.Columns.UsrK, ThreadUsr.Columns.Status, ThreadUsr.Columns.StatusChangeObjectType, ThreadUsr.Columns.Favourite, ThreadUsr.Columns.ViewComments, ThreadUsr.Columns.ViewCommentsLatest, ThreadUsr.Columns.ViewDateTime, ThreadUsr.Columns.ViewDateTimeLatest, Thread.Columns.UsrK, //new JoinedColumnSet(Thread.Columns.UsrK, Usr.LinkColumns), Thread.Columns.LastPostUsrK, //new JoinedColumnSet(Thread.Columns.LastPostUsrK, Usr.LinkColumns), Thread.Columns.FirstParticipantUsrK //new JoinedColumnSet(Thread.Columns.FirstParticipantUsrK, Usr.LinkColumns), //Photo.Columns.K, //Photo.Columns.Icon, //Photo.Columns.ContentDisabled ); #endregion if (hotTopicsOnly) q.OrderBy = Thread.HotTopicsOrderBy; else q.OrderBy = Thread.Order; q.TableElement = new TableElement(TablesEnum.Thread); #region Main querycondition if (discussable == null) q.QueryCondition = new Q(true); else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Event) q.QueryCondition = new Q(Thread.Columns.EventK, discussable.UsedDiscussable.K); else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Venue) q.QueryCondition = new Q(Thread.Columns.VenueK, discussable.UsedDiscussable.K); else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Place) q.QueryCondition = new Q(Thread.Columns.PlaceK, discussable.UsedDiscussable.K); else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Country) q.QueryCondition = Country.ThreadsQ(discussable.UsedDiscussable.K); else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Article) { Article a = (Article)discussable.UsedDiscussable; if (a.ThreadK > 0) q.QueryCondition = new And( Article.ThreadsQ(discussable.UsedDiscussable.K), new Q(Thread.Columns.K, QueryOperator.NotEqualTo, a.ThreadK)); else q.QueryCondition = Article.ThreadsQ(discussable.UsedDiscussable.K); } else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Brand) { if (((Brand)discussable.UsedDiscussable).BrandPageShowEventChat) { q.TableElement = Thread.EventBrandLeftJoin; q.QueryCondition = Brand.ThreadsQEvents((Brand)discussable.UsedDiscussable); } else q.QueryCondition = Group.ThreadsQ(((Brand)discussable.UsedDiscussable).GroupK); } else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Group) q.QueryCondition = Group.ThreadsQ(discussable.UsedDiscussable.K); else if (discussable.UsedDiscussable.ObjectType == Model.Entities.ObjectType.Photo) { Photo p = (Photo)discussable.UsedDiscussable; if (p.ThreadK > 0) q.QueryCondition = new And( new Q(Thread.Columns.PhotoK, discussable.UsedDiscussable.K), new Q(Thread.Columns.K, QueryOperator.NotEqualTo, p.ThreadK)); else q.QueryCondition = new Q(Thread.Columns.PhotoK, discussable.UsedDiscussable.K); } #endregion if (hotTopicsOnly) { q.QueryCondition = new And( q.QueryCondition, new Q(Thread.Columns.TotalComments, QueryOperator.GreaterThan, 20), new Q(Thread.Columns.AverageCommentDateTime, QueryOperator.GreaterThan, DateTime.Now.AddDays(-14)) ); } if (Usr.Current != null && discussable != null && discussable.UsedDiscussable.ShowPrivateThreads ) { #region ThreadUsr join q.TableElement = new Join( q.TableElement, new TableElement(TablesEnum.ThreadUsr), QueryJoinType.Left, new And( new Q(Thread.Columns.K, ThreadUsr.Columns.ThreadK, true), new Q(ThreadUsr.Columns.UsrK, usrK), new Q(ThreadUsr.Columns.Status, QueryOperator.NotEqualTo, ThreadUsr.StatusEnum.Deleted) ) ); #endregion #region GroupUsr join q.TableElement = new Join( q.TableElement, new TableElement(TablesEnum.GroupUsr), QueryJoinType.Left, new And( new Q(Thread.Columns.GroupK, GroupUsr.Columns.GroupK, true), new Q(GroupUsr.Columns.UsrK, usrK), new Q(GroupUsr.Columns.Status, GroupUsr.StatusEnum.Member) ) ); #endregion #region Privacy querycondition q.QueryCondition = new And( q.QueryCondition, new Or( new Q(Thread.Columns.Private, false), new Q(ThreadUsr.Columns.UsrK, usrK) ), new Or( new Q(Thread.Columns.GroupPrivate, false), new Q(GroupUsr.Columns.UsrK, usrK) ), new Or( new Q(Thread.Columns.PrivateGroup, false), new Q(GroupUsr.Columns.UsrK, usrK) ) ); #endregion } else { #region ThreadUsr join q.TableElement = new Join( q.TableElement, new TableElement(TablesEnum.ThreadUsr), QueryJoinType.Left, new And( new Q(Thread.Columns.K, ThreadUsr.Columns.ThreadK, true), new Q(ThreadUsr.Columns.UsrK, usrK) ) ); #endregion #region Privacy querycondition q.QueryCondition = new And( q.QueryCondition, new Q(Thread.Columns.Private, false), new Q(Thread.Columns.GroupPrivate, false), new Q(Thread.Columns.PrivateGroup, false) ); #endregion } try { return new ThreadSet(q); } catch { q.QueryCondition = new Q(Thread.Columns.K, Vars.DevEnv ? 3252221 : 3252503); return new ThreadSet(q); } }
void UpdateAncestors(IDiscussable b) { if (b is Group) UpdateAncestors((Group)b); else if (b is MusicType) UpdateAncestors((MusicType)b); else if (b is Photo) UpdateAncestors((Photo)b); else if (b is Article) UpdateAncestors((Article)b); else if (b is Event) UpdateAncestors((Event)b); else if (b is Venue) UpdateAncestors((Venue)b); else if (b is Place) UpdateAncestors((Place)b); else if (b is Country) UpdateAncestors((Country)b); }
private void WritePageLink(int page, StringBuilder sb, IDiscussable discussable, int firstUnreadPage, int viewComments, int totalComments, GetUrlByDiscussableDelegate GetThreadUrl, params object[] par) { bool hilight = firstUnreadPage > 0 && firstUnreadPage <= page && viewComments < totalComments; if (!hilight) sb.Append("<small>"); sb.Append("<a "); if (hilight) sb.Append("class=\"Unread\" "); sb.Append("href=\""); if (page > 1) sb.Append(GetThreadUrl(discussable, Cambro.Misc.Utility.Join(par, "k", this.K.ToString(), "c", page.ToString()))); else sb.Append(GetThreadUrl(discussable, Cambro.Misc.Utility.Join(par, "k", this.K.ToString()))); sb.Append("\">"); sb.Append(page.ToString()); sb.Append("</a>"); if (!hilight) sb.Append("</small>"); sb.Append(" "); }
public string PagesHtml(IDiscussable discussable, GetUrlByDiscussableDelegate GetThreadUrl, params object[] par) { int firstUnreadPage = 0; if (this.JoinedThreadUsr.ViewCommentsInUse > 0) { firstUnreadPage = (this.JoinedThreadUsr.ViewCommentsInUse / Vars.CommentsPerPage) + 1; } StringBuilder sb = new StringBuilder(); if (firstUnreadPage > 0 && LastPage >= firstUnreadPage && this.JoinedThreadUsr.ViewCommentsInUse < this.TotalComments) { int numLinks = 3; int midLinks = 2; sb.Append(" <a class=\"Unread\" href=\""); if (firstUnreadPage > 1) sb.Append(GetThreadUrl(discussable, Cambro.Misc.Utility.Join(par, "k", this.K.ToString(), "c", firstUnreadPage.ToString())) + "#Unread"); else sb.Append(GetThreadUrl(discussable, Cambro.Misc.Utility.Join(par, "k", this.K.ToString())) + "#Unread"); sb.Append("\" onmouseover=\"stt(UnreadString("); sb.Append(firstUnreadPage.ToString()); sb.Append("));\" onmouseout=\"htm();\">NEW</a>"); if (LastPage > 1) { sb.Append("<br><small>Page: </small>"); int gap1Start = numLinks; int gap1End = firstUnreadPage - midLinks; int gap2Start = firstUnreadPage + midLinks - 1; int gap2End = LastPage - numLinks + 1; bool hasGap1 = gap1Start < gap1End - 1; bool hasGap2 = gap2Start < gap2End - 1; int seq1End = hasGap1 ? gap1Start : (hasGap2 ? gap2Start : LastPage); int seq2End = hasGap2 ? gap2Start : LastPage; for (int i = 1; i <= seq1End; i++) { WritePageLink(i, sb, discussable, firstUnreadPage, this.JoinedThreadUsr.ViewCommentsInUse, this.TotalComments, GetThreadUrl, par); } if (hasGap1) { sb.Append("... "); for (int i = gap1End; i <= seq2End; i++) { WritePageLink(i, sb, discussable, firstUnreadPage, this.JoinedThreadUsr.ViewCommentsInUse, this.TotalComments, GetThreadUrl, par); } } if (hasGap2) { sb.Append("... "); for (int i = gap2End; i <= LastPage; i++) { WritePageLink(i, sb, discussable, firstUnreadPage, this.JoinedThreadUsr.ViewCommentsInUse, this.TotalComments, GetThreadUrl, par); } } } } else { if (firstUnreadPage == 0 && this.JoinedThreadUsr.ThreadK == this.K && this.JoinedThreadUsr.IsWatching && !this.JoinedThreadUsr.Status.Equals(ThreadUsr.StatusEnum.Archived) && !this.JoinedThreadUsr.Status.Equals(ThreadUsr.StatusEnum.UnArchived)) { sb.Append(" <a class=\"UnreadNew\" href=\""); sb.Append(GetThreadUrl(discussable, Cambro.Misc.Utility.Join(par, "k", this.K.ToString())) + "#Unread"); sb.Append("\" onmouseover=\"stt(UnreadNewString("); sb.Append(((int)this.JoinedThreadUsr.Status).ToString()); sb.Append(","); sb.Append(((int)this.JoinedThreadUsr.StatusChangeObjectType).ToString()); sb.Append("));\" onmouseout=\"htm();\">NEW</a>"); } int numLinks = 3; if (LastPage > 1) { sb.Append("<br><small>Page: </small>"); if (LastPage <= numLinks * 2) { for (int i = 1; i <= LastPage; i++) { WritePageLink(i, sb, discussable, firstUnreadPage, this.JoinedThreadUsr.ViewCommentsInUse, this.TotalComments, GetThreadUrl, par); } } else { for (int i = 1; i <= (numLinks); i++) { WritePageLink(i, sb, discussable, firstUnreadPage, this.JoinedThreadUsr.ViewCommentsInUse, this.TotalComments, GetThreadUrl, par); } sb.Append("... "); for (int i = LastPage - (numLinks) + 1; i <= LastPage; i++) { WritePageLink(i, sb, discussable, firstUnreadPage, this.JoinedThreadUsr.ViewCommentsInUse, this.TotalComments, GetThreadUrl, par); } } } } return sb.ToString(); }
private static void ThreadSendAlerts(Thread parentThread, List<int> alertedUsrs, Usr postingUsr, CommentAlertSet cas, IDiscussable parent) { #region Send alerts if (cas != null) { foreach (CommentAlert ca in cas) { try { if (!alertedUsrs.Contains(ca.UsrK) && postingUsr.K != ca.UsrK) { ThreadUsr tu = parentThread.GetThreadUsr(ca.Usr); tu.ChangeStatus(ThreadUsr.StatusEnum.NewWatchedForumAlert, parentThread.DateTime, false, false); tu.StatusChangeObjectK = ca.ParentObjectK; tu.StatusChangeObjectType = ca.ParentObjectType; tu.Update(null); Mailer usrMail = new Mailer(); usrMail.Subject = postingUsr.NickName + " posts: \"" + parentThread.SubjectSnip(40) + "\""; usrMail.Body += "<h1>" + postingUsr.NickName + " has posted a new topic</h1>"; usrMail.Body += "<p>The subject is: \"" + parentThread.Subject + "\"</p>"; usrMail.Body += "<p>To read and reply, check out the <a href=\"[LOGIN]\">topic page</a>.</p>"; string s = postingUsr.LinkEmail(); usrMail.Body += "<p>" + postingUsr.LinkEmail() + " posted it in the <a href=\"[LOGIN(" + ((IDiscussable)parent).UrlDiscussion() + ")]\">" + ((IName)parent).Name + " forum</a>.</p>"; if (ca.ParentObjectType.Equals(Model.Entities.ObjectType.Photo)) usrMail.Body += "<p>You're watching for comments posted on <a href=\"[LOGIN(" + ca.ParentPhoto.Url() + ")]\">this photo</a>.</p>"; else usrMail.Body += "<p>You're watching all new topics in the <a href=\"[LOGIN(" + ((IDiscussable)ca.ParentObject).UrlDiscussion() + ")]\">" + ((IName)ca.ParentObject).Name + " forum</a>. To stop receiving these emails, click the <i>Ignore new topics in this forum</i> button on the forum page.</p>"; usrMail.TemplateType = Mailer.TemplateTypes.AnotherSiteUser; usrMail.RedirectUrl = parentThread.UrlDiscussion(); usrMail.UsrRecipient = ca.Usr; usrMail.Bulk = true; usrMail.Inbox = true; usrMail.Send(); alertedUsrs.Add(ca.UsrK); } } catch (Exception ex) { Bobs.Global.Log("9a9f2ee1-41ea-4e2b-8187-caa75ddd1b8e - UsrK=" + postingUsr.K.ToString() + " ThreadK=" + parentThread.K.ToString(), ex); } } } #endregion }