protected override async Task RunInterval() { await using var conn = await _db.Obtain(); var sim = await _updateStore.GetLatestUpdate(conn, UpdateType.Sim); var(season, dayStart) = (sim.Data.Value <int>("season"), sim.Data.Value <int>("day")); var updates = new List <GameUpdate>(); for (var day = dayStart + 1; day < 100; day++) { var jsonStr = await _client.GetStringAsync($"https://www.blaseball.com/database/games?season={season}&day={day}"); var timestamp = _clock.GetCurrentInstant(); var json = JArray.Parse(jsonStr); _logger.Information("Polled future games at season {Season} day {Day}", season, day); updates.AddRange(json.Select(game => GameUpdate.From(_sourceId, timestamp, game))); } await using (var tx = await conn.BeginTransactionAsync()) { await _gameUpdateStore.SaveGameUpdates(conn, updates); await tx.CommitAsync(); } await _gameStore.TryAddNewGameIds(conn, updates.Select(gu => gu.GameId)); }
private async Task <List <GameUpdate> > FetchGamesAt(string sim, int tournament, int season, int day) { var sw = new Stopwatch(); sw.Start(); var cacheBust = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var url = $"https://api.blaseball.com/database/games?season={season}&day={day}&tournament={tournament}&cache={cacheBust}"; var jsonStr = await _client.GetStringAsync(url); sw.Stop(); var timestamp = _clock.GetCurrentInstant(); var json = JArray.Parse(jsonStr); var games = json.Where(g => g["sim"].Value <string?>() == sim).ToList(); var maxPlayCount = games.Count > 0 ? games.Max(t => t["playCount"].Value <int?>() ?? -1) : -1; _logger.Information("Polled games endpoint at sim {Sim} season {Season} tournament {Tournament} day {Day} (combined hash {Hash}, max PC {MaxPlayCount}, took {Duration})", sim, season, tournament, day, SibrHash.HashAsGuid(json), maxPlayCount, sw.Elapsed); var updates = games .Select(game => GameUpdate.From(_sourceId, timestamp, game)) .ToList(); return(updates); }
private async Task <List <GameUpdate> > FetchGamesAt(int season, int day) { var sw = new Stopwatch(); sw.Start(); var jsonStr = await _client.GetStringAsync($"https://www.blaseball.com/database/games?season={season}&day={day}"); sw.Stop(); var timestamp = _clock.GetCurrentInstant(); var json = JArray.Parse(jsonStr); _logger.Information("Polled games endpoint at season {Season} day {Day} (combined hash {Hash}, took {Duration})", season, day, SibrHash.HashAsGuid(json), sw.Elapsed); var updates = json .Select(game => GameUpdate.From(_sourceId, timestamp, game)) .ToList(); return(updates); }
public async Task <IActionResult> SaveGameUpdates([FromQuery, Required] Guid source, [FromBody] IEnumerable <IngestGameUpdate> updates) { if (!IsOnAllowedPort()) { return(Unauthorized()); } var gameUpdates = updates .Select(u => GameUpdate.From(source, u.Timestamp, JToken.Parse(u.Data.GetRawText()))) .ToList(); _logger.Information("Receiving {Count} game updates from source {Source}", gameUpdates.Count, source); await using var conn = await _db.Obtain(); await using var tx = await conn.BeginTransactionAsync(); await _gameUpdateStore.SaveGameUpdates(conn, gameUpdates); await tx.CommitAsync(); return(Ok($"Saved {gameUpdates.Count} game updates.")); }