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)); }
public async Task <IActionResult> GameServerStatus() { var filterModel = new GameServerStatusFilterModel().ApplyAuthForGameServerStatus(User); var statusModel = await _gameServerStatusRepository.GetAllStatusModels(filterModel, TimeSpan.Zero); return(View(statusModel)); }
// 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"); }