Notifier.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. using MediaBrowser.Common.Events;
  2. using MediaBrowser.Common.Plugins;
  3. using MediaBrowser.Common.ScheduledTasks;
  4. using MediaBrowser.Common.Updates;
  5. using MediaBrowser.Controller;
  6. using MediaBrowser.Controller.Configuration;
  7. using MediaBrowser.Controller.Entities;
  8. using MediaBrowser.Controller.Library;
  9. using MediaBrowser.Controller.Notifications;
  10. using MediaBrowser.Controller.Plugins;
  11. using MediaBrowser.Controller.Session;
  12. using MediaBrowser.Model.Entities;
  13. using MediaBrowser.Model.Logging;
  14. using MediaBrowser.Model.Notifications;
  15. using MediaBrowser.Model.Tasks;
  16. using System;
  17. using System.Linq;
  18. using System.Threading;
  19. using System.Threading.Tasks;
  20. namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
  21. {
  22. /// <summary>
  23. /// Creates notifications for various system events
  24. /// </summary>
  25. public class Notifications : IServerEntryPoint
  26. {
  27. private readonly IInstallationManager _installationManager;
  28. private readonly IUserManager _userManager;
  29. private readonly ILogger _logger;
  30. private readonly ITaskManager _taskManager;
  31. private readonly INotificationManager _notificationManager;
  32. private readonly IServerConfigurationManager _config;
  33. private readonly ILibraryManager _libraryManager;
  34. private readonly ISessionManager _sessionManager;
  35. private readonly IServerApplicationHost _appHost;
  36. public Notifications(IInstallationManager installationManager, IUserManager userManager, ILogger logger, ITaskManager taskManager, INotificationManager notificationManager, IServerConfigurationManager config, ILibraryManager libraryManager, ISessionManager sessionManager, IServerApplicationHost appHost)
  37. {
  38. _installationManager = installationManager;
  39. _userManager = userManager;
  40. _logger = logger;
  41. _taskManager = taskManager;
  42. _notificationManager = notificationManager;
  43. _config = config;
  44. _libraryManager = libraryManager;
  45. _sessionManager = sessionManager;
  46. _appHost = appHost;
  47. }
  48. public void Run()
  49. {
  50. _installationManager.PackageInstallationCompleted += _installationManager_PackageInstallationCompleted;
  51. _installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed;
  52. _installationManager.PluginUninstalled += _installationManager_PluginUninstalled;
  53. _taskManager.TaskCompleted += _taskManager_TaskCompleted;
  54. _userManager.UserCreated += _userManager_UserCreated;
  55. _libraryManager.ItemAdded += _libraryManager_ItemAdded;
  56. _sessionManager.PlaybackStart += _sessionManager_PlaybackStart;
  57. _appHost.HasPendingRestartChanged += _appHost_HasPendingRestartChanged;
  58. _appHost.HasUpdateAvailableChanged += _appHost_HasUpdateAvailableChanged;
  59. }
  60. async void _appHost_HasUpdateAvailableChanged(object sender, EventArgs e)
  61. {
  62. // This notification is for users who can't auto-update (aka running as service)
  63. if (!_appHost.HasUpdateAvailable || _appHost.CanSelfUpdate || !_config.Configuration.NotificationOptions.SendOnUpdates)
  64. {
  65. return;
  66. }
  67. var userIds = _userManager
  68. .Users
  69. .Where(i => i.Configuration.IsAdministrator)
  70. .Select(i => i.Id.ToString("N"))
  71. .ToList();
  72. var notification = new NotificationRequest
  73. {
  74. UserIds = userIds,
  75. Name = "A new version of Media Browser is available.",
  76. Description = "Please see mediabrowser3.com for details."
  77. };
  78. await SendNotification(notification).ConfigureAwait(false);
  79. }
  80. async void _appHost_HasPendingRestartChanged(object sender, EventArgs e)
  81. {
  82. if (!_appHost.HasPendingRestart || !_config.Configuration.NotificationOptions.SendOnUpdates)
  83. {
  84. return;
  85. }
  86. var userIds = _userManager
  87. .Users
  88. .Where(i => i.Configuration.IsAdministrator)
  89. .Select(i => i.Id.ToString("N"))
  90. .ToList();
  91. var notification = new NotificationRequest
  92. {
  93. UserIds = userIds,
  94. Name = "Please restart Media Browser to finish updating"
  95. };
  96. await SendNotification(notification).ConfigureAwait(false);
  97. }
  98. async void _sessionManager_PlaybackStart(object sender, PlaybackProgressEventArgs e)
  99. {
  100. if (!NotifyOnPlayback(e.MediaInfo.MediaType))
  101. {
  102. return;
  103. }
  104. var userIds = _userManager
  105. .Users
  106. .Where(i => i.Configuration.IsAdministrator)
  107. .Select(i => i.Id.ToString("N"))
  108. .ToList();
  109. var item = e.MediaInfo;
  110. var msgName = "playing " + item.Name;
  111. var user = e.Users.FirstOrDefault();
  112. if (user != null)
  113. {
  114. msgName = user.Name + " " + msgName;
  115. }
  116. var notification = new NotificationRequest
  117. {
  118. UserIds = userIds,
  119. Name = msgName
  120. };
  121. await SendNotification(notification).ConfigureAwait(false);
  122. }
  123. private bool NotifyOnPlayback(string mediaType)
  124. {
  125. if (string.Equals(mediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
  126. {
  127. return _config.Configuration.NotificationOptions.SendOnAudioPlayback;
  128. }
  129. if (string.Equals(mediaType, MediaType.Game, StringComparison.OrdinalIgnoreCase))
  130. {
  131. return _config.Configuration.NotificationOptions.SendOnGamePlayback;
  132. }
  133. if (string.Equals(mediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
  134. {
  135. return _config.Configuration.NotificationOptions.SendOnVideoPlayback;
  136. }
  137. return false;
  138. }
  139. async void _libraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
  140. {
  141. if (_config.Configuration.NotificationOptions.SendOnNewLibraryContent &&
  142. e.Item.LocationType == LocationType.FileSystem)
  143. {
  144. var userIds = _userManager
  145. .Users
  146. .Where(i => i.Configuration.IsAdministrator)
  147. .Select(i => i.Id.ToString("N"))
  148. .ToList();
  149. var item = e.Item;
  150. var notification = new NotificationRequest
  151. {
  152. UserIds = userIds,
  153. Name = item.Name + " added to library."
  154. };
  155. await SendNotification(notification).ConfigureAwait(false);
  156. }
  157. }
  158. async void _userManager_UserCreated(object sender, GenericEventArgs<User> e)
  159. {
  160. var userIds = _userManager
  161. .Users
  162. .Select(i => i.Id.ToString("N"))
  163. .ToList();
  164. var notification = new NotificationRequest
  165. {
  166. UserIds = userIds,
  167. Name = "Welcome to Media Browser!",
  168. Description = "Check back here for more notifications."
  169. };
  170. await SendNotification(notification).ConfigureAwait(false);
  171. }
  172. async void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
  173. {
  174. var result = e.Argument;
  175. if (result.Status == TaskCompletionStatus.Failed &&
  176. _config.Configuration.NotificationOptions.SendOnFailedTasks)
  177. {
  178. var userIds = _userManager
  179. .Users
  180. .Where(i => i.Configuration.IsAdministrator)
  181. .Select(i => i.Id.ToString("N"))
  182. .ToList();
  183. var notification = new NotificationRequest
  184. {
  185. UserIds = userIds,
  186. Name = result.Name + " failed",
  187. Description = result.ErrorMessage,
  188. Level = NotificationLevel.Error
  189. };
  190. await SendNotification(notification).ConfigureAwait(false);
  191. }
  192. }
  193. async void _installationManager_PluginUninstalled(object sender, GenericEventArgs<IPlugin> e)
  194. {
  195. var plugin = e.Argument;
  196. var userIds = _userManager
  197. .Users
  198. .Where(i => i.Configuration.IsAdministrator)
  199. .Select(i => i.Id.ToString("N"))
  200. .ToList();
  201. var notification = new NotificationRequest
  202. {
  203. UserIds = userIds,
  204. Name = plugin.Name + " has been uninstalled"
  205. };
  206. await SendNotification(notification).ConfigureAwait(false);
  207. }
  208. async void _installationManager_PackageInstallationCompleted(object sender, InstallationEventArgs e)
  209. {
  210. if (!_config.Configuration.NotificationOptions.SendOnUpdates)
  211. {
  212. return;
  213. }
  214. var installationInfo = e.InstallationInfo;
  215. var userIds = _userManager
  216. .Users
  217. .Where(i => i.Configuration.IsAdministrator)
  218. .Select(i => i.Id.ToString("N"))
  219. .ToList();
  220. var notification = new NotificationRequest
  221. {
  222. UserIds = userIds,
  223. Name = installationInfo.Name + " " + installationInfo.Version + " was installed",
  224. Description = e.PackageVersionInfo.description
  225. };
  226. await SendNotification(notification).ConfigureAwait(false);
  227. }
  228. async void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e)
  229. {
  230. var installationInfo = e.InstallationInfo;
  231. var userIds = _userManager
  232. .Users
  233. .Where(i => i.Configuration.IsAdministrator)
  234. .Select(i => i.Id.ToString("N"))
  235. .ToList();
  236. var notification = new NotificationRequest
  237. {
  238. UserIds = userIds,
  239. Level = NotificationLevel.Error,
  240. Name = installationInfo.Name + " " + installationInfo.Version + " installation failed",
  241. Description = e.Exception.Message
  242. };
  243. await SendNotification(notification).ConfigureAwait(false);
  244. }
  245. private async Task SendNotification(NotificationRequest notification)
  246. {
  247. try
  248. {
  249. await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
  250. }
  251. catch (Exception ex)
  252. {
  253. _logger.ErrorException("Error sending notification", ex);
  254. }
  255. }
  256. public void Dispose()
  257. {
  258. _installationManager.PackageInstallationCompleted -= _installationManager_PackageInstallationCompleted;
  259. _installationManager.PackageInstallationFailed -= _installationManager_PackageInstallationFailed;
  260. _installationManager.PluginUninstalled -= _installationManager_PluginUninstalled;
  261. _taskManager.TaskCompleted -= _taskManager_TaskCompleted;
  262. _userManager.UserCreated -= _userManager_UserCreated;
  263. _libraryManager.ItemAdded -= _libraryManager_ItemAdded;
  264. _sessionManager.PlaybackStart -= _sessionManager_PlaybackStart;
  265. _appHost.HasPendingRestartChanged -= _appHost_HasPendingRestartChanged;
  266. _appHost.HasUpdateAvailableChanged -= _appHost_HasUpdateAvailableChanged;
  267. }
  268. }
  269. }