private async Task <GameInfo> ResolveCategory(string categoryId, string language, CancellationToken cancellationToken) { var gameInfo = new GameInfo { TwitchCategoryId = categoryId, Language = language, }; _logger.LogWarning("No result for localized info for {gameId}, looking up base record", categoryId); var baseInfo = await _gameLocalizationStore.ResolveLocalizedGameInfoAsync("", categoryId); if (baseInfo != null && (!baseInfo.IGDBId.HasValue || !baseInfo.SteamId.HasValue)) { _logger.LogWarning("Base record for {gameId} exists, but is not linked to a Steam appid.", categoryId); return(gameInfo); } if (baseInfo == null) { baseInfo = await ResolveBaseRecord(categoryId, language, cancellationToken); await _gameLocalizationStore.SaveGameInfoAsync(baseInfo, cancellationToken); } if (baseInfo != null) { gameInfo.Name = baseInfo.Name; gameInfo.IGDBId = baseInfo.IGDBId; gameInfo.SteamId = baseInfo.SteamId; gameInfo.Summary = baseInfo.Summary; gameInfo.Synopsis = baseInfo.Synopsis; gameInfo.Source = baseInfo.Source; } if (baseInfo != null && baseInfo.SteamId.HasValue) { _logger.LogWarning("Found an existing base record for {gameId} with associated Steam appid {}.", categoryId, baseInfo.SteamId); var steamLang = SteamConstants.TwitchLanguageMapping[language]; var storeDetails = await _steamStoreClient.GetStoreDetails(baseInfo.SteamId.ToString(), steamLang); if (storeDetails != null) { gameInfo = new GameInfo { TwitchCategoryId = baseInfo.TwitchCategoryId, Name = baseInfo.Name, IGDBId = baseInfo.IGDBId, Summary = storeDetails.ShortDescription, Language = language, Source = "steam", SteamId = baseInfo.SteamId, }; } } await _gameLocalizationStore.SaveGameInfoAsync(gameInfo, cancellationToken); return(gameInfo); }
private async Task LoadAllEntries(CancellationToken cancellationToken) { _baseEntries = new Dictionary <string, GameInfo>(); _locEntries = new Dictionary <string, GameInfo>(); _steamEntries = new HashSet <GameInfo>(); _logger.LogInformation("Enumerating all generic category entries"); await foreach (var gameInfo in _gameLocalization.EnumerateGameInfoAsync("", cancellationToken)) { _baseEntries.Add(gameInfo.TwitchCategoryId, gameInfo); if (gameInfo.SteamId.HasValue) { _steamEntries.Add(gameInfo); } } _logger.LogInformation("Found {totalCount} categories in storage, {steamCount} have an associated Steam id.", _baseEntries.Count, _steamEntries.Count); _logger.LogInformation("Enumerating all category entries for locale {targetLanguage}", TargetLanguage); await foreach (var gameInfo in _gameLocalization.EnumerateGameInfoAsync(TargetLanguage, cancellationToken)) { _locEntries.Add(gameInfo.TwitchCategoryId, gameInfo); } _logger.LogInformation("Found {totalCount} categories for locale {targetLanguage} in storage.", _locEntries.Count, TargetLanguage); var missingEntryCount = _steamEntries.Where(g => !_locEntries.ContainsKey(g.TwitchCategoryId)).Count(); _logger.LogInformation("Found {totalCount} missing categories for locale {targetLanguage} in storage.", missingEntryCount, TargetLanguage); foreach (var steamGame in _steamEntries) { if (!_locEntries.ContainsKey(steamGame.TwitchCategoryId)) { var steamInfo = await _steamStoreClient.GetStoreDetails(steamGame.SteamId.ToString(), TargetLanguage); if (steamInfo != null) { var localizedGameInfo = new GameInfo { TwitchCategoryId = steamGame.TwitchCategoryId, Name = steamGame.Name, IGDBId = steamGame.IGDBId, Summary = steamInfo.ShortDescription, Language = TargetLanguage, Source = "steam", SteamId = steamInfo.SteamAppid }; _logger.LogInformation("Saving {locale} loc for game {gameName}(SteamId {steamId}).", TargetLanguage, steamGame.Name, steamInfo.SteamAppid); await _gameLocalization.SaveGameInfoAsync(localizedGameInfo, cancellationToken); } else { steamGame.SteamId = null; if (CleanupEntries) { _logger.LogWarning("No Steam store data found for game {gameName}(SteamId {steamId}), cleaning up the SteamId on master.", steamGame.Name, steamGame.SteamId); await _gameLocalization.SaveGameInfoAsync(steamGame, cancellationToken); } else { _logger.LogWarning("No Steam store data found for game {gameName}(SteamId {steamId}), add -c to clean up the association.", steamGame.Name, steamGame.SteamId); } } } } }