/// <summary> /// Get data for the selected game. /// </summary> /// <param name="gameID"></param> /// <param name="variateur"></param> public void getActivityForGamesTimeGraphics(string gameID) { gameSeriesContener.Children.Clear(); GameActivityClass gameActivity = GameActivityDatabases.Get(Guid.Parse(gameID)); List <Activity> gameActivities = gameActivity.Activities; var graph = new GameActivityGameGraphicTime(settings, gameActivity, variateurTime); graph.gameSeriesDataClick += new DataClickHandler(GameSeries_DataClick); gameSeriesContener.Children.Add(graph); gameSeriesContener.UpdateLayout(); gameLabel.Content = resources.GetString("LOCGameActivityTimeTitle"); }
/// <summary> /// Get data detail for the selected game. /// </summary> /// <param name="gameID"></param> public void getActivityForGamesLogGraphics(string gameID, string dateSelected = "") { gameSeriesContener.Children.Clear(); GameActivityClass gameActivity = GameActivityDatabases.Get(Guid.Parse(gameID)); List <Activity> gameActivities = gameActivity.Activities; gameSeriesContener.Children.Add(new GameActivityGameGraphicLog(settings, gameActivity, dateSelected, variateurLog, false)); gameSeriesContener.UpdateLayout(); if (dateSelected == "") { gameLabel.Content = resources.GetString("LOCGameActivityLogTitle"); } else { gameLabel.Content = resources.GetString("LOCGameActivityLogTitleDate") + " " + Convert.ToDateTime(dateSelected).ToString(Playnite.Common.Constants.DateUiFormat); } }
/// <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 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 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; }
/// <summary> /// Get data detail for the selected game. /// </summary> /// <param name="gameID"></param> public void getActivityForGamesLogGraphics(string gameID, string dateSelected = "") { // TODO Get by date for click on time sessions GameActivityClass gameActivity = GameActivityDatabases.Get(Guid.Parse(gameID)); List <ActivityDetailsData> gameActivitiesDetails = gameActivity.GetSessionActivityDetails(dateSelected); string[] activityForGameLogLabels = new string[0]; List <ActivityDetailsData> gameLogsDefinitive = new List <ActivityDetailsData>(); if (gameActivitiesDetails.Count > 0) { if (gameActivitiesDetails.Count > 10) { // Variateur int conteurEnd = gameActivitiesDetails.Count + variateurLog; int conteurStart = conteurEnd - 10; if (conteurEnd > gameActivitiesDetails.Count) { int temp = conteurEnd - gameActivitiesDetails.Count; conteurEnd = gameActivitiesDetails.Count; conteurStart = conteurEnd - 10; variateurLog = variateurLogTemp; } if (conteurStart < 0) { conteurStart = 0; conteurEnd = 10; variateurLog = variateurLogTemp; } variateurLogTemp = variateurLog; // Create data int sCount = 0; activityForGameLogLabels = new string[10]; for (int iLog = conteurStart; iLog < conteurEnd; iLog++) { gameLogsDefinitive.Add(gameActivitiesDetails[iLog]); activityForGameLogLabels[sCount] = Convert.ToDateTime(gameActivitiesDetails[iLog].Datelog).ToLocalTime().ToString("HH:mm"); sCount += 1; } } else { gameLogsDefinitive = gameActivitiesDetails; activityForGameLogLabels = new string[gameActivitiesDetails.Count]; for (int iLog = 0; iLog < gameActivitiesDetails.Count; iLog++) { activityForGameLogLabels[iLog] = Convert.ToDateTime(gameActivitiesDetails[iLog].Datelog).ToLocalTime().ToString("HH:mm"); } } } // Set data in graphic. ChartValues <int> CPUseries = new ChartValues <int>(); ChartValues <int> GPUseries = new ChartValues <int>(); ChartValues <int> RAMseries = new ChartValues <int>(); ChartValues <int> FPSseries = new ChartValues <int>(); for (int iLog = 0; iLog < gameLogsDefinitive.Count; iLog++) { CPUseries.Add(gameLogsDefinitive[iLog].CPU); GPUseries.Add(gameLogsDefinitive[iLog].GPU); RAMseries.Add(gameLogsDefinitive[iLog].RAM); FPSseries.Add(gameLogsDefinitive[iLog].FPS); } SeriesCollection activityForGameLogSeries = new SeriesCollection { new ColumnSeries { Title = "cpu usage (%)", Values = CPUseries }, new ColumnSeries { Title = "gpu usage (%)", Values = GPUseries }, new ColumnSeries { Title = "ram usage (%)", Values = RAMseries }, new LineSeries { Title = "fps", Values = FPSseries } }; Func <double, string> activityForGameLogFormatter = value => value.ToString("N"); gameSeries.DataTooltip = new LiveCharts.Wpf.DefaultTooltip(); gameSeries.DataTooltip.Background = (Brush)resources.GetResource("CommonToolTipBackgroundBrush"); gameSeries.DataTooltip.Padding = new Thickness(10); gameSeries.DataTooltip.BorderThickness = (Thickness)resources.GetResource("CommonToolTipBorderThickness"); gameSeries.DataTooltip.BorderBrush = (Brush)resources.GetResource("CommonToolTipBorderBrush"); gameSeries.DataTooltip.Foreground = (Brush)resources.GetResource("CommonToolTipForeground"); if (dateSelected == "") { gameLabel.Content = resources.GetString("LOCGameActivityLogTitle"); } else { gameLabel.Content = resources.GetString("LOCGameActivityLogTitleDate") + " " + dateSelected; } gameSeries.Series = activityForGameLogSeries; gameLabelsX.MinValue = 0; gameLabelsX.Labels = activityForGameLogLabels; gameLabelsY.LabelFormatter = activityForGameLogFormatter; }
/// <summary> /// Get data for the selected game. /// </summary> /// <param name="gameID"></param> /// <param name="variateur"></param> public void getActivityForGamesTimeGraphics(string gameID) { DateTime dateStart = DateTime.Now.AddDays(variateurTime); string[] listDate = new string[10]; ChartValues <CustomerForTime> series = new ChartValues <CustomerForTime>(); // Periode data showned for (int iDay = 0; iDay < 10; iDay++) { listDate[iDay] = dateStart.AddDays(iDay - 9).ToString("yyyy-MM-dd"); //series.Add(0); series.Add(new CustomerForTime { Name = dateStart.AddDays(iDay - 9).ToString("yyyy-MM-dd"), Values = 0, //ValuesFormat = (int)TimeSpan.FromSeconds(0).TotalHours + "h " + TimeSpan.FromSeconds(0).ToString(@"mm") + "min" }); } // Search data in periode GameActivityClass gameActivity = GameActivityDatabases.Get(Guid.Parse(gameID)); List <Activity> gameActivities = gameActivity.Activities; for (int iActivity = 0; iActivity < gameActivities.Count; iActivity++) { long elapsedSeconds = gameActivities[iActivity].ElapsedSeconds; string dateSession = Convert.ToDateTime(gameActivities[iActivity].DateSession).ToLocalTime().ToString("yyyy-MM-dd"); for (int iDay = 0; iDay < 10; iDay++) { if (listDate[iDay] == dateSession) { string tempName = series[iDay].Name; double tempElapsed = series[iDay].Values + elapsedSeconds; series[iDay] = new CustomerForTime { Name = tempName, Values = tempElapsed, }; } } } // Set data in graphic. SeriesCollection activityForGameSeries = new SeriesCollection { new ColumnSeries { Title = "", Values = series } }; string[] activityForGameLabels = listDate; //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 => (int)TimeSpan.FromSeconds(value).TotalHours + "h " + TimeSpan.FromSeconds(value).ToString(@"mm") + "min"; gameLabelsY.LabelFormatter = activityForGameLogFormatter; gameSeries.DataTooltip = new CustomerToolTipForTime(); gameLabelsY.MinValue = 0; gameLabel.Content = resources.GetString("LOCGameActivityTimeTitle"); gameSeries.Series = activityForGameSeries; gameLabelsX.Labels = activityForGameLabels; }