Example #1
0
		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", "")
			};
		}
Example #2
0
		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;
		}
Example #3
0
		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();
				}
			}
		}
Example #4
0
		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;
		}
Example #5
0
		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;
		}
Example #6
0
		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;
		}
Example #7
0
		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());
		}
Example #8
0
		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 "";
		}
Example #9
0
		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);
			}
		}
Example #10
0
		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);

		}
Example #11
0
		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(" ");
		}
Example #12
0
		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();
		}
Example #13
0
		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
		}