예제 #1
0
        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);
        }
예제 #2
0
        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);
                        }
                    }
                }
            }
        }