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); }
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, } )); }
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)); }
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()); }
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, } }); }
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); }
public string GetCacheKey(string call, XApiConfiguration config) { return($"{call}:{config.TitleId}:{config.StreamerXuid}:{config.Locale}"); }