ActivityLogWebSocketListener.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. private bool _disposed;
  21. /// <summary>
  22. /// Initializes a new instance of the <see cref="ActivityLogWebSocketListener"/> class.
  23. /// </summary>
  24. /// <param name="logger">Instance of the <see cref="ILogger{ActivityLogWebSocketListener}"/> interface.</param>
  25. /// <param name="activityManager">Instance of the <see cref="IActivityManager"/> interface.</param>
  26. public ActivityLogWebSocketListener(ILogger<ActivityLogWebSocketListener> logger, IActivityManager activityManager)
  27. : base(logger)
  28. {
  29. _activityManager = activityManager;
  30. _activityManager.EntryCreated += OnEntryCreated;
  31. }
  32. /// <inheritdoc />
  33. protected override SessionMessageType Type => SessionMessageType.ActivityLogEntry;
  34. /// <inheritdoc />
  35. protected override SessionMessageType StartType => SessionMessageType.ActivityLogEntryStart;
  36. /// <inheritdoc />
  37. protected override SessionMessageType StopType => SessionMessageType.ActivityLogEntryStop;
  38. /// <summary>
  39. /// Gets the data to send.
  40. /// </summary>
  41. /// <returns>Task{SystemInfo}.</returns>
  42. protected override Task<ActivityLogEntry[]> GetDataToSend()
  43. {
  44. return Task.FromResult(Array.Empty<ActivityLogEntry>());
  45. }
  46. /// <inheritdoc />
  47. protected override async ValueTask DisposeAsyncCore()
  48. {
  49. if (!_disposed)
  50. {
  51. _activityManager.EntryCreated -= OnEntryCreated;
  52. _disposed = true;
  53. }
  54. await base.DisposeAsyncCore().ConfigureAwait(false);
  55. }
  56. /// <summary>
  57. /// Starts sending messages over an activity log web socket.
  58. /// </summary>
  59. /// <param name="message">The message.</param>
  60. protected override void Start(WebSocketMessageInfo message)
  61. {
  62. if (!message.Connection.AuthorizationInfo.IsApiKey
  63. && (message.Connection.AuthorizationInfo.User is null
  64. || !message.Connection.AuthorizationInfo.User.HasPermission(PermissionKind.IsAdministrator)))
  65. {
  66. throw new AuthenticationException("Only admin users can retrieve the activity log.");
  67. }
  68. base.Start(message);
  69. }
  70. private void OnEntryCreated(object? sender, GenericEventArgs<ActivityLogEntry> e)
  71. {
  72. SendData(true);
  73. }
  74. }