using System; using System.Text; using BsWidgetShareCodes; using Newtonsoft.Json; using WebSocketSharp; using WebSocketSharp.Server; using YUR.Fit.Core.Models; namespace BsYurHttpStatus { internal class HttpStatusServer { private int ServerPort = 6558; internal YurStatus Status { get; } = new YurStatus(); internal event EventHandler StatusChanged; private HttpServer server; public void Start() { server = new HttpServer(ServerPort); server.OnGet += (sender, e) => { OnHTTPGet(e); }; server.AddWebSocketService("/socket", behavior => behavior.SetParent(this)); Plugin.Log("Starting HTTP server on port " + ServerPort); server.Start(); } public void Stop() => server.Stop(); public void Update(OverlayStatusUpdate input) { Status.HeartRate = input.HeartRate ?? input.CalculationMetrics.EstHeartRate; Status.KcalPerMin = input.CalculationMetrics.BurnRate; StatusChanged?.Invoke(this, EventArgs.Empty); } private void OnHTTPGet(HttpRequestEventArgs e) { var res = e.Response; res.StatusCode = 200; res.ContentType = "application/json"; res.ContentEncoding = Encoding.UTF8; var json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Status)); res.ContentLength64 = json.Length; res.Close(json, false); } private class StatusBroadcastBehavior : WebSocketBehavior { private HttpStatusServer _parent; public void SetParent(HttpStatusServer httpStatusServer) { _parent = httpStatusServer; _parent.StatusChanged += StatusChanged; } protected override void OnOpen() { base.OnOpen(); Send(JsonConvert.SerializeObject(_parent.Status)); } protected override void OnClose(CloseEventArgs e) { base.OnClose(e); _parent.StatusChanged -= StatusChanged; } private void StatusChanged(object sender, EventArgs e) { Send(JsonConvert.SerializeObject(_parent.Status)); } } } }