コード例 #1
0
ファイル: Rooms.ascx.cs プロジェクト: davelondon/dontstayin
		protected void Page_Load(object sender, EventArgs e)
		{
			Usr.KickUserIfNotLoggedIn();

			Testing.Visible = (Usr.Current != null && Usr.Current.IsAdmin) || ContainerPage.Url["System"].Exists;

			Query q = new Query();
			if (!Vars.DevEnv)
				q.CacheDuration = TimeSpan.FromMinutes(5);
			q.QueryCondition = new Q(RoomPin.Columns.Pinned, true);
			//q.QueryCondition = new Q(RoomPin.Columns.Pinned, true);
			q.GroupBy = new GroupBy(RoomPin.Columns.RoomGuid);
			q.ExtraSelectElements.Add("count", "COUNT(*)");
			q.OrderBy = new OrderBy("COUNT(*) DESC");
			q.TopRecords = 100;
			q.TableElement = new Join(RoomPin.Columns.UsrK, Usr.Columns.K);
			q.Columns = new ColumnSet(RoomPin.Columns.RoomGuid);
			RoomPinSet rps = new RoomPinSet(q);
			StringBuilder sb = new StringBuilder();
			int count = 1;
			foreach (RoomPin rp in rps)
			{
				Bobs.Chat.RoomSpec spec = Bobs.Chat.RoomSpec.FromGuid(rp.RoomGuid);
				if (spec != null && spec.RoomType == RoomType.Normal && !spec.IsDefaultRoom && spec.CheckPermission(Usr.Current, false))
				{
					sb.Append("<p class=\"CleanLinks\">");
					spec.LinkHtmlAppend(sb);
					sb.Append("<small> - ");
					int pins = ((int)rp.ExtraSelectElements["count"]); 
					sb.Append(pins.ToString("#,##0"));
					sb.Append(" pin");
					if (pins != 1)
						sb.Append("s");
					sb.Append("</small>");
					sb.Append("</p>");
					count++;
				}
				if (count > 20)
					break;
			}
			PopularRooms.Controls.Add(new LiteralControl(sb.ToString()));

			if (!Page.IsPostBack)
			{
				PopupAminationsOff.Checked = Prefs.Current["ChatClientAnimatePopups"].Exists && Prefs.Current["ChatClientAnimatePopups"] == 0;
				PopupAminationsOn.Checked = !PopupAminationsOff.Checked;
			}
		}
コード例 #2
0
ファイル: Program.cs プロジェクト: davelondon/dontstayin
		static void Main(string[] args)
		{
			Query onlineUsrsQuery = new Query();
			onlineUsrsQuery.Columns = new ColumnSet(Usr.Columns.K);
			onlineUsrsQuery.QueryCondition = new Q(Usr.Columns.DateTimeLastPageRequest, QueryOperator.GreaterThan, DateTime.Now.AddMinutes(-5));
			UsrSet us = new UsrSet(onlineUsrsQuery);


			foreach (Usr u in us)
			{
				try
				{
					
					string ticks = Caching.Instances.Main.Get(Chat.GetStateDirtyKey(u.K).ToString()) as string;
					if (ticks != null && ticks.Length > 1)
					{
						DateTime dtLastDirty = new DateTime(long.Parse(ticks));
						if (dtLastDirty > DateTime.Now.AddDays(-1) && dtLastDirty < DateTime.Now.AddSeconds(Vars.DevEnv ? -5 : -30))
						{
							Query q = new Query();
							q.QueryCondition = new Q(RoomPin.Columns.UsrK, u.K);
							q.Columns = new ColumnSet(RoomPin.Columns.RoomGuid, RoomPin.Columns.StateStub, RoomPin.Columns.UsrK);
							RoomPinSet rps = new RoomPinSet(q);
							StateStub[] statesArray = Chat.GetStateFromCache(rps.ToList().ConvertAll(rp => rp.RoomGuid).ToArray(), u.K, Guid.Empty);
							Dictionary<Guid, StateStub> states = new Dictionary<Guid, StateStub>();
							
							if (statesArray != null)
							{
								foreach (StateStub state in statesArray)
								{
									Guid g = state.guid.UnPackGuid();
									if (!states.ContainsKey(g))
										states.Add(g, state);
								}
							}

							foreach (RoomPin rp in rps)
							{
								if (states.ContainsKey(rp.RoomGuid))
								{
									rp.StateStub = Chat.SerializeStateStub(states[rp.RoomGuid]);
									rp.Update();
								}
							}

							Caching.Instances.Main.Set(Chat.GetStateDirtyKey(u.K).ToString(), "0");

							Console.Write(".");
						}
						else
							Console.Write("-");
					}
					else
						Console.Write("/");
				}
				catch(Exception ex)
				{
					Console.Write("X");
				}
			}
		}
コード例 #3
0
ファイル: Chat.cs プロジェクト: davelondon/dontstayin
		public static StateStub[] GetStateFromCacheOrDatabase(Guid[] roomGuids, int usrK, Guid dsiGuid, RoomPinSet roomPinSet)
		{
			try
			{
				Dictionary<Guid, RoomPin> roomPins = new Dictionary<Guid, RoomPin>();
				if (roomPinSet != null) roomPinSet.ToList().ForEach((rp) => { if (!roomPins.ContainsKey(rp.RoomGuid)) roomPins.Add(rp.RoomGuid, rp); });

				string[] serializedStatesFromCache = null;
				if (usrK > 0)
					serializedStatesFromCache = Caching.Instances.Main.MultiGet<string>(roomGuids.ConvertAll(g => Chat.GetRoomStateCacheHolderKey(usrK, g).ToString()));
				else
					serializedStatesFromCache = Caching.Instances.Main.MultiGet<string>(roomGuids.ConvertAll(g => Chat.GetRoomStateCacheHolderKey(dsiGuid, g).ToString()));

				if (serializedStatesFromCache.Length == 0)
					return null;

				Dictionary<Guid, StateStub> states = new Dictionary<Guid, StateStub>();
				foreach (string serializedState in serializedStatesFromCache)
				{
					if (serializedState != null && serializedState.Length > 0)
					{
						try
						{
							StateStub s = deSerializeStateStub(serializedState);
							if (s != null && s.guid.Length > 0)
								states.Add(s.guid.UnPackGuid(), s);
						}
						catch { }
					}
				}

				if (roomPins.Count > 0)
				{
					foreach (Guid g in roomGuids)
					{
						if (!states.ContainsKey(g) && roomPins.ContainsKey(g) && roomPins[g].StateStub != null && roomPins[g].StateStub.Length > 0)
						{
							try
							{
								StateStub ss = Chat.deSerializeStateStub(roomPins[g].StateStub);
								if (ss != null && ss.guid.Length > 0)
									states.Add(g, ss);
							}
							catch { }
						}
					}
				}

				if (states.Count == 0)
					return null;
				else
				{
					StateStub[] ssArray = new StateStub[states.Count];
					states.Values.CopyTo(ssArray, 0);
					return ssArray;
				}
			}
			catch
			{
				return null;
			}
		}
コード例 #4
0
ファイル: Program.cs プロジェクト: davelondon/dontstayin
		public static void SendNow(ChatMessage c, Random r)
		{
			try
			{
				Query q = new Query();
				q.QueryCondition = new Q(RoomPin.Columns.Pinned, true);
				RoomPinSet rps = new RoomPinSet(q);

				Guid roomGuid;
				int rand = r.Next(10);
				if (rand == 1)
					roomGuid = new Chat.RoomSpec(RoomType.RandomChat, Model.Entities.ObjectType.None, 0, Model.Entities.ObjectType.None, 0).Guid;
				else if (rand == 2)
					roomGuid = new Chat.RoomSpec(RoomType.Normal, Model.Entities.ObjectType.None, 0, Model.Entities.ObjectType.None, 0).Guid;
				else
					roomGuid = rps[r.Next(rps.Count)].RoomGuid;


				string chatRoomName = roomGuid.ToString();
				try
				{
					Chat.RoomSpec c1 = Chat.RoomSpec.FromGuid(roomGuid);
					if (c1.GetName().Length > 0)
						chatRoomName = c1.GetName();
					else
						chatRoomName = c1.RoomType.ToString();

					if (c1.RoomType != RoomType.Normal &&
						c1.RoomType != RoomType.PrivateChat)
						return;

				}
				catch { }


				MessageStub m = new MessageStub(
					Guid.NewGuid().Pack(),
					ItemType.PublicChatMessage,
					DateTime.Now.Ticks.ToString(),
					roomGuid.Pack(),
					c.FromUsr.NickName,
					c.FromUsr.StmuParams,
					c.FromUsr.K,
					c.FromUsr.HasPic ? c.FromUsr.Pic.ToString() : "0",
					c.FromUsr.HasChatPic ? c.FromUsr.ChatPic.Value.ToString() : "0",
					c.Text + " (" + chatRoomName + ")",
					"");

				Chat.SendJsonChatItem(m, c.FromUsr.K);
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.ToString());
				throw ex;
			}
		}
コード例 #5
0
ファイル: Service.asmx.cs プロジェクト: davelondon/dontstayin
		int GetMaximumRoomPinListOrder(Usr u)
		{
			Query q = new Query();
			q.TopRecords = 1;
			q.QueryCondition = new And(new Q(RoomPin.Columns.UsrK, u.K), new Q(RoomPin.Columns.Pinned, true));
			q.OrderBy = new OrderBy(RoomPin.Columns.ListOrder, OrderBy.OrderDirection.Descending);
			RoomPinSet rps = new RoomPinSet(q);
			if (rps.Count > 0)
				return rps[0].ListOrder > Spotted.Controls.ChatClient.MaximumDefaultRoomListOrder ? rps[0].ListOrder : Spotted.Controls.ChatClient.MaximumDefaultRoomListOrder;
			else
				return Spotted.Controls.ChatClient.MaximumDefaultRoomListOrder;
		}
コード例 #6
0
ファイル: Service.asmx.cs プロジェクト: davelondon/dontstayin
		public GetStateStub ResetSessionAndGetState(bool isFirstRequest, string lastItemGuidString, int sessionID, string lastActionTicks, string pageUrl, StateStub[] roomState)
		{
			WaitIfDevEnv();

			int usrK = Chat.GetUsrKWithoutTouchingDatabase();
			Guid dsiGuid = usrK == 0 ? Guid.Empty : Chat.GetDsiGuidWithoutTouchingDatabase();


			RoomPinSet rps = null;

			string newLastActionTicks = "";
			if (usrK > 0 && Usr.Current != null)
			{
				newLastActionTicks = resetLastActionAndSessionID(sessionID);

				Query q = new Query();
				q.QueryCondition = new Q(RoomPin.Columns.UsrK, usrK);
				q.Columns = new ColumnSet(RoomPin.Columns.RoomGuid, RoomPin.Columns.StateStub);
				rps = new RoomPinSet(q);
			}
			else
				newLastActionTicks = DateTime.Now.Ticks.ToString();

			GetStateStub gs = new GetStateStub();
			gs.roomState = Chat.GetStateFromCacheOrDatabase(roomState.ConvertAll(s => s.guid.UnPackGuid()).ToArray<Guid>(), usrK, dsiGuid, rps);

			RefreshStub r = refreshPrivate(isFirstRequest, lastItemGuidString, sessionID, newLastActionTicks, pageUrl, usrK, null);
			gs.guestRefreshStubs = r.guestRefreshStubs;
			gs.itemsJson = r.itemsJson;
			gs.lastActionTicks = r.lastActionTicks;
			gs.lastItemGuidReturned = r.lastItemGuidReturned;
			return gs;
			
		}
コード例 #7
0
		Dictionary<Guid, StateStub> getState(Dictionary<Guid, RoomStub> rooms, List<Guid> guestRooms, RoomPinSet roomPinSet)
		{
			List<Guid> allRooms = new List<Guid>();
			foreach (Guid g in rooms.Keys)
			{
				if (rooms[g].pinned)
					allRooms.Add(g);
			}
			foreach (Guid guest in guestRooms)
			{
				if (!allRooms.Contains(guest))
					allRooms.Add(guest);
			}
			//remove un-pinned non-guests...

			int usrK = Usr.Current == null ? 0 : Usr.Current.K;
			//Guid dsiGuid = usrK == 0 ? Guid.Empty : Chat.GetDsiGuidWithoutTouchingDatabase();
			Guid dsiGuid = usrK > 0 ? Guid.Empty : Chat.GetDsiGuidWithoutTouchingDatabase();

			StateStub[] stateFromCache = Chat.GetStateFromCacheOrDatabase(allRooms.ToArray(), usrK, dsiGuid, roomPinSet);
			Dictionary<Guid, StateStub> stateStubs = new Dictionary<Guid, StateStub>();
			if (stateFromCache != null)
			{
				foreach (StateStub stateStub in stateFromCache)
				{
					Guid g = stateStub.guid.UnPackGuid();
					if (!stateStubs.ContainsKey(g))
						stateStubs.Add(g, stateStub);
				}
			}
			return stateStubs;
		}
コード例 #8
0
		void ensureAllRoomsAreInDatabase(Dictionary<Guid, RoomStub> rooms, List<Guid> roomsOrder, RoomPinSet roomPinSet)
		{
			if (Usr.Current != null)
			{
				Dictionary<Guid, RoomPin> roomPins = new Dictionary<Guid, RoomPin>();
				if (roomPinSet != null) roomPinSet.ToList().ForEach((rp) => { if (!roomPins.ContainsKey(rp.RoomGuid)) roomPins.Add(rp.RoomGuid, rp); });

				foreach (Guid g in roomsOrder)
				{
					if (!roomPins.ContainsKey(g))
					{
						try
						{
							Chat.RoomSpec spec = Chat.RoomSpec.FromGuid(g);
							RoomPin rp = new RoomPin();
							rp.DateTime = DateTime.Now;
							rp.ListOrder = rooms[g].listOrder;
							rp.Pinned = rooms[g].pinned;
							rp.RoomGuid = g;
							rp.Starred = rooms[g].starred;
							rp.UsrK = Usr.Current.K;
							rp.Update();
						}
						catch { }
					}
				}
			}
		}
コード例 #9
0
		RoomPinSet getPinnedRooms(Dictionary<Guid, RoomStub> rooms, List<Guid> roomsOrder)
		{
			if (Usr.Current != null)
			{
				#region Get pinned rooms from the RoomPin table
				Query q = new Query();
				q.QueryCondition = new Q(RoomPin.Columns.UsrK, Usr.Current.K);
				q.OrderBy = new OrderBy(RoomPin.Columns.ListOrder);
				RoomPinSet rps = new RoomPinSet(q);
				foreach (RoomPin rp in rps)
				{
					Chat.RoomSpec spec = Chat.RoomSpec.FromGuid(rp.RoomGuid);
					if (spec != null)
					{
						try
						{
							rooms.Add(rp.RoomGuid, getRoomStub(rp.RoomGuid, spec.GetName(Usr.Current), spec.GetUrl(Usr.Current), spec.IsPinnable, false, spec.IsReadOnly, rp.Pinned, spec.IsPhotoChatRoom, spec.IsPrivateChatRoom, spec.IsNewPhotoAlertsRoom, spec.GetPrivateChatRoomPresence(Usr.Current), spec.Icon, rp.Starred.GetValueOrDefault(spec.IsStarredByDefault), rp.ListOrder, spec.IsStarredByDefault, spec.IsStarrable, spec.HasArchive, spec.HiddenFromRoomList, spec.IsStreamRoom));
							roomsOrder.Add(rp.RoomGuid);
						}
						catch { }
					}
				}
				return rps;
				#endregion
			}
			else
				return null;
		}