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; } }
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"); } } }
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; } }
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; } }
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; }
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; }
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; }
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 { } } } } }
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; }