private void ProcessNewMatches(GameCoordinatorClient gameCoordinatorClient, ShareCodeRepository shareCodeRepository, MatchRepository matchRepository) { var newSharingCodes = shareCodeRepository.GetRetryableBatch(5); if (!newSharingCodes.Any()) { return; } myLogger.LogDebug($"Retrieved {newSharingCodes.Count} new sharing codes: {string.Join(", ", newSharingCodes.Select(x => x.Code))}"); var newMatches = new List <Match>(); var demoDownloader = new DemoDownloader(myLoggerFactory.CreateLogger <DemoDownloader>()); var demoBackuper = new DemoBackuper(myLoggerFactory.CreateLogger <DemoBackuper>()); foreach (var sharingCode in newSharingCodes) { var demo = CreateNewDemoForShareCode(sharingCode); try { var match = gameCoordinatorClient.GetMatchInfo(demo); myLogger.LogTrace($"Got match details for sharing code {sharingCode.Code}"); match.Demo.FilePath = demoDownloader.DownloadAndDecompressDemo(match.Demo.DownloadURL); myLogger.LogTrace($"Downloaded and decompressed demo file for sharing code {sharingCode.Code}"); using var demoReader = new DemoReader(match, 0, 0); match = demoReader.Parse(); myLogger.LogTrace($"Finished analyzing demo file for sharing code {sharingCode.Code}"); newMatches.Add(match); } catch (GameCoordinatorException) { myLogger.LogWarning($"Couldn't get download url for sharing code {sharingCode.Code}. See previous logs/exceptions for explanation. Continuing."); continue; } catch (DemoDownloaderException exception) { myLogger.LogWarning($"Demo downloading or decompressing failed: {exception.Message} for sharing code {sharingCode.Code}."); continue; } catch (DemoReaderException e) { myLogger.LogWarning($"Analyzing demo for share code {sharingCode.Code} failed: {e.Message}"); demo.State = DemoState.ParseFailure; continue; } finally { TryBackupDemo(demo, demoBackuper); } } myLogger.LogDebug($"Downloaded and analyzed {newMatches.Count} new matches (from {newSharingCodes.Count} new sharing codes)."); myLogger.LogTrace($"Saving {newMatches.Count} new matches to repository."); var successfullySavedMatches = matchRepository.AddMatchesAndSave(newMatches); shareCodeRepository.RemoveCodes(successfullySavedMatches.Select(x => x.Demo.ShareCode)); }
private static void PruneShareCodeRepository(ShareCodeRepository shareCodeRepository, MatchRepository matchRepository) { var alreadyProcessedSharingCodes = matchRepository.Matches.Include("Demo").AsEnumerable().Select(x => x.Demo.ShareCode); shareCodeRepository.RemoveCodes(alreadyProcessedSharingCodes); }