コード例 #1
0
        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));
        }
コード例 #2
0
        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();
            }));
        }