private async Task <GameAchievements> LoadData(IPlayniteAPI PlayniteApi, string PluginUserDataPath, SuccessStorySettings settings) { // Refresh database if (SuccessStory.isFirstLoad) { achievementsDatabase = new AchievementsDatabase(PlayniteApi, settings, this.GetPluginUserDataPath()); achievementsDatabase.Initialize(); SuccessStory.isFirstLoad = false; } GameAchievements SelectedGameAchievements = achievementsDatabase.Get(GameSelected.Id); // Download Achievements if not exist in database. if (SelectedGameAchievements == null) { logger.Info("SuccessStory - Download achievements for " + GameSelected.Name); achievementsDatabase.Add(GameSelected, settings); achievementsDatabase.Initialize(); SelectedGameAchievements = achievementsDatabase.Get(GameSelected.Id); } return(SelectedGameAchievements); }
private void Integration() { bool noAchievements = false; try { AchievementsDatabase achievementsDatabase = new AchievementsDatabase(PlayniteApi, this.GetPluginUserDataPath()); achievementsDatabase.Initialize(); GameAchievements SelectedGameAchievements = achievementsDatabase.Get(GameSelected.Id); // Download Achievements if not exist in database. if (SelectedGameAchievements == null) { logger.Info("SuccesStory - Download achievements for " + GameSelected.Name); achievementsDatabase.Add(GameSelected, settings); achievementsDatabase.Initialize(); SelectedGameAchievements = achievementsDatabase.Get(GameSelected.Id); } if (SelectedGameAchievements == null || !SelectedGameAchievements.HaveAchivements) { logger.Info("SuccessStory - No achievement for " + GameSelected.Name); if (settings.EnableIntegrationInDescription || settings.EnableIntegrationInDescriptionWithToggle) { Button PART_ScButton = (Button)LogicalTreeHelper.FindLogicalNode(PART_ActionButtons, "PART_ScButton"); // Delete old ButtonDetails if (settings.EnableIntegrationButtonDetails) { PART_ActionButtons.Children.Remove(PART_ScButton); PART_ScButton = null; } ToggleButton PART_ScToggleButton = (ToggleButton)LogicalTreeHelper.FindLogicalNode(PART_ActionButtons, "PART_ScToggleButton"); // Delete old ToggleDetails if (settings.IntegrationToggleDetails) { PART_ActionButtons.Children.Remove(PART_ScToggleButton); PART_ScToggleButton = null; } // Delete old string NameControl = "PART_Achievements"; StackPanel PART_Achievements = (StackPanel)LogicalTreeHelper.FindLogicalNode(PART_ElemDescription, NameControl); if (PART_Achievements != null) { PART_ElemDescription.Children.Remove(PART_Achievements); } } noAchievements = true; } // Auto integration if (settings.EnableIntegrationInDescription || settings.EnableIntegrationInDescriptionWithToggle) { // Search parent action buttons if (PART_ActionButtons == null) { foreach (Button bt in Tools.FindVisualChildren <Button>(Application.Current.MainWindow)) { if (bt.Name == "PART_ButtonEditGame") { PART_ActionButtons = (StackPanel)bt.Parent; break; } } } //Adding togglebutton if (settings.EnableIntegrationInDescriptionWithToggle && PART_ActionButtons != null) { ToggleButton PART_ScToggleButton = (ToggleButton)LogicalTreeHelper.FindLogicalNode(PART_ActionButtons, "PART_ScToggleButton"); // Delete old ToggleDetails if (settings.IntegrationToggleDetails) { PART_ActionButtons.Children.Remove(PART_ScToggleButton); PART_ScToggleButton = null; } if (PART_ScToggleButton == null && !noAchievements) { ToggleButton tb = new ToggleButton(); if (settings.IntegrationToggleDetails) { tb = new SuccessStoryToggleButtonDetails(SelectedGameAchievements.Unlocked, SelectedGameAchievements.Total); } else { tb.Content = resources.GetString("LOCSucessStoryAchievements"); } tb.IsChecked = false; tb.Name = "PART_ScToggleButton"; tb.Width = 150; tb.Height = 40; tb.HorizontalAlignment = HorizontalAlignment.Right; tb.VerticalAlignment = VerticalAlignment.Stretch; tb.Margin = new Thickness(10, 0, 0, 0); tb.Click += ScToggleButton_Click; PART_ActionButtons.Children.Add(tb); PART_ActionButtons.UpdateLayout(); } } // Search game description if (PART_ElemDescription == null) { foreach (StackPanel sp in Tools.FindVisualChildren <StackPanel>(Application.Current.MainWindow)) { if (sp.Name == "PART_ElemDescription") { PART_ElemDescription = sp; break; } } } // Adding control if (PART_ElemDescription != null) { // Delete old string NameControl = "PART_Achievements"; StackPanel PART_Achievements = (StackPanel)LogicalTreeHelper.FindLogicalNode(PART_ElemDescription, NameControl); if (PART_Achievements != null) { if (settings.EnableIntegrationInDescription) { PART_ElemDescription.Children.Remove(PART_Achievements); } if (settings.EnableIntegrationInDescriptionWithToggle) { PART_ElemDescription.Children.Remove(PART_Achievements); } } else { logger.Error($"SuccessStory - {NameControl} not found in Integration()"); } if (SelectedGameAchievements != null && SelectedGameAchievements.HaveAchivements) { StackPanel ScA = CreateSc(achievementsDatabase, SelectedGameAchievements, settings.IntegrationShowTitle, settings.IntegrationShowGraphic, settings.IntegrationShowAchievements, false); if (settings.EnableIntegrationInDescription) { // Add if (settings.IntegrationTopGameDetails) { PART_ElemDescription.Children.Insert(0, ScA); } else { PART_ElemDescription.Children.Add(ScA); } PART_ElemDescription.UpdateLayout(); } if (settings.EnableIntegrationInDescriptionWithToggle) { ScA.Visibility = Visibility.Collapsed; PART_ElemDescription.Children.Add(ScA); PART_ElemDescription.UpdateLayout(); } } } else { logger.Error($"SuccessStory - PART_ElemDescription not found in Integration()"); } } // Auto adding button if (settings.EnableIntegrationButton || settings.EnableIntegrationButtonDetails) { // Search parent action buttons if (PART_ActionButtons == null) { foreach (Button bt in Tools.FindVisualChildren <Button>(Application.Current.MainWindow)) { if (bt.Name == "PART_ButtonEditGame") { PART_ActionButtons = (StackPanel)bt.Parent; break; } } } // Adding button if (PART_ActionButtons != null) { Button PART_ScButton = (Button)LogicalTreeHelper.FindLogicalNode(PART_ActionButtons, "PART_ScButton"); // Delete old ButtonDetails if (settings.EnableIntegrationButtonDetails) { PART_ActionButtons.Children.Remove(PART_ScButton); PART_ScButton = null; } if (PART_ScButton == null) { Button bt = new Button(); if (settings.EnableIntegrationButton) { bt.Content = resources.GetString("LOCSucessStoryAchievements"); } if (settings.EnableIntegrationButtonDetails) { bt = new SuccessStoryButtonDetails(SelectedGameAchievements.Unlocked, SelectedGameAchievements.Total); } bt.Name = "PART_ScButton"; bt.Width = 150; bt.Height = 40; bt.HorizontalAlignment = HorizontalAlignment.Right; bt.VerticalAlignment = VerticalAlignment.Stretch; bt.Margin = new Thickness(10, 0, 0, 0); bt.Click += ScButton_Click; PART_ActionButtons.Children.Add(bt); PART_ActionButtons.UpdateLayout(); } } } // Custom theme if (settings.EnableIntegrationInCustomTheme) { // Search custom element foreach (StackPanel sp in Tools.FindVisualChildren <StackPanel>(Application.Current.MainWindow)) { if (sp.Name == "PART_Achievements_Graphics") { if (SelectedGameAchievements != null && SelectedGameAchievements.HaveAchivements) { // Create StackPanel scAG = CreateSc(achievementsDatabase, SelectedGameAchievements, false, true, false, true); // Clear & add sp.Children.Clear(); sp.Children.Add(scAG); sp.UpdateLayout(); } else { sp.Children.Clear(); sp.UpdateLayout(); } } if (sp.Name == "PART_Achievements_List") { if (SelectedGameAchievements != null && SelectedGameAchievements.HaveAchivements) { // Create StackPanel scAL = CreateSc(achievementsDatabase, SelectedGameAchievements, false, false, true, true); // Clear & add sp.Children.Clear(); sp.Children.Add(scAL); sp.UpdateLayout(); } else { sp.Children.Clear(); sp.UpdateLayout(); } } } } } catch (Exception ex) { var LineNumber = new StackTrace(ex, true).GetFrame(0).GetFileLineNumber(); string FileName = new StackTrace(ex, true).GetFrame(0).GetFileName(); logger.Error(ex, $"SuccessStory [{FileName} {LineNumber}] - Impossible integration "); } }
public override void OnApplicationStarted() { // Add code to be executed when Playnite is initialized. successStoryUI.AddBtHeader(); // Cache images if (settings.EnableImageCache) { CancellationToken ct = tokenSource.Token; var TaskCacheImage = Task.Run(() => { // Wait Playnite & extension database are loaded Thread.Sleep(60000); #if DEBUG logger.Debug($"SuccessStory - TaskCacheImage - {PlayniteApi.Database.Games.Count} - Start"); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); #endif foreach (Game game in PlayniteApi.Database.Games) { try { GameAchievements gameAchievements = achievementsDatabase.Get(game.Id); if (gameAchievements != null && gameAchievements.HaveAchivements) { #if DEBUG logger.Debug($"SuccessStory - TaskCacheImage - {game.Name} - {gameAchievements.Achievements.Count}"); #endif foreach (var achievement in gameAchievements.Achievements) { if (!achievement.UrlLocked.IsNullOrEmpty() && PlayniteTools.GetCacheFile(achievement.CacheLocked, "SuccessStory").IsNullOrEmpty()) { #if DEBUG logger.Debug($"SuccessStory - TaskCacheImage.DownloadFileImage - {game.Name} - GetCacheFile({achievement.Name + "_Locked"})"); #endif Web.DownloadFileImage(achievement.CacheLocked, achievement.UrlLocked, PlaynitePaths.ImagesCachePath, "SuccessStory").GetAwaiter().GetResult(); } if (ct.IsCancellationRequested) { logger.Info($"IsCancellationRequested for TaskCacheImage()"); break; } if (PlayniteTools.GetCacheFile(achievement.CacheUnlocked, "SuccessStory").IsNullOrEmpty()) { #if DEBUG logger.Debug($"SuccessStory - TaskCacheImage.DownloadFileImage - {game.Name} - GetCacheFile({achievement.Name + "_Unlocked"})"); #endif Web.DownloadFileImage(achievement.CacheUnlocked, achievement.UrlUnlocked, PlaynitePaths.ImagesCachePath, "SuccessStory").GetAwaiter().GetResult(); } if (ct.IsCancellationRequested) { logger.Info($"IsCancellationRequested for TaskCacheImage()"); break; } } } } catch (Exception ex) { #if DEBUG Common.LogError(ex, "SuccessStory", $"Error on TaskCacheImage"); #endif } } #if DEBUG stopwatch.Stop(); TimeSpan ts = stopwatch.Elapsed; logger.Debug($"SuccessStory - TaskCacheImage() - End - {String.Format("{0:00}:{1:00}.{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds / 10)}"); #endif }, tokenSource.Token); } }
/// <summary> /// Show list game with achievement. /// </summary> public void GetListGame() { List <Guid> ListEmulators = new List <Guid>(); foreach (var item in PlayniteApi.Database.Emulators) { ListEmulators.Add(item.Id); } if (ListGames.Count == 0) { foreach (var item in PlayniteApiDatabase.Games) { string GameSourceName = ""; if (item.SourceId != Guid.Parse("00000000-0000-0000-0000-000000000000")) { GameSourceName = item.Source.Name; if (item.PlayAction != null && item.PlayAction.EmulatorId != null && ListEmulators.Contains(item.PlayAction.EmulatorId)) { GameSourceName = "RetroAchievements"; } } else { if (item.PlayAction != null && item.PlayAction.EmulatorId != null && ListEmulators.Contains(item.PlayAction.EmulatorId)) { GameSourceName = "RetroAchievements"; } else { GameSourceName = "Playnite"; } } if (AchievementsDatabase.HaveAchievements(item.Id)) { if (AchievementsDatabase.VerifToAddOrShow(GameSourceName, settings, PluginUserDataPath)) { string GameId = item.Id.ToString(); string GameName = item.Name; string GameIcon; DateTime?GameLastActivity = null; string SourceName = ""; if (item.SourceId != Guid.Parse("00000000-0000-0000-0000-000000000000")) { SourceName = item.Source.Name; if (item.PlayAction != null && item.PlayAction.EmulatorId != null && ListEmulators.Contains(item.PlayAction.EmulatorId)) { SourceName = "RetroAchievements"; } } else { if (item.PlayAction != null && item.PlayAction.EmulatorId != null && ListEmulators.Contains(item.PlayAction.EmulatorId)) { SourceName = "RetroAchievements"; } else { SourceName = "Playnite"; } } GameAchievements GameAchievements = AchievementsDatabase.Get(item.Id); if (item.LastActivity != null) { GameLastActivity = ((DateTime)item.LastActivity).ToLocalTime(); } BitmapImage iconImage = new BitmapImage(); if (String.IsNullOrEmpty(item.Icon) == false) { iconImage.BeginInit(); GameIcon = PlayniteApiDatabase.GetFullFilePath(item.Icon); iconImage.UriSource = new Uri(GameIcon, UriKind.RelativeOrAbsolute); iconImage.EndInit(); } ListGames.Add(new ListGames() { Id = GameId, Name = GameName, Icon = iconImage, LastActivity = GameLastActivity, SourceName = SourceName, SourceIcon = TransformIcon.Get(SourceName), ProgressionValue = GameAchievements.Progression, Total = GameAchievements.Total, TotalPercent = GameAchievements.Progression + "%", Unlocked = GameAchievements.Unlocked }); iconImage = null; } } } } ListviewGames.ItemsSource = ListGames; // Filter if (!TextboxSearch.Text.IsNullOrEmpty() && SearchSources.Count != 0) { ListviewGames.ItemsSource = ListGames.FindAll( x => x.Name.ToLower().IndexOf(TextboxSearch.Text) > -1 && SearchSources.Contains(x.SourceName) ); return; } if (!TextboxSearch.Text.IsNullOrEmpty()) { ListviewGames.ItemsSource = ListGames.FindAll( x => x.Name.ToLower().IndexOf(TextboxSearch.Text) > -1 ); return; } if (SearchSources.Count != 0) { ListviewGames.ItemsSource = ListGames.FindAll( x => SearchSources.Contains(x.SourceName) ); return; } // 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 == "lvSourceIcon") { columnBinding = lvSourceName.Column.DisplayMemberBinding as Binding; sortBy = columnBinding?.Path.Path ?? _lastHeaderClicked.Column.Header as string; } if (_lastHeaderClicked.Name == "lvProgression") { columnBinding = lvProgressionValue.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(ListviewGames.ItemsSource); switch (settings.NameSorting) { case ("Name"): _lastHeaderClicked = lvName; if (settings.IsAsc) { _lastHeaderClicked.Content += " ▲"; } else { _lastHeaderClicked.Content += " ▼"; } break; case ("LastActivity"): _lastHeaderClicked = lvLastActivity; if (settings.IsAsc) { _lastHeaderClicked.Content += " ▲"; } else { _lastHeaderClicked.Content += " ▼"; } break; case ("SourceName"): _lastHeaderClicked = lvSourceIcon; if (settings.IsAsc) { lvSourceIcon.Content += " ▲"; } else { lvSourceIcon.Content += " ▼"; } break; case ("ProgressionValue"): _lastHeaderClicked = lvProgression; if (settings.IsAsc) { lvProgression.Content += " ▲"; } else { lvProgression.Content += " ▼"; } break; } if (settings.IsAsc) { _lastDirection = ListSortDirection.Ascending; } else { _lastDirection = ListSortDirection.Descending; } view.SortDescriptions.Add(new SortDescription(settings.NameSorting, _lastDirection)); } }
/// <summary> /// Show list game with achievement. /// </summary> /// <param name="SearchGameName"></param> public void GetListGame(string SearchGameName = "", List <string> SearchSourceName = null) { logger.Debug("SearchGameName: " + SearchGameName); logger.Debug("SearchSourceName: " + JsonConvert.SerializeObject(SearchSourceName)); List <ListGames> ListGames = new List <ListGames>(); foreach (var item in PlayniteApiDatabase.Games) { string GameSourceName = ""; if (item.SourceId != Guid.Parse("00000000-0000-0000-0000-000000000000")) { GameSourceName = item.Source.Name; } else { GameSourceName = "Playnite"; } bool isFind = false; if (SearchSourceName != null) { for (int i = 0; i < SearchSourceName.Count; i++) { if (GameSourceName.ToLower().Contains(SearchSourceName[i].ToLower())) { isFind = true; } } } if (SearchGameName != "") { if (item.Name.ToLower().Contains(SearchGameName.ToLower())) { isFind = true; } } if (SearchGameName != "" && SearchSourceName != null) { isFind = false; for (int i = 0; i < SearchSourceName.Count; i++) { if ((GameSourceName.ToLower().Contains(SearchSourceName[i].ToLower())) && (item.Name.ToLower().Contains(SearchGameName.ToLower()))) { isFind = true; } } } if (SearchGameName == "" && SearchSourceName == null) { isFind = true; } if (isFind && AchievementsDatabase.HaveAchievements(item.Id)) { if (AchievementsDatabase.VerifToAddOrShow(GameSourceName, settings)) { string GameId = item.Id.ToString(); string GameName = item.Name; string GameIcon; DateTime?GameLastActivity = null; string SourceName = ""; if (item.SourceId != Guid.Parse("00000000-0000-0000-0000-000000000000")) { SourceName = item.Source.Name; } else { SourceName = "Playnite"; } GameAchievements GameAchievements = AchievementsDatabase.Get(item.Id); if (item.LastActivity != null) { GameLastActivity = ((DateTime)item.LastActivity).ToLocalTime(); } BitmapImage iconImage = new BitmapImage(); if (String.IsNullOrEmpty(item.Icon) == false) { iconImage.BeginInit(); GameIcon = PlayniteApiDatabase.GetFullFilePath(item.Icon); iconImage.UriSource = new Uri(GameIcon, UriKind.RelativeOrAbsolute); iconImage.EndInit(); } ListGames.Add(new ListGames() { Id = GameId, Name = GameName, Icon = iconImage, LastActivity = GameLastActivity, SourceName = SourceName, SourceIcon = TransformIcon.Get(SourceName), ProgressionValue = GameAchievements.Progression, Total = GameAchievements.Total, TotalPercent = GameAchievements.Progression + "%", Unlocked = GameAchievements.Unlocked }); iconImage = null; } } } ListviewGames.ItemsSource = ListGames; // 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 == "lvSourceIcon") { columnBinding = lvSourceName.Column.DisplayMemberBinding as Binding; sortBy = columnBinding?.Path.Path ?? _lastHeaderClicked.Column.Header as string; } if (_lastHeaderClicked.Name == "lvProgression") { columnBinding = lvProgressionValue.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(ListviewGames.ItemsSource); logger.Debug("sort - " + settings.NameSorting + " - " + _lastDirection.ToString()); switch (settings.NameSorting) { case ("Name"): _lastHeaderClicked = lvName; if (settings.IsAsc) { _lastHeaderClicked.Content += " ▲"; } else { _lastHeaderClicked.Content += " ▼"; } break; case ("LastActivity"): _lastHeaderClicked = lvLastActivity; if (settings.IsAsc) { _lastHeaderClicked.Content += " ▲"; } else { _lastHeaderClicked.Content += " ▼"; } break; case ("SourceName"): _lastHeaderClicked = lvSourceIcon; if (settings.IsAsc) { lvSourceIcon.Content += " ▲"; } else { lvSourceIcon.Content += " ▼"; } break; case ("ProgressionValue"): _lastHeaderClicked = lvProgression; if (settings.IsAsc) { lvProgression.Content += " ▲"; } else { lvProgression.Content += " ▼"; } break; } if (settings.IsAsc) { _lastDirection = ListSortDirection.Ascending; } else { _lastDirection = ListSortDirection.Descending; } view.SortDescriptions.Add(new SortDescription(settings.NameSorting, _lastDirection)); } }
/// <summary> /// Show list game with achievement. /// </summary> public void GetListGame() { string pluginFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); try { if (ListGames.Count == 0) { var dataGameAchievements = AchievementsDb.gameAchievements.Where(x => x.Value.HaveAchivements); foreach (var item in dataGameAchievements) { Game game = _PlayniteApiDatabase.Games.Get(item.Key); string SourceName = PlayniteTools.GetSourceName(game, _PlayniteApi); if (AchievementsDatabase.VerifToAddOrShow(plugin, _PlayniteApi, SourceName, settings, PluginUserDataPath)) { string GameId = game.Id.ToString(); string GameName = game.Name; string GameIcon = string.Empty; string Icon100 = string.Empty; DateTime?GameLastActivity = null; GameAchievements GameAchievements = AchievementsDb.Get(game.Id); if (game.LastActivity != null) { GameLastActivity = ((DateTime)game.LastActivity).ToLocalTime(); } if (!game.Icon.IsNullOrEmpty()) { GameIcon = _PlayniteApiDatabase.GetFullFilePath(game.Icon); } if (GameAchievements.Is100Percent) { Icon100 = Path.Combine(pluginFolder, "Resources\\badge.png"); } ListGames.Add(new ListViewGames() { Icon100Percent = Icon100, Id = GameId, Name = GameName, Icon = GameIcon, LastActivity = GameLastActivity, SourceName = SourceName, SourceIcon = TransformIcon.Get(SourceName), ProgressionValue = GameAchievements.Progression, Total = GameAchievements.Total, TotalPercent = GameAchievements.Progression + "%", Unlocked = GameAchievements.Unlocked }); } } } Application.Current.Dispatcher.BeginInvoke((Action) delegate { ListviewGames.ItemsSource = ListGames; Sorting(); }); } catch (Exception ex) { Common.LogError(ex, "SuccessStory", "Errorn on GetListGames()"); } }