示例#1
0
        public async Task <XApiMarketplaceSearchResult> SearchTitle(string query, XApiConfiguration config = null)
        {
            var cacheKey = $"titlesearch:{query}";

            if (!_cache.TryGetValue <XApiMarketplaceSearchResult>(cacheKey, out var result))
            {
                var message = new HttpRequestMessage(HttpMethod.Get, $"marketplace/search/{query}");

                if (config != null)
                {
                    message.Headers.Add("X-AUTH", config.XApiKey);
                    message.Headers.Add("Accept-Language", $"{config.Locale};q=1.0");
                }

                var response = await _httpClient.SendAsync(message);

                SaveRateLimit(config.XApiKey, response);

                response.EnsureSuccessStatusCode();

                using (var responseStream = await response.Content.ReadAsStreamAsync())
                {
                    result = await JsonSerializer.DeserializeAsync <XApiMarketplaceSearchResult>(responseStream, new JsonSerializerOptions
                    {
                        PropertyNameCaseInsensitive = true
                    });

                    // Cache for 1 hour (configurable)
                    _cache.Set(cacheKey, result, _options.StaticDataCacheTime);
                }
            }

            return(result);
        }
示例#2
0
        public async Task <IEnumerable <TitleInfo> > SearchXApiTitleInfo(string query, string xApiKey = null)
        {
            XApiConfiguration xConfig = null;

            if (this.HasExtensionConfiguration())
            {
                var config = this.GetExtensionConfiguration();
                xConfig = config.XBoxLiveConfig ?? new XApiConfiguration();
            }
            if (!string.IsNullOrEmpty(xApiKey))
            {
                xConfig.XApiKey = xApiKey;
            }

            var searchResult = await _xApiService.SearchTitle(query, xConfig);

            return(searchResult.Products.Select(product =>
                                                new TitleInfo
            {
                TitleId = product.AlternateIds?.FirstOrDefault(id => id.IdType == "XboxTitleId")?.Value ?? "",
                ProductTitle = product.LocalizedProperties?.FirstOrDefault()?.ProductTitle ?? "Unknown",
                ProductDescription = product.LocalizedProperties?.FirstOrDefault()?.ProductDescription ?? "-",
                LogoUri = product.LocalizedProperties?.FirstOrDefault()?.Images?.FirstOrDefault(i => i.ImagePurpose == "Logo" || i.ImagePurpose == "BoxArt" || i.ImagePurpose == "FeaturePromotionalSquareArt")?.Uri,
            }
                                                ));
        }
示例#3
0
        public async Task <bool> PurgeCache(XApiConfiguration config)
        {
            var cacheKey  = GetCacheKey($"achievements", config);
            var wasCached = _cache.TryGetValue <XApiAchievement[]>(cacheKey, out var cachedAchievements);

            if (wasCached)
            {
                _cache.Remove(cacheKey);
            }

            var reloaded = await GetAchievementsAsync(config);

            return(reloaded.Count(a => a?.ProgressState == ProgressState.Achieved) != cachedAchievements.Count(a => a?.ProgressState == ProgressState.Achieved));
        }
示例#4
0
        public static byte[] SerializeConfigurationToken_v1(this ConfigurationTokenService service, Model.ExtensionConfiguration configuration)
        {
            // Generate the Flatbuffer token payload
            var builder = new FlatBufferBuilder(512);

            var fbConfiguration = new TwitchAchievementTracker.Flatbuffer.v1.Configuration();

            fbConfiguration.version = configuration.Version;


            var xConfig     = configuration.XBoxLiveConfig as Model.XApiConfiguration;
            var steamConfig = configuration.SteamConfig as Model.SteamConfiguration;

            switch (configuration.ActiveConfig)
            {
            case Model.ActiveConfig.XBoxLive:

                var flatBufferXBoxConfig = new XApiConfiguration();
                flatBufferXBoxConfig.xApiKey      = xConfig.XApiKey;
                flatBufferXBoxConfig.streamerXuid = string.IsNullOrEmpty(xConfig.StreamerXuid) ? 0 : UInt64.Parse(xConfig.StreamerXuid);
                flatBufferXBoxConfig.titleId      = string.IsNullOrEmpty(xConfig.TitleId) ? 0 : UInt32.Parse(xConfig.TitleId);
                flatBufferXBoxConfig.locale       = xConfig.Locale ?? "en-US";
                fbConfiguration.config            = new FlatBufferUnion <XApiConfiguration, SteamConfiguration>(flatBufferXBoxConfig);

                break;

            case Model.ActiveConfig.Steam:
                var webKeyString          = builder.CreateString(steamConfig.WebApiKey);
                var steamId               = UInt64.Parse(steamConfig.SteamId);
                var appId                 = steamConfig.AppId;
                var steamLocale           = builder.CreateString(steamConfig.Locale ?? "english");
                var flatBufferSteamConfig = new SteamConfiguration();
                flatBufferSteamConfig.webApiKey = steamConfig.WebApiKey;
                flatBufferSteamConfig.steamId   = string.IsNullOrEmpty(steamConfig.SteamId) ? 0 : UInt64.Parse(steamConfig.SteamId);
                flatBufferSteamConfig.appId     = string.IsNullOrEmpty(steamConfig.AppId) ? 0 : UInt32.Parse(steamConfig.AppId);
                fbConfiguration.config          = new FlatBufferUnion <XApiConfiguration, SteamConfiguration>(flatBufferSteamConfig);

                break;

            default:
                throw new NotSupportedException("Unknown configuration platform");
            }

            int maxBytesNeeded = FlatBufferSerializer.Default.GetMaxSize(fbConfiguration);

            byte[] outBuffer    = new byte[maxBytesNeeded];
            int    bytesWritten = FlatBufferSerializer.Default.Serialize(fbConfiguration, outBuffer);

            return(new ArraySegment <byte>(outBuffer, 0, bytesWritten).ToArray());
        }
示例#5
0
        public static Model.ExtensionConfiguration DeserializeConfigurationToken_v1(this ConfigurationTokenService service, byte[] decrypted)
        {
            var fbConfiguration = FlatBufferSerializer.Default.Parse <TwitchAchievementTracker.Flatbuffer.v1.Configuration>(decrypted);


            SteamConfiguration steamFbConfig = null;
            XApiConfiguration  xApiFbConfig  = null;

            Model.ActiveConfig activeConfig;
            if (fbConfiguration.config.TryGet(out steamFbConfig))
            {
                activeConfig = Model.ActiveConfig.Steam;
            }
            else if (fbConfiguration.config.TryGet(out xApiFbConfig))
            {
                activeConfig = Model.ActiveConfig.XBoxLive;
            }
            else
            {
                throw new NotSupportedException("Unknown configuration platform");
            }

            return(new Model.ExtensionConfiguration
            {
                Version = fbConfiguration.version,
                ActiveConfig = activeConfig,
                SteamConfig = steamFbConfig == null ? null : new Model.SteamConfiguration
                {
                    WebApiKey = steamFbConfig.webApiKey,
                    SteamId = steamFbConfig.steamId == 0 ? null : steamFbConfig.steamId.ToString(),
                    AppId = steamFbConfig.appId == 0 ? null : steamFbConfig.appId.ToString(),
                    Locale = steamFbConfig.locale,
                },
                XBoxLiveConfig = xApiFbConfig == null ? null : new Model.XApiConfiguration
                {
                    XApiKey = xApiFbConfig.xApiKey,
                    StreamerXuid = xApiFbConfig.streamerXuid == 0 ? null : xApiFbConfig.streamerXuid.ToString(),
                    TitleId = xApiFbConfig.titleId == 0 ? null : xApiFbConfig.titleId.ToString(),
                    Locale = xApiFbConfig.locale,
                }
            });
        }
示例#6
0
        public async Task <XApiAchievement[]> GetAchievementsAsync(XApiConfiguration config)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }

            string xuid    = config.StreamerXuid;
            string titleId = config.TitleId;

            var cacheKey = GetCacheKey($"achievements", config);

            if (!_cache.TryGetValue <XApiAchievement[]>(cacheKey, out var result))
            {
                var message = new HttpRequestMessage(HttpMethod.Get, $"{xuid}/achievements/{titleId}");
                message.Headers.Add("X-AUTH", config.XApiKey);
                message.Headers.Add("Accept-Language", $"{config.Locale};q=1.0");
                var response = await _httpClient.SendAsync(message);

                SaveRateLimit(config.XApiKey, response);

                response.EnsureSuccessStatusCode();
                using (var responseStream = await response.Content.ReadAsStreamAsync())
                {
                    result = await JsonSerializer.DeserializeAsync <XApiAchievement[]>(responseStream, new JsonSerializerOptions
                    {
                        PropertyNameCaseInsensitive = true
                    });

                    // Cache for 1 minute (configurable)
                    _cache.Set(cacheKey, result, _options.ResultCacheTime);
                }
            }

            return(result);
        }
示例#7
0
 public string GetCacheKey(string call, XApiConfiguration config)
 {
     return($"{call}:{config.TitleId}:{config.StreamerXuid}:{config.Locale}");
 }