internal static TableQuery <GameServerStatusStatsEntity> ApplyFilter(this TableQuery <GameServerStatusStatsEntity> query, GameServerStatusStatsFilterModel filterModel) { var serverIdFilter = TableQuery.GenerateFilterCondition(nameof(GameServerStatusStatsEntity.PartitionKey), QueryComparisons.Equal, filterModel.ServerId.ToString()); var gameTypeFilter = TableQuery.GenerateFilterCondition(nameof(GameServerStatusStatsEntity.GameType), QueryComparisons.Equal, filterModel.GameType.ToString()); var dateTimeFilter = string.Empty; if (filterModel.Cutoff != null) { dateTimeFilter = TableQuery.GenerateFilterConditionForDate(nameof(GameServerStatusStatsEntity.Timestamp), QueryComparisons.GreaterThanOrEqual, (DateTime)filterModel.Cutoff); } if (filterModel.ServerId != Guid.Empty && filterModel.Cutoff != null) { query = query.Where(TableQuery.CombineFilters(serverIdFilter, TableOperators.And, dateTimeFilter)).AsTableQuery(); } else if (filterModel.GameType != GameType.Unknown && filterModel.Cutoff != null) { query = query.Where(TableQuery.CombineFilters(gameTypeFilter, TableOperators.And, dateTimeFilter)).AsTableQuery(); } else if (filterModel.ServerId != Guid.Empty) { query = query.Where(serverIdFilter); } else if (filterModel.GameType != GameType.Unknown) { query = query.Where(gameTypeFilter); } return(query); }
public async Task <List <GameServerStatusStatsDto> > GetGameServerStatusStats(GameServerStatusStatsFilterModel filterModel) { if (filterModel == null) { throw new NullReferenceException(nameof(filterModel)); } var query = new TableQuery <GameServerStatusStatsEntity>().ApplyFilter(filterModel); var results = new List <GameServerStatusStatsDto>(); TableContinuationToken continuationToken = null; do { var queryResult = await _statsTable.ExecuteQuerySegmentedAsync(query, continuationToken); foreach (var entity in queryResult) { var gameServerStatusStatsDto = new GameServerStatusStatsDto { ServerId = Guid.Parse(entity.PartitionKey), GameType = entity.GameType, PlayerCount = entity.PlayerCount, MapName = entity.MapName, Timestamp = entity.Timestamp }; results.Add(gameServerStatusStatsDto); } continuationToken = queryResult.ContinuationToken; } while (continuationToken != null); switch (filterModel.Order) { case GameServerStatusStatsFilterModel.OrderBy.TimestampAsc: results = results.OrderBy(s => s.Timestamp).ToList(); break; case GameServerStatusStatsFilterModel.OrderBy.TimestampDesc: results = results.OrderByDescending(s => s.Timestamp).ToList(); break; } return(results); }
public async Task <IActionResult> ServerInfo(Guid id) { var gameServer = await _gameServersRepository.GetGameServer(id); var gameServerStatusDto = await _gameServerStatusRepository.GetStatus(id, TimeSpan.Zero); var serversFilterModel = new GameServerStatusStatsFilterModel { ServerId = gameServer.ServerId, Cutoff = DateTime.UtcNow.AddDays(-2), Order = GameServerStatusStatsFilterModel.OrderBy.TimestampAsc }; var gameServerStatusStatsDtos = await _gameServerStatusStatsRepository.GetGameServerStatusStats(serversFilterModel); var mapTimelineDataPoints = new List <MapTimelineDataPoint>(); DateTime?timestamp = null; string trackMap = null; if (gameServerStatusStatsDtos.Any()) { var lastItem = gameServerStatusStatsDtos.Last(); foreach (var item in gameServerStatusStatsDtos.Where(gss => gss.Timestamp > DateTime.UtcNow.AddDays(-1))) { if (trackMap == null) { trackMap = item.MapName; timestamp = item.Timestamp.UtcDateTime; } else { if (item == lastItem) { mapTimelineDataPoints.Add(new MapTimelineDataPoint { MapName = trackMap, Start = (DateTime)timestamp, Stop = item.Timestamp.UtcDateTime }); continue; } if (trackMap == item.MapName) { continue; } mapTimelineDataPoints.Add(new MapTimelineDataPoint { MapName = trackMap, Start = (DateTime)timestamp, Stop = item.Timestamp.UtcDateTime }); timestamp = item.Timestamp.UtcDateTime; trackMap = item.MapName; } } } MapDto map = null; if (gameServerStatusDto != null) { map = await _mapsRepository.GetMap(gameServerStatusDto.GameType, gameServerStatusDto.Map); } var mapsFilterModel = new MapsFilterModel { GameType = gameServer.GameType, MapNames = gameServerStatusStatsDtos.GroupBy(m => m.MapName).Select(m => m.Key).ToList() }; var maps = await _mapsRepository.GetMaps(mapsFilterModel); return(View(new ServerInfoViewModel { GameServer = gameServer, GameServerStatus = gameServerStatusDto, Map = map, Maps = maps, GameServerStatusStats = gameServerStatusStatsDtos, MapTimelineDataPoints = mapTimelineDataPoints })); }