/// <summary> /// Handles the Delete event of the rGrid control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RowEventArgs"/> instance containing the event data.</param> protected void rGrid_Delete(object sender, RowEventArgs e) { var rockContext = new RockContext(); var pageService = new PageService(rockContext); var pageViewService = new PageViewService(rockContext); var siteService = new SiteService(rockContext); var page = pageService.Get(e.RowKeyId); if (page != null) { string errorMessage = string.Empty; if (!pageService.CanDelete(page, out errorMessage)) { mdDeleteWarning.Show(errorMessage, ModalAlertType.Alert); return; } foreach (var site in siteService.Queryable()) { if (site.DefaultPageId == page.Id) { site.DefaultPageId = null; site.DefaultPageRouteId = null; } if (site.LoginPageId == page.Id) { site.LoginPageId = null; site.LoginPageRouteId = null; } if (site.RegistrationPageId == page.Id) { site.RegistrationPageId = null; site.RegistrationPageRouteId = null; } } foreach (var pageView in pageViewService.GetByPageId(page.Id)) { pageView.Page = null; pageView.PageId = null; } pageService.Delete(page); rockContext.SaveChanges(); Rock.Web.Cache.PageCache.Flush(page.Id); if (_page != null) { _page.FlushChildPages(); } } BindGrid(); }
public PageViewServiceTest() { _mockLinkService = new Mock <ILinkService>(); _mockDownloadUtil = new Mock <IDownloadUtil>(); _mockStreamUtil = new Mock <IStreamUtil>(); _mockPrintService = new Mock <IPrintService>(); _pageViewService = new PageViewService(_mockLinkService.Object, _mockDownloadUtil.Object, _mockStreamUtil.Object, _mockPrintService.Object); }
protected void rGrid_Delete(object sender, RowEventArgs e) { var rockContext = new RockContext(); var pageService = new PageService(rockContext); var pageViewService = new PageViewService(rockContext); var siteService = new SiteService(rockContext); var page = pageService.Get((int)rGrid.DataKeys[e.RowIndex]["id"]); if (page != null) { string errorMessage = string.Empty; if (!pageService.CanDelete(page, out errorMessage)) { //errorMessage = "The page is the parent page of another page."; mdDeleteWarning.Show(errorMessage, ModalAlertType.Alert); return; } foreach (var site in siteService.Queryable()) { if (site.DefaultPageId == page.Id) { site.DefaultPageId = null; site.DefaultPageRouteId = null; } if (site.LoginPageId == page.Id) { site.LoginPageId = null; site.LoginPageRouteId = null; } if (site.RegistrationPageId == page.Id) { site.RegistrationPageId = null; site.RegistrationPageRouteId = null; } } // TODO: Could be thousands of page views. Can we set this up as cascade? foreach (var pageView in pageViewService.GetByPageId(page.Id)) { pageViewService.Delete(pageView); } pageService.Delete(page); rockContext.SaveChanges(); Rock.Web.Cache.PageCache.Flush(page.Id); if (_page != null) { _page.FlushChildPages(); } } BindGrid(); }
/// <summary> /// Handles the Delete event of the gPages control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param> protected void gPages_Delete(object sender, RowEventArgs e) { var rockContext = new RockContext(); PageService pageService = new PageService(rockContext); var pageViewService = new PageViewService(rockContext); var siteService = new SiteService(rockContext); Rock.Model.Page page = pageService.Get(new Guid(e.RowKeyValue.ToString())); if (page != null) { string errorMessage; if (!pageService.CanDelete(page, out errorMessage, includeSecondLvl: true)) { mdGridWarning.Show(errorMessage, ModalAlertType.Alert); return; } foreach (var site in siteService.Queryable()) { if (site.DefaultPageId == page.Id) { site.DefaultPageId = null; site.DefaultPageRouteId = null; } if (site.LoginPageId == page.Id) { site.LoginPageId = null; site.LoginPageRouteId = null; } if (site.RegistrationPageId == page.Id) { site.RegistrationPageId = null; site.RegistrationPageRouteId = null; } } foreach (var pageView in pageViewService.GetByPageId(page.Id)) { pageView.Page = null; pageView.PageId = null; } pageService.Delete(page); rockContext.SaveChanges(); PageCache.Flush(page.Id); } BindPagesGrid(); }
public int GetLastVisitOnSite(int personId, int siteId) { PageView mostRecentPageView = new PageViewService((Rock.Data.RockContext)Service.Context).Queryable() .Where(p => p.PersonAlias.PersonId == personId && p.SiteId == siteId) .OrderByDescending(p => p.DateTimeViewed) .FirstOrDefault(); if (mostRecentPageView != null && mostRecentPageView.DateTimeViewed.HasValue) { TimeSpan duration = RockDateTime.Now - mostRecentPageView.DateTimeViewed.Value; return(duration.Days); } return(-1); }
void ShowList() { var rockContext = new RockContext(); int sessionCount = Int32.Parse(GetAttributeValue("SessionCount")); int skipCount = pageNumber * sessionCount; var person = new PersonService(rockContext).GetByUrlEncodedKey(PageParameter("Person")); if (person != null) { lPersonName.Text = person.FullName; PageViewService pageviewService = new PageViewService(rockContext); var pageViews = pageviewService.Queryable(); var sessionInfo = pageviewService.Queryable() .Where(s => s.PersonAlias.PersonId == person.Id); if (startDate != DateTime.MinValue) { sessionInfo = sessionInfo.Where(s => s.DateTimeViewed > drpDateFilter.LowerValue); } if (endDate != DateTime.MaxValue) { sessionInfo = sessionInfo.Where(s => s.DateTimeViewed < drpDateFilter.UpperValue); } if (siteId != -1) { sessionInfo = sessionInfo.Where(p => p.SiteId == siteId); } var pageviewInfo = sessionInfo.GroupBy(s => new { s.SessionId, s.SiteId, SiteName = s.Site.Name, s.ClientType, s.IpAddress, s.UserAgent }) .Select(s => new WebSession { SessionId = s.Key.SessionId, StartDateTime = s.Min(x => x.DateTimeViewed), EndDateTime = s.Max(x => x.DateTimeViewed), SiteId = s.Key.SiteId, Site = s.Key.SiteName, ClientType = s.Key.ClientType, IpAddress = s.Key.IpAddress, UserAgent = s.Key.UserAgent, PageViews = pageViews.Where(p => p.SessionId == s.Key.SessionId && p.SiteId == s.Key.SiteId).ToList() }); pageviewInfo = pageviewInfo.OrderByDescending(p => p.StartDateTime) .Skip(skipCount) .Take(sessionCount + 1); rptSessions.DataSource = pageviewInfo.ToList().Take(sessionCount); rptSessions.DataBind(); // set next button if (pageviewInfo.Count() > sessionCount) { hlNext.Visible = hlNext.Enabled = true; Dictionary <string, string> queryStringNext = new Dictionary <string, string>(); queryStringNext.Add("Page", (pageNumber + 1).ToString()); queryStringNext.Add("Person", person.UrlEncodedKey); if (siteId != -1) { queryStringNext.Add("SiteId", siteId.ToString()); } if (startDate != DateTime.MinValue) { queryStringNext.Add("StartDate", startDate.ToShortDateString()); } if (endDate != DateTime.MaxValue) { queryStringNext.Add("EndDate", endDate.ToShortDateString()); } var pageReferenceNext = new Rock.Web.PageReference(CurrentPageReference.PageId, CurrentPageReference.RouteId, queryStringNext); hlNext.NavigateUrl = pageReferenceNext.BuildUrl(); } else { hlNext.Visible = hlNext.Enabled = false; } // set prev button if (pageNumber == 0) { hlPrev.Visible = hlPrev.Enabled = false; } else { hlPrev.Visible = hlPrev.Enabled = true; Dictionary <string, string> queryStringPrev = new Dictionary <string, string>(); queryStringPrev.Add("Page", (pageNumber - 1).ToString()); queryStringPrev.Add("Person", person.UrlEncodedKey); if (siteId != -1) { queryStringPrev.Add("SiteId", siteId.ToString()); } if (startDate != DateTime.MinValue) { queryStringPrev.Add("StartDate", startDate.ToShortDateString()); } if (endDate != DateTime.MaxValue) { queryStringPrev.Add("EndDate", endDate.ToShortDateString()); } var pageReferencePrev = new Rock.Web.PageReference(CurrentPageReference.PageId, CurrentPageReference.RouteId, queryStringPrev); hlPrev.NavigateUrl = pageReferencePrev.BuildUrl(); } } else { lMessages.Text = "<div class='alert alert-warning'>No person provided to show results for.</div>"; } }
/// <summary> /// Execute method to write transaction to the database. /// </summary> public void Execute() { using (var rockContext = new RockContext()) { PageViewService pageViewService = new PageViewService(rockContext); PageViewUserAgentService pageViewUserAgentService = new PageViewUserAgentService(rockContext); PageViewSessionService pageViewSessionService = new PageViewSessionService(rockContext); var userAgent = (this.UserAgent ?? string.Empty).Trim(); if (userAgent.Length > 450) { userAgent = userAgent.Substring(0, 450); // trim super long useragents to fit in pageViewUserAgent.UserAgent } // get user agent info var clientType = PageViewUserAgent.GetClientType(userAgent); Parser uaParser = Parser.GetDefault(); ClientInfo client = uaParser.Parse(userAgent); var clientOs = client.OS.ToString(); var clientBrowser = client.UserAgent.ToString(); // lookup the pageViewUserAgent, and create it if it doesn't exist var pageViewUserAgent = pageViewUserAgentService.Queryable().Where(a => a.UserAgent == userAgent).FirstOrDefault(); if (pageViewUserAgent == null) { pageViewUserAgent = new PageViewUserAgent(); pageViewUserAgent.UserAgent = userAgent; pageViewUserAgent.ClientType = clientType; pageViewUserAgent.OperatingSystem = clientOs; pageViewUserAgent.Browser = clientBrowser; pageViewUserAgentService.Add(pageViewUserAgent); rockContext.SaveChanges(); } else { // check if the user agent properties need to be updated if (clientType != pageViewUserAgent.ClientType || clientOs != pageViewUserAgent.OperatingSystem || clientBrowser != pageViewUserAgent.Browser) { pageViewUserAgent.ClientType = clientType; pageViewUserAgent.OperatingSystem = clientOs; pageViewUserAgent.Browser = clientBrowser; rockContext.SaveChanges(); } } // lookup PageViewSession, and create it if it doesn't exist Guid sessionId = this.SessionId.AsGuid(); int? pageViewSessionId = pageViewSessionService.Queryable().Where(a => a.PageViewUserAgentId == pageViewUserAgent.Id && a.SessionId == sessionId && a.IpAddress == this.IPAddress).Select(a => (int?)a.Id).FirstOrDefault(); if (!pageViewSessionId.HasValue) { var pageViewSession = new PageViewSession(); pageViewSession.PageViewUserAgentId = pageViewUserAgent.Id; pageViewSession.SessionId = sessionId; pageViewSession.IpAddress = this.IPAddress; pageViewSessionService.Add(pageViewSession); rockContext.SaveChanges(); pageViewSessionId = pageViewSession.Id; } PageView pageView = new PageView(); pageViewService.Add(pageView); // obfuscate rock magic token Regex rgx = new Regex(@"rckipid=([^&]*)"); string cleanUrl = rgx.Replace(this.Url, "rckipid=XXXXXXXXXXXXXXXXXXXXXXXXXXXX"); pageView.PageId = this.PageId; pageView.SiteId = this.SiteId; pageView.Url = cleanUrl.Left(500); pageView.DateTimeViewed = this.DateViewed; pageView.PersonAliasId = this.PersonAliasId; pageView.PageTitle = this.PageTitle.Left(500); pageView.PageViewSessionId = pageViewSessionId.Value; rockContext.SaveChanges(); } }
/// <summary> /// Handles the Click event of the btnDeleteConfirm control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void btnDeleteConfirm_Click(object sender, EventArgs e) { bool canDelete = false; var rockContext = new RockContext(); SiteService siteService = new SiteService(rockContext); Site site = siteService.Get(hfSiteId.Value.AsInteger()); LayoutService layoutService = new LayoutService(rockContext); PageService pageService = new PageService(rockContext); PageViewService pageViewService = new PageViewService(rockContext); if (site != null) { var sitePages = new List <int> { site.DefaultPageId ?? -1, site.LoginPageId ?? -1, site.RegistrationPageId ?? -1, site.PageNotFoundPageId ?? -1 }; foreach (var pageView in pageViewService .Queryable() .Where(t => t.Page != null && t.Page.Layout != null && t.Page.Layout.SiteId == site.Id)) { pageView.Page = null; pageView.PageId = null; } var pageQry = pageService.Queryable("Layout") .Where(t => t.Layout.SiteId == site.Id || sitePages.Contains(t.Id)); pageService.DeleteRange(pageQry); var layoutQry = layoutService.Queryable() .Where(l => l.SiteId == site.Id); layoutService.DeleteRange(layoutQry); rockContext.SaveChanges(true); string errorMessage; canDelete = siteService.CanDelete(site, out errorMessage, includeSecondLvl: true); if (!canDelete) { mdDeleteWarning.Show(errorMessage, ModalAlertType.Alert); return; } siteService.Delete(site); rockContext.SaveChanges(); SiteCache.Flush(site.Id); } NavigateToParentPage(); }
/// <summary> /// Execute method to write transaction to the database. /// </summary> public void Execute() { using (var rockContext = new RockContext()) { PageViewService pvService = new PageViewService(rockContext); PageView pageView = new PageView(); pvService.Add(pageView); pageView.PageId = this.PageId; pageView.SiteId = this.SiteId; pageView.SessionId = new Guid(this.SessionId); pageView.Url = this.Url; pageView.UserAgent = this.UserAgent; pageView.DateTimeViewed = this.DateViewed; pageView.IpAddress = this.IPAddress; pageView.PersonAliasId = this.PersonAliasId; pageView.PageTitle = this.PageTitle; string u = this.UserAgent; if (string.IsNullOrWhiteSpace(u)) { pageView.ClientType = "None"; } else { // determine client type // note this regex should be updated from http://detectmobilebrowsers.com/ occassionally // last update 2/22/2014 - JME bool clientDetected = false; // first test for mobile device Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline); Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline); if ((b.IsMatch(u) || (u.Length >= 4 && v.IsMatch(u.Substring(0, 4))))) { pageView.ClientType = "Mobile"; clientDetected = true; } // next test for tablet if (!clientDetected) { Regex t = new Regex(@"android|ipad|playbook|silk", RegexOptions.IgnoreCase | RegexOptions.Multiline); if (t.IsMatch(u)) { pageView.ClientType = "Tablet"; clientDetected = true; } } // let's now label bots/crawler if (!clientDetected) { Regex t = new Regex(@"bot|googlebot|crawler|spider|robot|crawling", RegexOptions.IgnoreCase | RegexOptions.Multiline); if (t.IsMatch(u)) { pageView.ClientType = "Crawler"; clientDetected = true; } } // finally set it to desktop if (!clientDetected) { pageView.ClientType = "Desktop"; } } rockContext.SaveChanges(); } }
/// <summary> /// Shows the active users. /// </summary> private void ShowActiveUsers() { int?siteId = GetAttributeValue("Site").AsIntegerOrNull(); if (!siteId.HasValue || SiteCache.Read(siteId.Value) == null) { lMessages.Text = "<div class='alert alert-warning'>No site is currently configured.</div>"; return; } else { int pageViewCount = GetAttributeValue("PageViewCount").AsIntegerOrNull() ?? 0; StringBuilder sbUsers = new StringBuilder(); var site = SiteCache.Read(siteId.Value); lSiteName.Text = "<h4>" + site.Name + "</h4>"; lSiteName.Visible = GetAttributeValue("ShowSiteNameAsTitle").AsBoolean(); if (!site.EnablePageViews) { lMessages.Text = "<div class='alert alert-warning'>Active " + site.Name + " users not available because page views are not enabled for site.</div>"; return; } lMessages.Text = string.Empty; string guestVisitorsStr = string.Empty; using (var rockContext = new RockContext()) { var qryPageViews = new PageViewService(rockContext).Queryable(); var qryPersonAlias = new PersonAliasService(rockContext).Queryable(); var pageViewQry = qryPageViews.Join( qryPersonAlias, pv => pv.PersonAliasId, pa => pa.Id, (pv, pa) => new { PersonAliasPersonId = pa.PersonId, pv.DateTimeViewed, pv.SiteId, pv.PageViewSessionId, PagePageTitle = pv.PageTitle }); var last24Hours = RockDateTime.Now.AddDays(-1); int pageViewTakeCount = pageViewCount; if (pageViewTakeCount == 0) { pageViewTakeCount = 1; } // Query to get who is logged in and last visit was to selected site var activeLogins = new UserLoginService(rockContext).Queryable() .Where(l => l.PersonId.HasValue && l.IsOnLine == true) .OrderByDescending(l => l.LastActivityDateTime) .Select(l => new { login = new { l.UserName, l.LastActivityDateTime, l.PersonId, Person = new { l.Person.NickName, l.Person.LastName, l.Person.SuffixValueId } }, pageViews = pageViewQry .Where(v => v.PersonAliasPersonId == l.PersonId) .Where(v => v.DateTimeViewed > last24Hours) .OrderByDescending(v => v.DateTimeViewed) .Take(pageViewTakeCount) }) .Select(a => new { a.login, pageViews = a.pageViews.ToList() }); if (CurrentUser != null) { activeLogins = activeLogins.Where(m => m.login.UserName != CurrentUser.UserName); } foreach (var activeLogin in activeLogins) { var login = activeLogin.login; if (!activeLogin.pageViews.Any() || activeLogin.pageViews.FirstOrDefault().SiteId != site.Id) { // only show active logins with PageViews and the most recent pageview is for the specified site continue; } var latestPageViewSessionId = activeLogin.pageViews.FirstOrDefault().PageViewSessionId; TimeSpan tsLastActivity = login.LastActivityDateTime.HasValue ? RockDateTime.Now.Subtract(login.LastActivityDateTime.Value) : TimeSpan.MaxValue; string className = tsLastActivity.Minutes <= 5 ? "recent" : "not-recent"; // create link to the person string personFullName = Person.FormatFullName(login.Person.NickName, login.Person.LastName, login.Person.SuffixValueId); string personLink = personFullName; if (GetAttributeValue("PersonProfilePage") != null) { string personProfilePage = GetAttributeValue("PersonProfilePage"); var pageParams = new Dictionary <string, string>(); pageParams.Add("PersonId", login.PersonId.ToString()); var pageReference = new Rock.Web.PageReference(personProfilePage, pageParams); personLink = string.Format(@"<a href='{0}'>{1}</a>", pageReference.BuildUrl(), personFullName); } // determine whether to show last page views if (GetAttributeValue("PageViewCount").AsInteger() > 0) { string activeLoginFormat = @" <li class='active-user {0}' data-toggle='tooltip' data-placement='top' title='{2}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; // define the formatting for each user entry if (activeLogin.pageViews != null) { string pageViewsHtml = activeLogin.pageViews .Where(v => v.PageViewSessionId == latestPageViewSessionId) .Select(v => HttpUtility.HtmlEncode(v.PagePageTitle)).ToList().AsDelimited("<br> "); sbUsers.Append(string.Format(activeLoginFormat, className, personLink, pageViewsHtml)); } } else { string inactiveLoginFormat = @" <li class='active-user {0}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; sbUsers.Append(string.Format(inactiveLoginFormat, className, personLink)); } } // get the 'show guests' attribute and if it's true, determine how many guests there are. bool showGuestVisitors = GetAttributeValue("ShowGuestVisitors").AsBoolean(); if (showGuestVisitors) { // build a list of unique sessions views in the past 15 minutes. // We'll only take entries with a null personAliasID, which means they're not logged in, // and thus ARE guests. var last5Minutes = RockDateTime.Now.AddMinutes(-5); var last15Minutes = RockDateTime.Now.AddMinutes(-15); var qryGuests = new PageViewService(rockContext).Queryable().AsNoTracking() .Where( p => p.SiteId == site.Id && p.DateTimeViewed > last15Minutes && p.PersonAliasId == null && p.PageViewSession.PageViewUserAgent.Browser != "Other" && p.PageViewSession.PageViewUserAgent.ClientType != "Crawler") .GroupBy(p => p.PageViewSessionId) .Select(g => new { SessionId = g.Key, LastVisit = g.Max(p => p.DateTimeViewed) }) .ToList(); var numRecentGuests = qryGuests.Where(g => g.LastVisit >= last5Minutes).Count(); var numInactiveGuests = qryGuests.Where(g => g.LastVisit < last5Minutes).Count(); // now build the formatted entry, which is "Current Guests (0) (1)" where the first is a green badge, and the second yellow. if (numRecentGuests > 0 || numInactiveGuests > 0) { guestVisitorsStr = "Current Guests:"; if (numRecentGuests > 0) { guestVisitorsStr += string.Format(" <span class=\"badge badge-success\">{0}</span>", numRecentGuests); } if (numInactiveGuests > 0) { guestVisitorsStr += string.Format(" <span class=\"badge badge-warning\">{0}</span>", numInactiveGuests); } } } } if (sbUsers.Length > 0) { lUsers.Text = string.Format(@"<ul class='activeusers fa-ul'>{0}</ul>", sbUsers.ToString()); lUsers.Text += string.Format(@"<p class='margin-l-sm'>{0}</p>", guestVisitorsStr); } else { lMessages.Text = string.Format("There are no logged in users on the {0} site.", site.Name); lMessages.Text += "<br /><br />" + guestVisitorsStr; } } }
/// <summary> /// Shows the active users. /// </summary> private void ShowActiveUsers() { int?siteId = GetAttributeValue("Site").AsIntegerOrNull(); if (!siteId.HasValue) { lMessages.Text = "<div class='alert alert-warning'>No site is currently configured.</div>"; return; } else { int pageViewCount = GetAttributeValue("PageViewCount").AsIntegerOrNull() ?? 0; StringBuilder sbUsers = new StringBuilder(); var site = SiteCache.Read(siteId.Value); lSiteName.Text = "<h4>" + site.Name + "</h4>"; lSiteName.Visible = GetAttributeValue("ShowSiteNameAsTitle").AsBoolean(); lMessages.Text = string.Empty; using (var rockContext = new RockContext()) { var qryPageViews = new PageViewService(rockContext).Queryable(); var qryPersonAlias = new PersonAliasService(rockContext).Queryable(); var pageViewQry = qryPageViews.Join( qryPersonAlias, pv => pv.PersonAliasId, pa => pa.Id, (pv, pa) => new { PersonAliasPersonId = pa.PersonId, pv.DateTimeViewed, pv.SiteId, pv.SessionId, PagePageTitle = pv.Page.PageTitle }); var last24Hours = RockDateTime.Now.AddDays(-1); int pageViewTakeCount = pageViewCount; if (pageViewTakeCount == 0) { pageViewTakeCount = 1; } // Query to get who is logged in and last visit was to selected site var activeLogins = new UserLoginService(rockContext).Queryable("Person") .Where(l => l.PersonId.HasValue && l.IsOnLine == true) .OrderByDescending(l => l.LastActivityDateTime) .Select(l => new { login = l, pageViews = pageViewQry .Where(v => v.PersonAliasPersonId == l.PersonId) .Where(v => v.DateTimeViewed > last24Hours) .OrderByDescending(v => v.DateTimeViewed) .Take(pageViewTakeCount) }) .Where(a => a.pageViews.Any() && a.pageViews.FirstOrDefault().SiteId == site.Id) .Select(a => new { a.login, pageViews = a.pageViews, LatestSessionId = a.pageViews.FirstOrDefault().SessionId }); if (CurrentUser != null) { activeLogins = activeLogins.Where(m => m.login.UserName != CurrentUser.UserName); } foreach (var activeLogin in activeLogins) { var login = activeLogin.login; Guid?latestSession = activeLogin.LatestSessionId; TimeSpan tsLastActivity = login.LastActivityDateTime.HasValue ? RockDateTime.Now.Subtract(login.LastActivityDateTime.Value) : TimeSpan.MaxValue; string className = tsLastActivity.Minutes <= 5 ? "recent" : "not-recent"; // create link to the person string personLink = login.Person.FullName; if (GetAttributeValue("PersonProfilePage") != null) { string personProfilePage = GetAttributeValue("PersonProfilePage"); var pageParams = new Dictionary <string, string>(); pageParams.Add("PersonId", login.Person.Id.ToString()); var pageReference = new Rock.Web.PageReference(personProfilePage, pageParams); personLink = string.Format(@"<a href='{0}'>{1}</a>", pageReference.BuildUrl(), login.Person.FullName); } // determine whether to show last page views if (GetAttributeValue("PageViewCount").AsInteger() > 0) { string format = @" <li class='active-user {0}' data-toggle='tooltip' data-placement='top' title='{2}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; if (activeLogin.pageViews != null) { var pageViews = activeLogin.pageViews.ToList(); string pageViewsHtml = activeLogin.pageViews.ToList() .Where(v => v.SessionId == latestSession) .Select(v => HttpUtility.HtmlEncode(v.PagePageTitle)).ToList().AsDelimited("<br> "); sbUsers.Append(string.Format(format, className, personLink, pageViewsHtml)); } } else { string format = @" <li class='active-user {0}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; sbUsers.Append(string.Format(format, className, personLink)); } } } if (sbUsers.Length > 0) { lUsers.Text = string.Format(@"<ul class='activeusers fa-ul'>{0}</ul>", sbUsers.ToString()); } else { lMessages.Text = string.Format("There are no logged in users on the {0} site.", site.Name); } } }