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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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
            }));
        }