using System; using System.Linq; using System.Threading.Tasks; using RestEase; namespace IW4MAdmin.Application.API.Master { /// /// Defines the heartbeat functionality for IW4MAdmin /// public class Heartbeat { /// /// Sends heartbeat to master server /// /// /// /// public static async Task Send(ApplicationManager mgr, bool firstHeartbeat = false) { var api = Endpoint.Get(); if (firstHeartbeat) { var token = await api.Authenticate(new AuthenticationId() { Id = mgr.GetApplicationSettings().Configuration().Id }); api.AuthorizationToken = $"Bearer {token.AccessToken}"; } var instance = new ApiInstance() { Id = mgr.GetApplicationSettings().Configuration().Id, Uptime = (int)(DateTime.UtcNow - mgr.StartTime).TotalSeconds, Version = Program.Version, Servers = mgr.Servers.Select(s => new ApiServer() { ClientNum = s.ClientNum, Game = s.GameName.ToString(), Version = s.Version, Gametype = s.Gametype, Hostname = s.Hostname, Map = s.CurrentMap.Name, MaxClientNum = s.MaxClients, Id = s.EndPoint, Port = (short)s.Port, IPAddress = s.IP }).ToList() }; Response response = null; if (firstHeartbeat) { response = await api.AddInstance(instance); } else { response = await api.UpdateInstance(instance.Id, instance); } if (response.ResponseMessage.StatusCode != System.Net.HttpStatusCode.OK) { mgr.Logger.WriteWarning($"Response code from master is {response.ResponseMessage.StatusCode}, message is {response.StringContent}"); } } } }