public Task <IEnumerable <ISearchItem <string> > > GetItemsTask(string query, IReadOnlyList <Candidate> addedItems) { if (string.IsNullOrWhiteSpace(query)) { return(null); } var metadataArgs = new GetMetadataFieldArgs(); return(Task.Run(() => { var game = new Game(query); var gameMetadata = new GameMetadata(); var requestOptions = new MetadataRequestOptions(game, true); List <ISearchItem <string> > items = new List <ISearchItem <string> >(); using (var provider = metadataPlugin.GetMetadataProvider(requestOptions)) { var item = new CommandItem(); var fields = provider.AvailableFields; if (fields.Contains(MetadataField.Icon)) { gameMetadata.Icon = provider.GetIcon(new GetMetadataFieldArgs()); } if (fields.Contains(MetadataField.Platform)) { gameMetadata.Platforms = provider.GetPlatforms(new GetMetadataFieldArgs()).ToHashSet(); } if (fields.Contains(MetadataField.Genres)) { gameMetadata.Genres = provider.GetGenres(new GetMetadataFieldArgs()).ToHashSet(); } if (fields.Contains(MetadataField.Name) && provider.GetName(new GetMetadataFieldArgs()) is string name) { gameMetadata.Name = name; var tempGame = SearchPlugin.Instance.PlayniteApi.Database.ImportGame(gameMetadata); items.Add(new GameSearchItem(tempGame)); if (SearchPlugin.Instance.PlayniteApi.Database.Games.Remove(tempGame.Id)) { } else { } } } return items.AsEnumerable(); }, metadataArgs.CancelToken)); }
public Task <IEnumerable <ISearchItem <string> > > GetItemsTask(string query, IReadOnlyList <Candidate> addedItems) { if (!SearchPlugin.Instance.Settings.ITADEnabled) { return(null); } return(Task.Run(() => { if (region == null) { GetRegion(); } bool isBelowThreshold = (addedItems.FirstOrDefault()?.Score ?? 0f) < SearchPlugin.Instance.Settings.ITADThreshold; bool overrideStringPresent = !string.IsNullOrWhiteSpace(SearchPlugin.Instance.Settings.ITADOverride) && query.EndsWith(SearchPlugin.Instance.Settings.ITADOverride); if (!isBelowThreshold && !overrideStringPresent || string.IsNullOrWhiteSpace(query)) { return null; } var input = query; var deals = new List <ISearchItem <string> >(); if (!isBelowThreshold && overrideStringPresent) { input = query.Substring(0, query.Length - SearchPlugin.Instance.Settings.ITADOverride.Length); } using (var client = new HttpClient()) { try { var response = client.GetStringAsync(MakeSearchQuery(input)).Result; var json = JObject.Parse(response); if (json.IsValid(SearchResponse.Schema)) { var searchResponse = JsonConvert.DeserializeObject <SearchResponse>(response); if (searchResponse.Results.Data.Count > 0) { var games = searchResponse.Results.Data; var plains = string.Join(",", searchResponse.Results.Data.Select(g => g.Plain)); if (games.Count() > 0) { var prices = client.GetStringAsync(MakePriceQuery(plains)).Result; var pricesJson = JObject.Parse(prices); if (pricesJson.IsValid(PricesResponse.Schema)) { var pricesResponse = JsonConvert.DeserializeObject <PricesResponse>(prices); foreach (var game in pricesResponse.Data.Where(g => g.Value.Prices.Count > 0)) { var bestPrice = game.Value.Prices[0]; var worstPrice = game.Value.Prices.Last(); var priceRange = bestPrice.NewPrice.ToString("0.00") + currencySign; if (bestPrice.NewPrice != worstPrice.NewPrice) { priceRange += " - " + worstPrice.NewPrice.ToString("0.00") + currencySign; } var title = games.First(g => g.Plain == game.Key).Title; var item = new CommandItem(title, () => Process.Start(bestPrice.URL).Dispose(), bestPrice.Shop.Name, bestPrice.Shop.Name) { IconChar = IconChars.ShoppingCart, BottomLeft = priceRange, BottomRight = "IsThereAnyDeal.com API" + (string.IsNullOrEmpty(region) ? string.Empty : $" - {region.ToUpper()}{(country != null ? ", " : string.Empty)}{country?.ToUpper() ?? string.Empty}"), // TopRight = "Available in " + game.Value.Prices.Count.ToString() + " Shop" + (game.Value.Prices.Count != 1 ? "s" : string.Empty), Keys = new List <ISearchKey <string> >() { new CommandItemKey() { Key = title, Weight = 1 } } }; for (int i = 1; i < game.Value.Prices.Count; ++i) { PricesResponse.PricesItem pricesItem = game.Value.Prices[i]; item.Actions.Add(new CommandAction { Name = pricesItem.Shop.Name, Action = () => Process.Start(pricesItem.URL) }); } Application.Current.Dispatcher.Invoke(() => { var stackPanel = new StackPanel(); if (game.Value.Prices.FirstOrDefault(p => p.Shop.Name == "Steam") is PricesResponse.PricesItem steamItem) { var appIdRegex = new Regex(@"(?<=app\/)(\w*)(?=\/)"); if (appIdRegex.IsMatch(steamItem.URL)) { var appId = appIdRegex.Match(steamItem.URL).Value; var logoUrl = string.Format("https://steamcdn-a.akamaihd.net/steam/apps/{0}/logo.png", appId); if (Uri.TryCreate(logoUrl, UriKind.RelativeOrAbsolute, out var uri)) { var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.UriSource = uri; bitmap.CreateOptions = BitmapCreateOptions.IgnoreColorProfile; bitmap.CacheOption = BitmapCacheOption.OnDemand; bitmap.EndInit(); var logo = new Image { Source = bitmap, MaxHeight = 100, Stretch = Stretch.Uniform, StretchDirection = StretchDirection.Both, Margin = new Thickness(0, 0, 0, 10) }; stackPanel.Children.Add(logo); } } } var dataGrid = new DataGrid() { ItemsSource = game.Value.Prices.Select(deal => new { Shop = deal.Shop.Name, Price = $"{deal.NewPrice:0.00}{currencySign}" }), AutoGenerateColumns = false, HeadersVisibility = DataGridHeadersVisibility.None, CanUserAddRows = false, CanUserDeleteRows = false, CanUserReorderColumns = false, CanUserResizeRows = false, CanUserResizeColumns = false, CanUserSortColumns = false, Background = null, SelectionMode = DataGridSelectionMode.Single, IsHitTestVisible = false, BorderBrush = null, HorizontalGridLinesBrush = null, VerticalGridLinesBrush = null }; dataGrid.Columns.Add(new DataGridTextColumn { Binding = new Binding("Shop"), Header = "Shop", IsReadOnly = true }); dataGrid.Columns.Add(new DataGridTextColumn { Binding = new Binding("Price"), Header = "Price", IsReadOnly = true }); stackPanel.Children.Add(new TextBlock { Text = $"{title} Deals:", Foreground = ResourceProvider.GetResource <Brush>("TextBrush") ?? Brushes.White, Margin = new Thickness { Bottom = 10, Left = 10, Right = 10 }, HorizontalAlignment = HorizontalAlignment.Center, TextWrapping = TextWrapping.Wrap }); stackPanel.Children.Add(dataGrid); item.DetailsView = stackPanel; }); item.Actions.Add(new CommandAction { Name = "Go to ITAD", Action = () => Process.Start(game.Value.URLs["game"]) }); deals.Add(item); } } } } } } catch (Exception e) { SearchPlugin.logger.Debug(e, "Failed request to ITAD"); } } return deals.AsEnumerable(); })); }