Notifier.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using MediaBrowser.Common.Events;
  2. using MediaBrowser.Common.Plugins;
  3. using MediaBrowser.Common.ScheduledTasks;
  4. using MediaBrowser.Common.Updates;
  5. using MediaBrowser.Controller.Configuration;
  6. using MediaBrowser.Controller.Entities;
  7. using MediaBrowser.Controller.Library;
  8. using MediaBrowser.Controller.Notifications;
  9. using MediaBrowser.Controller.Plugins;
  10. using MediaBrowser.Model.Logging;
  11. using MediaBrowser.Model.Notifications;
  12. using MediaBrowser.Model.Tasks;
  13. using System;
  14. using System.Linq;
  15. using System.Threading;
  16. namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
  17. {
  18. /// <summary>
  19. /// Creates notifications for various system events
  20. /// </summary>
  21. public class Notifications : IServerEntryPoint
  22. {
  23. private readonly IInstallationManager _installationManager;
  24. private readonly IUserManager _userManager;
  25. private readonly ILogger _logger;
  26. private readonly ITaskManager _taskManager;
  27. private readonly INotificationManager _notificationManager;
  28. private IServerConfigurationManager _config;
  29. public Notifications(IInstallationManager installationManager, IUserManager userManager, ILogger logger, ITaskManager taskManager, INotificationManager notificationManager)
  30. {
  31. _installationManager = installationManager;
  32. _userManager = userManager;
  33. _logger = logger;
  34. _taskManager = taskManager;
  35. _notificationManager = notificationManager;
  36. }
  37. public void Run()
  38. {
  39. _installationManager.PackageInstallationCompleted += _installationManager_PackageInstallationCompleted;
  40. _installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed;
  41. _installationManager.PluginUninstalled += _installationManager_PluginUninstalled;
  42. _taskManager.TaskCompleted += _taskManager_TaskCompleted;
  43. _userManager.UserCreated += _userManager_UserCreated;
  44. }
  45. async void _userManager_UserCreated(object sender, GenericEventArgs<User> e)
  46. {
  47. var userIds = _userManager
  48. .Users
  49. .Select(i => i.Id.ToString("N"))
  50. .ToList();
  51. var notification = new NotificationRequest
  52. {
  53. UserIds = userIds,
  54. Name = "Welcome to Media Browser!",
  55. Description = "Check back here for more notifications."
  56. };
  57. try
  58. {
  59. await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
  60. }
  61. catch (Exception ex)
  62. {
  63. _logger.ErrorException("Error sending notification", ex);
  64. }
  65. }
  66. async void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
  67. {
  68. var result = e.Argument;
  69. if (result.Status == TaskCompletionStatus.Failed &&
  70. _config.Configuration.NotificationOptions.SendOnFailedTasks)
  71. {
  72. var userIds = _userManager
  73. .Users
  74. .Where(i => i.Configuration.IsAdministrator)
  75. .Select(i => i.Id.ToString("N"))
  76. .ToList();
  77. var notification = new NotificationRequest
  78. {
  79. UserIds = userIds,
  80. Name = result.Name + " failed",
  81. Description = result.ErrorMessage,
  82. Level = NotificationLevel.Error
  83. };
  84. try
  85. {
  86. await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
  87. }
  88. catch (Exception ex)
  89. {
  90. _logger.ErrorException("Error sending notification", ex);
  91. }
  92. }
  93. }
  94. async void _installationManager_PluginUninstalled(object sender, GenericEventArgs<IPlugin> e)
  95. {
  96. var plugin = e.Argument;
  97. var userIds = _userManager
  98. .Users
  99. .Where(i => i.Configuration.IsAdministrator)
  100. .Select(i => i.Id.ToString("N"))
  101. .ToList();
  102. var notification = new NotificationRequest
  103. {
  104. UserIds = userIds,
  105. Name = plugin.Name + " has been uninstalled"
  106. };
  107. try
  108. {
  109. await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
  110. }
  111. catch (Exception ex)
  112. {
  113. _logger.ErrorException("Error sending notification", ex);
  114. }
  115. }
  116. async void _installationManager_PackageInstallationCompleted(object sender, InstallationEventArgs e)
  117. {
  118. if (!_config.Configuration.NotificationOptions.SendOnUpdates)
  119. {
  120. return;
  121. }
  122. var installationInfo = e.InstallationInfo;
  123. var userIds = _userManager
  124. .Users
  125. .Where(i => i.Configuration.IsAdministrator)
  126. .Select(i => i.Id.ToString("N"))
  127. .ToList();
  128. var notification = new NotificationRequest
  129. {
  130. UserIds = userIds,
  131. Name = installationInfo.Name + " " + installationInfo.Version + " was installed",
  132. Description = e.PackageVersionInfo.description
  133. };
  134. try
  135. {
  136. await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
  137. }
  138. catch (Exception ex)
  139. {
  140. _logger.ErrorException("Error sending notification", ex);
  141. }
  142. }
  143. async void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e)
  144. {
  145. var installationInfo = e.InstallationInfo;
  146. var userIds = _userManager
  147. .Users
  148. .Where(i => i.Configuration.IsAdministrator)
  149. .Select(i => i.Id.ToString("N"))
  150. .ToList();
  151. var notification = new NotificationRequest
  152. {
  153. UserIds = userIds,
  154. Level = NotificationLevel.Error,
  155. Name = installationInfo.Name + " " + installationInfo.Version + " installation failed",
  156. Description = e.Exception.Message
  157. };
  158. try
  159. {
  160. await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
  161. }
  162. catch (Exception ex)
  163. {
  164. _logger.ErrorException("Error sending notification", ex);
  165. }
  166. }
  167. public void Dispose()
  168. {
  169. _installationManager.PackageInstallationCompleted -= _installationManager_PackageInstallationCompleted;
  170. _installationManager.PackageInstallationFailed -= _installationManager_PackageInstallationFailed;
  171. _installationManager.PluginUninstalled -= _installationManager_PluginUninstalled;
  172. _taskManager.TaskCompleted -= _taskManager_TaskCompleted;
  173. _userManager.UserCreated -= _userManager_UserCreated;
  174. }
  175. }
  176. }