示例#1
0
        public async Task <IActionResult> Index()
        {
            var gameServerFilterModel = new GameServerFilterModel
            {
                Order = GameServerFilterModel.OrderBy.BannerServerListPosition
            }.ApplyAuthForServerAdmin(User);
            var servers = await _gameServersRepository.GetGameServers(gameServerFilterModel);

            var gameServerStatusFilterModel = new GameServerStatusFilterModel().ApplyAuthForGameServerStatus(User);
            var serversStatus = await _gameServerStatusRepository.GetAllStatusModels(gameServerStatusFilterModel, TimeSpan.Zero);

            var results = new List <ServersController.ServerInfoViewModel>();

            foreach (var server in servers)
            {
                var portalGameServerStatusDto = serversStatus.SingleOrDefault(ss => server.ServerId == ss.ServerId);

                if (portalGameServerStatusDto != null)
                {
                    results.Add(new ServersController.ServerInfoViewModel
                    {
                        GameServer       = server,
                        GameServerStatus = portalGameServerStatusDto
                    });
                }
            }

            return(View(results));
        }
示例#2
0
        public async Task <IActionResult> GameServerStatus()
        {
            var filterModel = new GameServerStatusFilterModel().ApplyAuthForGameServerStatus(User);

            var statusModel = await _gameServerStatusRepository.GetAllStatusModels(filterModel, TimeSpan.Zero);

            return(View(statusModel));
        }
示例#3
0
        // ReSharper disable once UnusedMember.Global
        public async Task RunUpdateGameServerStatus([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogDebug($"Start RunUpdateGameServerStatus @ {DateTime.UtcNow}");

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            _playerIngest.OverrideLogger(log);

            var servers = await _legacyContext.GameServers.AsQueryable().Where(server => server.ShowOnPortalServerList).ToListAsync();

            foreach (var server in servers)
            {
                log.LogDebug($"Updating game server status for {server.Title}");

                try
                {
                    var model = await _gameServerStatusRepository.GetStatus(server.ServerId, TimeSpan.FromMinutes(-1));

                    if (model == null)
                    {
                        log.LogWarning($"Failed to update game server status for {server.Title}");
                        continue;
                    }

                    log.LogInformation($"{model.ServerName} is online running {model.Map} with {model.PlayerCount} players connected");

                    await _gameServerStatusStatsRepository.UpdateEntry(new GameServerStatusStatsDto
                    {
                        ServerId    = server.ServerId,
                        GameType    = server.GameType,
                        PlayerCount = model.PlayerCount,
                        MapName     = model.Map
                    });

                    var playerGuid = string.Empty;
                    try
                    {
                        foreach (var player in model.Players)
                        {
                            playerGuid = player.Guid;
                            await _playerIngest.IngestData(server.GameType, player.Guid, player.Name, player.IpAddress);
                        }
                    }
                    catch (Exception ex)
                    {
                        log.LogError(ex, "Failed to ingest player data for guid: {Guid}", playerGuid);
                    }
                }
                catch (Exception ex)
                {
                    log.LogError(ex, "Failed to get game server status for {Title}", server.Title);
                }
            }

            foreach (var gameServerStatus in await _gameServerStatusRepository.GetAllStatusModels(new Servers.Models.GameServerStatusFilterModel(), TimeSpan.Zero))
            {
                var server = servers.SingleOrDefault(server => server.ServerId == gameServerStatus.ServerId);

                if (server == null)
                {
                    log.LogInformation($"Removing game server status as server is no longer being queried {gameServerStatus.ServerName}");
                    await _gameServerStatusRepository.DeleteStatusModel(gameServerStatus);

                    await _gameServerStatusStatsRepository.DeleteGameServerStatusStats(gameServerStatus.ServerId);
                }
            }

            stopWatch.Stop();
            log.LogDebug($"Stop RunUpdateGameServerStatus @ {DateTime.UtcNow} after {stopWatch.ElapsedMilliseconds} milliseconds");
        }
        // ReSharper disable once UnusedMember.Global
        public async Task RunSyncLogFileMonitorState([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogDebug($"Start RunSyncLogFileMonitorState @ {DateTime.UtcNow}");

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var filterModel  = new FileMonitorFilterModel();
            var fileMonitors = await _fileMonitorsRepository.GetFileMonitors(filterModel);

            var fileMonitorStates = await _logFileMonitorStateRepository.GetLogFileMonitorStates(filterModel);

            var gameServerStatus = await _gameServerStatusRepository.GetAllStatusModels(new GameServerStatusFilterModel(), TimeSpan.Zero);

            foreach (var fileMonitorDto in fileMonitors)
            {
                var fileMonitorState = fileMonitorStates.SingleOrDefault(fm => fm.FileMonitorId == fileMonitorDto.FileMonitorId);
                var statusModel      = gameServerStatus.SingleOrDefault(s => s.ServerId == fileMonitorDto.ServerId);

                var playerCount = 0;
                if (statusModel != null)
                {
                    playerCount = statusModel.PlayerCount;
                }

                if (fileMonitorState == null)
                {
                    await _logFileMonitorStateRepository.UpdateState(new LogFileMonitorStateDto
                    {
                        FileMonitorId   = fileMonitorDto.FileMonitorId,
                        ServerId        = fileMonitorDto.ServerId,
                        GameType        = fileMonitorDto.GameServer.GameType,
                        ServerTitle     = fileMonitorDto.GameServer.Title,
                        FilePath        = fileMonitorDto.FilePath,
                        FtpHostname     = fileMonitorDto.GameServer.FtpHostname,
                        FtpUsername     = fileMonitorDto.GameServer.FtpUsername,
                        FtpPassword     = fileMonitorDto.GameServer.FtpPassword,
                        RemoteSize      = -1,
                        LastReadAttempt = DateTime.UtcNow,
                        LastRead        = DateTime.UtcNow,
                        PlayerCount     = playerCount
                    });

                    log.LogInformation($"Creating new log file monitor state object for {fileMonitorDto.GameServer.Title} against path {fileMonitorDto.FilePath}");
                }
                else
                {
                    fileMonitorState.ServerTitle = fileMonitorDto.GameServer.Title;

                    if (fileMonitorState.FilePath != fileMonitorDto.FilePath)
                    {
                        fileMonitorState.FilePath        = fileMonitorDto.FilePath;
                        fileMonitorState.RemoteSize      = -1;
                        fileMonitorState.LastReadAttempt = DateTime.UtcNow;
                        fileMonitorState.LastRead        = DateTime.UtcNow;
                    }

                    if (fileMonitorState.FtpHostname != fileMonitorDto.GameServer.FtpHostname ||
                        fileMonitorState.FtpUsername != fileMonitorDto.GameServer.FtpUsername ||
                        fileMonitorState.FtpPassword != fileMonitorDto.GameServer.FtpPassword)
                    {
                        fileMonitorState.FtpHostname = fileMonitorDto.GameServer.FtpHostname;
                        fileMonitorState.FtpUsername = fileMonitorDto.GameServer.FtpUsername;
                        fileMonitorState.FtpPassword = fileMonitorDto.GameServer.FtpPassword;

                        if (FtpClients.ContainsKey(fileMonitorState.ServerId))
                        {
                            FtpClients.TryRemove(fileMonitorState.ServerId, out var ftpClient);
                            ftpClient?.Dispose();
                        }
                    }

                    fileMonitorState.PlayerCount = playerCount;

                    await _logFileMonitorStateRepository.UpdateState(fileMonitorState);
                }
            }

            foreach (var fileMonitorState in fileMonitorStates)
            {
                var fileMonitor = fileMonitors.SingleOrDefault(fm => fm.FileMonitorId == fileMonitorState.FileMonitorId);

                if (fileMonitor == null)
                {
                    log.LogInformation($"Removing file monitor state object as file monitor no longer exists for {fileMonitorState.ServerTitle} against path {fileMonitorState.FilePath}");
                    await _logFileMonitorStateRepository.DeleteLogFileMonitorState(fileMonitorState);
                }
            }

            stopWatch.Stop();
            log.LogDebug($"Stop RunSyncLogFileMonitorState @ {DateTime.UtcNow} after {stopWatch.ElapsedMilliseconds} milliseconds");
        }