ActivityLogWebSocketListener.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Threading.Tasks;
  3. using Jellyfin.Data.Enums;
  4. using Jellyfin.Data.Events;
  5. using MediaBrowser.Controller.Authentication;
  6. using MediaBrowser.Controller.Net;
  7. using MediaBrowser.Model.Activity;
  8. using MediaBrowser.Model.Session;
  9. using Microsoft.Extensions.Logging;
  10. namespace Jellyfin.Api.WebSocketListeners;
  11. /// <summary>
  12. /// Class ActivityLogWebSocketListener.
  13. /// </summary>
  14. public class ActivityLogWebSocketListener : BasePeriodicWebSocketListener<ActivityLogEntry[], WebSocketListenerState>
  15. {
  16. /// <summary>
  17. /// The _kernel.
  18. /// </summary>
  19. private readonly IActivityManager _activityManager;
  20. /// <summary>
  21. /// Initializes a new instance of the <see cref="ActivityLogWebSocketListener"/> class.
  22. /// </summary>
  23. /// <param name="logger">Instance of the <see cref="ILogger{ActivityLogWebSocketListener}"/> interface.</param>
  24. /// <param name="activityManager">Instance of the <see cref="IActivityManager"/> interface.</param>
  25. public ActivityLogWebSocketListener(ILogger<ActivityLogWebSocketListener> logger, IActivityManager activityManager)
  26. : base(logger)
  27. {
  28. _activityManager = activityManager;
  29. _activityManager.EntryCreated += OnEntryCreated;
  30. }
  31. /// <inheritdoc />
  32. protected override SessionMessageType Type => SessionMessageType.ActivityLogEntry;
  33. /// <inheritdoc />
  34. protected override SessionMessageType StartType => SessionMessageType.ActivityLogEntryStart;
  35. /// <inheritdoc />
  36. protected override SessionMessageType StopType => SessionMessageType.ActivityLogEntryStop;
  37. /// <summary>
  38. /// Gets the data to send.
  39. /// </summary>
  40. /// <returns>Task{SystemInfo}.</returns>
  41. protected override Task<ActivityLogEntry[]> GetDataToSend()
  42. {
  43. return Task.FromResult(Array.Empty<ActivityLogEntry>());
  44. }
  45. /// <inheritdoc />
  46. protected override void Dispose(bool dispose)
  47. {
  48. if (dispose)
  49. {
  50. _activityManager.EntryCreated -= OnEntryCreated;
  51. }
  52. base.Dispose(dispose);
  53. }
  54. /// <summary>
  55. /// Starts sending messages over an activity log web socket.
  56. /// </summary>
  57. /// <param name="message">The message.</param>
  58. protected override void Start(WebSocketMessageInfo message)
  59. {
  60. if (!message.Connection.AuthorizationInfo.User.HasPermission(PermissionKind.IsAdministrator))
  61. {
  62. throw new AuthenticationException("Only admin users can retrieve the activity log.");
  63. }
  64. base.Start(message);
  65. }
  66. private async void OnEntryCreated(object? sender, GenericEventArgs<ActivityLogEntry> e)
  67. {
  68. await SendData(true).ConfigureAwait(false);
  69. }
  70. }