/// <summary> /// Get data graphic activity by week. /// </summary> /// <param name="year"></param> /// <param name="month"></param> public void getActivityByWeek(int year, int month) { //https://www.codeproject.com/Questions/1276907/Get-every-weeks-start-and-end-date-from-series-end //usage: DateTime StartDate = new DateTime(year, month, 1, 0, 0, 0); DateTime SeriesEndDate = new DateTime(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59); //find first monday DateTime firstMonday = Enumerable.Range(0, 7) .SkipWhile(x => StartDate.AddDays(x).DayOfWeek != DayOfWeek.Monday) .Select(x => StartDate.AddDays(x)) .First(); //get count of days TimeSpan ts = (TimeSpan)(SeriesEndDate - firstMonday); //create new list of WeekStartEnd class List <WeekStartEnd> datesPeriodes = new List <WeekStartEnd>(); //add dates to list for (int i = 0; i < ts.Days; i += 7) { datesPeriodes.Add(new WeekStartEnd() { Monday = firstMonday.AddDays(i), Sunday = firstMonday.AddDays(i + 6).AddHours(23).AddMinutes(59).AddSeconds(59) }); } // Source activty by month JObject activityByWeek1 = new JObject(); JObject activityByWeek2 = new JObject(); JObject activityByWeek3 = new JObject(); JObject activityByWeek4 = new JObject(); JObject activityByWeek5 = new JObject(); JArray activityByWeek = new JArray(); SeriesCollection activityByWeekSeries = new SeriesCollection(); if (isMonthSources) { // Insert sources for (int iSource = 0; iSource < listSources.Count; iSource++) { activityByWeek1.Add((string)listSources[iSource], 0); activityByWeek2.Add((string)listSources[iSource], 0); activityByWeek3.Add((string)listSources[iSource], 0); activityByWeek4.Add((string)listSources[iSource], 0); activityByWeek5.Add((string)listSources[iSource], 0); } activityByWeek.Add(activityByWeek1); activityByWeek.Add(activityByWeek2); activityByWeek.Add(activityByWeek3); activityByWeek.Add(activityByWeek4); activityByWeek.Add(activityByWeek5); List <GameActivityClass> listGameActivities = GameActivityDatabases.GetListGameActivity(); for (int iGame = 0; iGame < listGameActivities.Count; iGame++) { List <Activity> gameActivities = listGameActivities[iGame].Activities; for (int iActivity = 0; iActivity < gameActivities.Count; iActivity++) { long elapsedSeconds = gameActivities[iActivity].ElapsedSeconds; DateTime dateSession = Convert.ToDateTime(gameActivities[iActivity].DateSession).AddSeconds(-elapsedSeconds).ToLocalTime(); string sourceName = gameActivities[iActivity].SourceName; // Cumul data for (int iWeek = 0; iWeek < datesPeriodes.Count; iWeek++) { if (datesPeriodes[iWeek].Monday <= dateSession && dateSession <= datesPeriodes[iWeek].Sunday) { activityByWeek[iWeek][sourceName] = (long)activityByWeek[iWeek][sourceName] + elapsedSeconds; } } } } // Check source with data (only view this) JArray listNoDelete = new JArray(); for (int i = 0; i < activityByWeek.Count; i++) { foreach (var item in (JObject)activityByWeek[i]) { if ((long)item.Value != 0 && listNoDelete.TakeWhile(x => x.ToString() == item.Key).Count() != 1) { listNoDelete.Add(item.Key); } } } listNoDelete = JArray.FromObject(listNoDelete.Distinct().ToArray()); // Prepare data. string[] labels = new string[listNoDelete.Count]; for (int iSource = 0; iSource < listNoDelete.Count; iSource++) { labels[iSource] = (string)listNoDelete[iSource]; if (settings.showLauncherIcons) { labels[iSource] = TransformIcon.Get((string)listNoDelete[iSource]); } IChartValues Values = new ChartValues <CustomerForTime>() { new CustomerForTime { Name = (string)listNoDelete[iSource], Values = (int)activityByWeek[0][(string)listNoDelete[iSource]] }, new CustomerForTime { Name = (string)listNoDelete[iSource], Values = (int)activityByWeek[1][(string)listNoDelete[iSource]] }, new CustomerForTime { Name = (string)listNoDelete[iSource], Values = (int)activityByWeek[2][(string)listNoDelete[iSource]] }, new CustomerForTime { Name = (string)listNoDelete[iSource], Values = (int)activityByWeek[3][(string)listNoDelete[iSource]] } }; if (datesPeriodes.Count == 5) { Values.Add(new CustomerForTime { Name = (string)listNoDelete[iSource], Values = (int)activityByWeek[4][(string)listNoDelete[iSource]] }); } activityByWeekSeries.Add(new StackedColumnSeries { Title = labels[iSource], Values = Values, StackMode = StackMode.Values, DataLabels = false }); } } // Set data in graphics. string[] activityByWeekLabels = new[] { resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[0].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[1].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[2].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[3].Monday) }; if (datesPeriodes.Count == 5) { activityByWeekLabels = new[] { resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[0].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[1].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[2].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[3].Monday), resources.GetString("LOCGameActivityWeekLabel") + " " + Tools.WeekOfYearISO8601(datesPeriodes[4].Monday) }; } //let create a mapper so LiveCharts know how to plot our CustomerViewModel class var customerVmMapper = Mappers.Xy <CustomerForTime>() .X((value, index) => index) .Y(value => value.Values); //lets save the mapper globally Charting.For <CustomerForTime>(customerVmMapper); Func <double, string> activityForGameLogFormatter = value => (string)converter.Convert((long)value, null, null, CultureInfo.CurrentCulture); acwLabelsY.LabelFormatter = activityForGameLogFormatter; acwSeries.Series = activityByWeekSeries; acwLabelsY.MinValue = 0; ((CustomerToolTipForMultipleTime)acwSeries.DataTooltip).ShowIcon = settings.showLauncherIcons; acwLabelsX.Labels = activityByWeekLabels; }
/// <summary> /// Get list games with an activities. /// </summary> public void getActivityByListGame() { activityListByGame = new List <listGame>(); List <GameActivityClass> listGameActivities = GameActivityDatabases.GetListGameActivity(); string gameID = ""; for (int iGame = 0; iGame < listGameActivities.Count; iGame++) { try { gameID = listGameActivities[iGame].GameID.ToString(); string gameTitle = listGameActivities[iGame].GameName; string gameIcon; Activity lastSessionActivity = listGameActivities[iGame].GetLastSessionActivity(); long elapsedSeconds = lastSessionActivity.ElapsedSeconds; DateTime dateSession = Convert.ToDateTime(lastSessionActivity.DateSession).AddSeconds(-elapsedSeconds).ToLocalTime(); BitmapImage iconImage = new BitmapImage(); if (String.IsNullOrEmpty(listGameActivities[iGame].GameIcon) == false) { iconImage.BeginInit(); gameIcon = dbPlaynite.GetFullFilePath(listGameActivities[iGame].GameIcon); iconImage.UriSource = new Uri(gameIcon, UriKind.RelativeOrAbsolute); iconImage.EndInit(); } activityListByGame.Add(new listGame() { listGameID = gameID, listGameTitle = gameTitle, listGameIcon = iconImage, listGameLastActivity = dateSession, listGameElapsedSeconds = elapsedSeconds, avgCPU = listGameActivities[iGame].avgCPU(listGameActivities[iGame].GetLastSession()) + "%", avgGPU = listGameActivities[iGame].avgGPU(listGameActivities[iGame].GetLastSession()) + "%", avgRAM = listGameActivities[iGame].avgRAM(listGameActivities[iGame].GetLastSession()) + "%", avgFPS = listGameActivities[iGame].avgFPS(listGameActivities[iGame].GetLastSession()) + "", avgCPUT = listGameActivities[iGame].avgCPUT(listGameActivities[iGame].GetLastSession()) + "°", avgGPUT = listGameActivities[iGame].avgGPUT(listGameActivities[iGame].GetLastSession()) + "°", enableWarm = settings.EnableWarning, maxCPUT = "" + settings.MaxCpuTemp, maxGPUT = "" + settings.MaxGpuTemp, minFPS = "" + settings.MinFps, maxCPU = "" + settings.MaxCpuUsage, maxGPU = "" + settings.MaxGpuUsage, maxRAM = "" + settings.MaxRamUsage }); iconImage = null; } catch (Exception ex) { Common.LogError(ex, "GameActivity", $"Failed to load listGameActivities from {gameID}"); PlayniteApi.Dialogs.ShowErrorMessage($"Failed to load listGameActivities from {gameID}.", "GameActivity error"); } } lvGames.ItemsSource = activityListByGame; // Sorting try { var columnBinding = _lastHeaderClicked.Column.DisplayMemberBinding as Binding; var sortBy = columnBinding?.Path.Path ?? _lastHeaderClicked.Column.Header as string; // Specific sort with another column if (_lastHeaderClicked.Name == "lvElapsedSecondsFormat") { columnBinding = lvElapsedSeconds.Column.DisplayMemberBinding as Binding; sortBy = columnBinding?.Path.Path ?? _lastHeaderClicked.Column.Header as string; } Sort(sortBy, _lastDirection); } // If first view catch { CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvGames.ItemsSource); view.SortDescriptions.Add(new SortDescription("listGameLastActivity", ListSortDirection.Descending)); } }
/// <summary> /// Get data graphic activity by month with time by source or by genre. /// </summary> /// <param name="year"></param> /// <param name="month"></param> public void getActivityByMonth(int year, int month) { DateTime startOfMonth = new DateTime(year, month, 1, 0, 0, 0); DateTime endOfMonth = new DateTime(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59); JObject activityByMonth = new JObject(); // Total hours by source. if (isMonthSources) { List <GameActivityClass> listGameActivities = GameActivityDatabases.GetListGameActivity(); for (int iGame = 0; iGame < listGameActivities.Count; iGame++) { try { List <Activity> gameActivities = listGameActivities[iGame].Activities; for (int iActivity = 0; iActivity < gameActivities.Count; iActivity++) { long elapsedSeconds = gameActivities[iActivity].ElapsedSeconds; DateTime dateSession = Convert.ToDateTime(gameActivities[iActivity].DateSession).AddSeconds(-elapsedSeconds).ToLocalTime(); string sourceName = gameActivities[iActivity].SourceName; // Cumul data if (activityByMonth[sourceName] != null) { if (startOfMonth <= dateSession && dateSession <= endOfMonth) { activityByMonth[sourceName] = (long)activityByMonth[sourceName] + elapsedSeconds; } } else { if (startOfMonth <= dateSession && dateSession <= endOfMonth) { activityByMonth.Add(new JProperty(sourceName, elapsedSeconds)); } } } } catch (Exception ex) { Common.LogError(ex, "GameActivity", $"Error in getActivityByMonth({year}, {month}) with {listGameActivities[iGame].GameName}"); } } gridMonth.Width = 605; acwSeries.Visibility = Visibility.Visible; acwLabel.Visibility = Visibility.Visible; } // Total hours by genres. else { List <GameActivityClass> listGameActivities = GameActivityDatabases.GetListGameActivity(); for (int iGame = 0; iGame < listGameActivities.Count; iGame++) { try { List <Genre> listGameListGenres = listGameActivities[iGame].Genres; List <Activity> gameActivities = listGameActivities[iGame].Activities; for (int iActivity = 0; iActivity < gameActivities.Count; iActivity++) { long elapsedSeconds = gameActivities[iActivity].ElapsedSeconds; DateTime dateSession = Convert.ToDateTime(gameActivities[iActivity].DateSession).AddSeconds(-elapsedSeconds).ToLocalTime(); for (int iGenre = 0; iGenre < listGameListGenres.Count; iGenre++) { // Cumul data if (activityByMonth[listGameListGenres[iGenre].Name] != null) { if (startOfMonth <= dateSession && dateSession <= endOfMonth) { activityByMonth[listGameListGenres[iGenre].Name] = (long)activityByMonth[listGameListGenres[iGenre].Name] + elapsedSeconds; } } else { if (startOfMonth <= dateSession && dateSession <= endOfMonth) { activityByMonth.Add(new JProperty(listGameListGenres[iGenre].Name, elapsedSeconds)); } } } } } catch (Exception ex) { Common.LogError(ex, "GameActivity", $"Error in getActivityByMonth({year}, {month}) with {listGameActivities[iGame].GameName}"); } } gridMonth.Width = 1223; acwSeries.Visibility = Visibility.Hidden; acwLabel.Visibility = Visibility.Hidden; } // Set data in graphic. ChartValues <CustomerForTime> series = new ChartValues <CustomerForTime>(); string[] labels = new string[activityByMonth.Count]; int compteur = 0; foreach (var item in activityByMonth) { series.Add(new CustomerForTime { Name = item.Key, Values = (long)item.Value, }); labels[compteur] = item.Key; if (settings.showLauncherIcons) { labels[compteur] = TransformIcon.Get(labels[compteur]); } compteur = compteur + 1; } SeriesCollection ActivityByMonthSeries = new SeriesCollection { new ColumnSeries { Title = "", Values = series } }; string[] ActivityByMonthLabels = labels; //let create a mapper so LiveCharts know how to plot our CustomerViewModel class var customerVmMapper = Mappers.Xy <CustomerForTime>() .X((value, index) => index) .Y(value => value.Values); //lets save the mapper globally Charting.For <CustomerForTime>(customerVmMapper); Func <double, string> activityForGameLogFormatter = value => (string)converter.Convert((long)value, null, null, CultureInfo.CurrentCulture); acmLabelsY.LabelFormatter = activityForGameLogFormatter; acmSeries.Series = ActivityByMonthSeries; acmLabelsY.MinValue = 0; ((CustomerToolTipForTime)acmSeries.DataTooltip).ShowIcon = settings.showLauncherIcons; acmLabelsX.Labels = ActivityByMonthLabels; }