using BsWidgetShareCodes; using Newtonsoft.Json; using System; using System.Text; 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.SuckFloatProperty("EstHeartRate"); Status.KcalPerMin = input.SuckFloatProperty("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)); } } } }