HttpStatusServer.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Text;
  3. using BsWidgetShareCodes;
  4. using Newtonsoft.Json;
  5. using WebSocketSharp;
  6. using WebSocketSharp.Server;
  7. using YUR.Fit.Core.Models;
  8. namespace BsYurHttpStatus
  9. {
  10. internal class HttpStatusServer
  11. {
  12. private int ServerPort = 6558;
  13. internal YurStatus Status { get; } = new YurStatus();
  14. internal event EventHandler StatusChanged;
  15. private HttpServer server;
  16. public void Start()
  17. {
  18. server = new HttpServer(ServerPort);
  19. server.OnGet += (sender, e) =>
  20. {
  21. OnHTTPGet(e);
  22. };
  23. server.AddWebSocketService<StatusBroadcastBehavior>("/socket", behavior => behavior.SetParent(this));
  24. Plugin.Log("Starting HTTP server on port " + ServerPort);
  25. server.Start();
  26. }
  27. public void Stop() => server.Stop();
  28. public void Update(OverlayStatusUpdate input)
  29. {
  30. Status.HeartRate = input.HeartRate ?? input.CalculationMetrics.EstHeartRate;
  31. Status.KcalPerMin = input.CalculationMetrics.BurnRate;
  32. StatusChanged?.Invoke(this, EventArgs.Empty);
  33. }
  34. private void OnHTTPGet(HttpRequestEventArgs e)
  35. {
  36. var res = e.Response;
  37. res.StatusCode = 200;
  38. res.ContentType = "application/json";
  39. res.ContentEncoding = Encoding.UTF8;
  40. var json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Status));
  41. res.ContentLength64 = json.Length;
  42. res.Close(json, false);
  43. }
  44. private class StatusBroadcastBehavior : WebSocketBehavior
  45. {
  46. private HttpStatusServer _parent;
  47. public void SetParent(HttpStatusServer httpStatusServer)
  48. {
  49. _parent = httpStatusServer;
  50. _parent.StatusChanged += StatusChanged;
  51. }
  52. protected override void OnOpen()
  53. {
  54. base.OnOpen();
  55. Send(JsonConvert.SerializeObject(_parent.Status));
  56. }
  57. protected override void OnClose(CloseEventArgs e)
  58. {
  59. base.OnClose(e);
  60. _parent.StatusChanged -= StatusChanged;
  61. }
  62. private void StatusChanged(object sender, EventArgs e)
  63. {
  64. Send(JsonConvert.SerializeObject(_parent.Status));
  65. }
  66. }
  67. }
  68. }