public async Task UpdateStatus(Guid id, PortalGameServerStatusDto model)
        {
            var gameServerStatusEntity = new PortalGameServerStatusEntity(id, model);

            var operation = TableOperation.InsertOrMerge(gameServerStatusEntity);
            await _statusTable.ExecuteAsync(operation);
        }
        public async Task <PortalGameServerStatusDto> GetStatus(Guid serverId, TimeSpan cacheCutoff)
        {
            var tableOperation = TableOperation.Retrieve <PortalGameServerStatusEntity>("status", serverId.ToString());
            var result         = await _statusTable.ExecuteAsync(tableOperation);

            if (result.HttpStatusCode == 404)
            {
                return(await RefreshGameServerStatus(serverId));
            }

            var storedGameServerStatus = (PortalGameServerStatusEntity)result.Result;

            if (cacheCutoff != TimeSpan.Zero && storedGameServerStatus.Timestamp < DateTime.UtcNow + cacheCutoff)
            {
                return(await RefreshGameServerStatus(serverId));
            }

            var gameServerStatusDto = new PortalGameServerStatusDto
            {
                ServerId    = storedGameServerStatus.ServerId,
                GameType    = storedGameServerStatus.GameType,
                Hostname    = storedGameServerStatus.Hostname,
                QueryPort   = storedGameServerStatus.QueryPort,
                ServerName  = storedGameServerStatus.ServerName,
                Map         = storedGameServerStatus.Map,
                Mod         = storedGameServerStatus.Mod,
                PlayerCount = storedGameServerStatus.PlayerCount,
                MaxPlayers  = storedGameServerStatus.MaxPlayers,
                Players     = storedGameServerStatus.Players,
                Timestamp   = storedGameServerStatus.Timestamp
            };

            return(gameServerStatusDto);
        }
        public async Task <List <PortalGameServerStatusDto> > GetAllStatusModels(GameServerStatusFilterModel filterModel, TimeSpan cacheCutoff)
        {
            var query = new TableQuery <PortalGameServerStatusEntity>().AsTableQuery();

            var results = new List <PortalGameServerStatusDto>();

            TableContinuationToken continuationToken = null;

            do
            {
                var queryResult = await _statusTable.ExecuteQuerySegmentedAsync(query, continuationToken);

                foreach (var entity in queryResult)
                {
                    if (cacheCutoff != TimeSpan.Zero && entity.Timestamp < DateTime.UtcNow + cacheCutoff)
                    {
                        var refreshedGameServerStatusDto = await RefreshGameServerStatus(entity.ServerId);

                        results.Add(refreshedGameServerStatusDto);
                        continue;
                    }

                    var gameServerStatusDto = new PortalGameServerStatusDto
                    {
                        ServerId    = entity.ServerId,
                        GameType    = entity.GameType,
                        ServerName  = entity.ServerName,
                        Hostname    = entity.Hostname,
                        QueryPort   = entity.QueryPort,
                        Map         = entity.Map,
                        Mod         = entity.Mod,
                        PlayerCount = entity.PlayerCount,
                        MaxPlayers  = entity.MaxPlayers,
                        Players     = entity.Players,
                        Timestamp   = entity.Timestamp
                    };

                    results.Add(gameServerStatusDto);
                }

                continuationToken = queryResult.ContinuationToken;
            } while (continuationToken != null);

            var toReturn = results.Where(server => server != null).AsQueryable();

            if (filterModel.GameTypes != null && filterModel.GameTypes.Any())
            {
                toReturn = toReturn.Where(server => filterModel.GameTypes.Contains(server.GameType)).AsQueryable();
            }

            if (filterModel.ServerIds != null && filterModel.ServerIds.Any())
            {
                toReturn = toReturn.Where(server => filterModel.ServerIds.Contains(server.ServerId)).AsQueryable();
            }

            return(toReturn.ToList());
        }
        public async Task DeleteStatusModel(PortalGameServerStatusDto model)
        {
            var tableOperation = TableOperation.Retrieve <PortalGameServerStatusEntity>("status", model.ServerId.ToString());
            var result         = await _statusTable.ExecuteAsync(tableOperation);

            if (result.HttpStatusCode == 404)
            {
                return;
            }

            var logFileMonitorStateEntity = (PortalGameServerStatusEntity)result.Result;
            var operation = TableOperation.Delete(logFileMonitorStateEntity);

            await _statusTable.ExecuteAsync(operation);
        }
Пример #5
0
        public PortalGameServerStatusEntity(Guid serverId, PortalGameServerStatusDto gameServerStatus)
        {
            RowKey       = serverId.ToString();
            PartitionKey = "status";

            Hostname    = gameServerStatus.Hostname;
            QueryPort   = gameServerStatus.QueryPort;
            ServerId    = gameServerStatus.ServerId;
            GameType    = gameServerStatus.GameType;
            ServerName  = gameServerStatus.ServerName;
            Map         = gameServerStatus.Map;
            Mod         = gameServerStatus.Mod;
            PlayerCount = gameServerStatus.PlayerCount;
            MaxPlayers  = gameServerStatus.MaxPlayers;
            Players     = gameServerStatus.Players;
        }
        private async Task <PortalGameServerStatusDto> RefreshGameServerStatus(Guid serverId)
        {
            try
            {
                var server = await _gameServersRepository.GetGameServer(serverId);

                var gameServerStatusHelper = _gameServerClientFactory.GetGameServerStatusHelper(server.GameType, server.ServerId, server.Hostname, server.QueryPort, server.RconPassword);

                var gameServerStatus = await gameServerStatusHelper.GetServerStatus();

                if (gameServerStatus == null)
                {
                    return(null);
                }

                var model = new PortalGameServerStatusDto
                {
                    ServerId    = serverId,
                    GameType    = server.GameType,
                    Hostname    = server.Hostname,
                    QueryPort   = server.QueryPort,
                    MaxPlayers  = gameServerStatus.MaxPlayers,
                    ServerName  = gameServerStatus.ServerName,
                    Map         = gameServerStatus.Map,
                    Mod         = gameServerStatus.Mod,
                    PlayerCount = gameServerStatus.PlayerCount
                };

                var players = new List <PortalGameServerPlayerDto>();

                foreach (var player in gameServerStatus.Players)
                {
                    var playerDto = new PortalGameServerPlayerDto
                    {
                        Num       = player.Num,
                        Guid      = player.Guid,
                        Name      = player.Name,
                        IpAddress = player.IpAddress,
                        Score     = player.Score,
                        Rate      = player.Rate
                    };

                    if (!string.IsNullOrWhiteSpace(player.IpAddress))
                    {
                        var geoLocationResponse = await _geoLocationClient.LookupAddress(playerDto.IpAddress);

                        if (geoLocationResponse.Success)
                        {
                            playerDto.GeoLocation = geoLocationResponse.GeoLocationDto;

                            await _playersLocationsRepository.UpdateEntry(new PlayerLocationDto
                            {
                                GameType    = server.GameType,
                                ServerId    = server.ServerId,
                                ServerName  = gameServerStatus.ServerName,
                                Guid        = player.Guid,
                                PlayerName  = player.Name,
                                GeoLocation = geoLocationResponse.GeoLocationDto
                            });
                        }
                    }

                    players.Add(playerDto);
                }

                model.Players = players;

                await UpdateStatus(serverId, model);

                return(model);
            }
            catch
            {
                return(null);
            }
        }