FirebaseSessionController.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using MediaBrowser.Controller.Session;
  2. using MediaBrowser.Model.Net;
  3. using MediaBrowser.Common.Net;
  4. using MediaBrowser.Model.Serialization;
  5. using System;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using System.Text;
  9. using MediaBrowser.Common;
  10. namespace Emby.Server.Implementations.Session
  11. {
  12. public class FirebaseSessionController : ISessionController
  13. {
  14. private readonly IHttpClient _httpClient;
  15. private readonly IJsonSerializer _json;
  16. private readonly ISessionManager _sessionManager;
  17. public SessionInfo Session { get; private set; }
  18. private readonly string _token;
  19. private IApplicationHost _appHost;
  20. private string _senderId;
  21. private string _applicationId;
  22. public FirebaseSessionController(IHttpClient httpClient,
  23. IApplicationHost appHost,
  24. IJsonSerializer json,
  25. SessionInfo session,
  26. string token, ISessionManager sessionManager)
  27. {
  28. _httpClient = httpClient;
  29. _json = json;
  30. _appHost = appHost;
  31. Session = session;
  32. _token = token;
  33. _sessionManager = sessionManager;
  34. _applicationId = _appHost.GetValue("firebase_applicationid");
  35. _senderId = _appHost.GetValue("firebase_senderid");
  36. }
  37. public static bool IsSupported(IApplicationHost appHost)
  38. {
  39. return !string.IsNullOrEmpty(appHost.GetValue("firebase_applicationid")) && !string.IsNullOrEmpty(appHost.GetValue("firebase_senderid"));
  40. }
  41. public bool IsSessionActive
  42. {
  43. get
  44. {
  45. return (DateTime.UtcNow - Session.LastActivityDate).TotalDays <= 3;
  46. }
  47. }
  48. public bool SupportsMediaControl
  49. {
  50. get { return true; }
  51. }
  52. public async Task SendMessage<T>(string name, string messageId, T data, ISessionController[] allControllers, CancellationToken cancellationToken)
  53. {
  54. if (!IsSessionActive)
  55. {
  56. return;
  57. }
  58. if (string.IsNullOrEmpty(_senderId) || string.IsNullOrEmpty(_applicationId))
  59. {
  60. return;
  61. }
  62. foreach (var controller in allControllers)
  63. {
  64. // Don't send if there's an active web socket connection
  65. if ((controller is WebSocketController) && controller.IsSessionActive)
  66. {
  67. return;
  68. }
  69. }
  70. var msg = new WebSocketMessage<T>
  71. {
  72. Data = data,
  73. MessageType = name,
  74. MessageId = messageId,
  75. ServerId = _appHost.SystemId
  76. };
  77. var req = new FirebaseBody<T>
  78. {
  79. to = _token,
  80. data = msg
  81. };
  82. var byteArray = Encoding.UTF8.GetBytes(_json.SerializeToString(req));
  83. var enableLogging = false;
  84. #if DEBUG
  85. enableLogging = true;
  86. #endif
  87. var options = new HttpRequestOptions
  88. {
  89. Url = "https://fcm.googleapis.com/fcm/send",
  90. RequestContentType = "application/json",
  91. RequestContentBytes = byteArray,
  92. CancellationToken = cancellationToken,
  93. LogRequest = enableLogging,
  94. LogResponse = enableLogging,
  95. LogErrors = enableLogging
  96. };
  97. options.RequestHeaders["Authorization"] = string.Format("key={0}", _applicationId);
  98. options.RequestHeaders["Sender"] = string.Format("id={0}", _senderId);
  99. using (var response = await _httpClient.Post(options).ConfigureAwait(false))
  100. {
  101. }
  102. }
  103. }
  104. internal class FirebaseBody<T>
  105. {
  106. public string to { get; set; }
  107. public WebSocketMessage<T> data { get; set; }
  108. }
  109. }