public async Task <IJResponse> AdvertiseHeartbeat( [FromServices] IServerRepository serverRepository, [FromBody] JAdvertiseHeartbeatRequest body) { Server server = await serverRepository.GetByToken(body.token); if (server == null) { return(JResponse.Error("Server not registered.")); } server.Players = body.players; server.GameInfo = body.gameInfo; server.LastHeartbeat = DateTime.Now; await serverRepository.AddOrUpdate(server); return(ConvertResponse(JResponse.OK())); }
public async Task <IJResponse> AdvertiseServer( [FromServices] IServerRepository serverRepository, [FromServices] Random random, [FromBody] JAdvertiseServerRequest body) { var remoteAddress = GetRemoteAddress(); if (String.IsNullOrEmpty(remoteAddress)) { return(JResponse.Error(JErrorMessages.ServerError)); } JServerInfo serverInfo; try { string serverInfoJson; using (var client = new OpenRCT2Client()) { _logger.LogInformation("Connecting to {0}:{1}", remoteAddress, body.port); await client.Connect(remoteAddress, body.port); _logger.LogInformation("Requesting server info from {0}:{1}", remoteAddress, body.port); serverInfoJson = await client.RequestServerInfo(); } serverInfo = JsonConvert.DeserializeObject <JServerInfo>(serverInfoJson); } catch (SocketException) { return(ConvertResponse(JResponse.Error("Unable to connect to server, make sure your ports are open."))); } catch (TimeoutException) { return(ConvertResponse(JResponse.Error("Timed out while waiting for server response."))); } catch { return(ConvertResponse(JResponse.Error("Unable to advertise server."))); } var token = random.NextBytes(8) .ToHexString(); var server = new Server() { Token = token, LastHeartbeat = DateTime.Now, Addresses = new ServerAddressList() { IPv4 = new string[] { remoteAddress }, IPv6 = new string[0] }, Port = body.port, Name = serverInfo.name, Description = serverInfo.description, Provider = serverInfo.provider, RequiresPassword = serverInfo.requiresPassword, Players = serverInfo.players, MaxPlayers = serverInfo.maxPlayers, Version = serverInfo.version }; _logger.LogInformation("Registering server {0} [{1}:{2}]", serverInfo.name, remoteAddress, body.port); await serverRepository.AddOrUpdate(server); var response = new JAdvertiseServerResponse() { status = JStatus.OK, token = token }; return(ConvertResponse(response)); }