Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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."));
        }