diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs | 116 |
1 files changed, 107 insertions, 9 deletions
diff --git a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs index d6caa5b68..ff8d35e28 100644 --- a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs +++ b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs @@ -1,4 +1,6 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Notifications; using MediaBrowser.Model.Logging; @@ -15,11 +17,15 @@ namespace MediaBrowser.Server.Implementations.Notifications { private readonly ILogger _logger; private readonly IUserManager _userManager; + private readonly IServerConfigurationManager _config; + private INotificationService[] _services; + private INotificationTypeFactory[] _typeFactories; - public NotificationManager(ILogManager logManager, IUserManager userManager) + public NotificationManager(ILogManager logManager, IUserManager userManager, IServerConfigurationManager config) { _userManager = userManager; + _config = config; _logger = logManager.GetLogger(GetType().Name); } @@ -27,27 +33,34 @@ namespace MediaBrowser.Server.Implementations.Notifications { var users = request.UserIds.Select(i => _userManager.GetUserById(new Guid(i))); - var tasks = _services.Select(i => SendNotification(request, i, users, cancellationToken)); + var notificationType = request.NotificationType; + + var title = GetTitle(request); + + var tasks = _services.Where(i => IsEnabled(i, notificationType)) + .Select(i => SendNotification(request, i, users, title, cancellationToken)); return Task.WhenAll(tasks); } - public Task SendNotification(NotificationRequest request, + private Task SendNotification(NotificationRequest request, INotificationService service, IEnumerable<User> users, + string title, CancellationToken cancellationToken) { users = users.Where(i => IsEnabledForUser(service, i)) .ToList(); - var tasks = users.Select(i => SendNotification(request, service, i, cancellationToken)); + var tasks = users.Select(i => SendNotification(request, service, title, i, cancellationToken)); return Task.WhenAll(tasks); } - public async Task SendNotification(NotificationRequest request, + private async Task SendNotification(NotificationRequest request, INotificationService service, + string title, User user, CancellationToken cancellationToken) { @@ -56,13 +69,13 @@ namespace MediaBrowser.Server.Implementations.Notifications Date = request.Date, Description = request.Description, Level = request.Level, - Name = request.Name, + Name = title, Url = request.Url, User = user }; _logger.Debug("Sending notification via {0} to user {1}", service.Name, user.Name); - + try { await service.SendNotification(notification, cancellationToken).ConfigureAwait(false); @@ -73,6 +86,50 @@ namespace MediaBrowser.Server.Implementations.Notifications } } + private string GetTitle(NotificationRequest request) + { + var title = request.Name; + + // If empty, grab from options + if (string.IsNullOrEmpty(title)) + { + if (!string.IsNullOrEmpty(request.NotificationType)) + { + var options = _config.Configuration.NotificationOptions.GetOptions(request.NotificationType); + + if (options != null) + { + title = options.Title; + } + } + } + + // If still empty, grab default + if (string.IsNullOrEmpty(title)) + { + if (!string.IsNullOrEmpty(request.NotificationType)) + { + var info = GetNotificationTypes().FirstOrDefault(i => string.Equals(i.Type, request.NotificationType, StringComparison.OrdinalIgnoreCase)); + + if (info != null) + { + title = info.DefaultTitle; + } + } + } + + title = title ?? string.Empty; + + foreach (var pair in request.Variables) + { + var token = "{" + pair.Key + "}"; + + title = title.Replace(token, pair.Value, StringComparison.OrdinalIgnoreCase); + } + + return title; + } + private bool IsEnabledForUser(INotificationService service, User user) { try @@ -86,9 +143,50 @@ namespace MediaBrowser.Server.Implementations.Notifications } } - public void AddParts(IEnumerable<INotificationService> services) + private bool IsEnabled(INotificationService service, string notificationType) + { + return string.IsNullOrEmpty(notificationType) || + _config.Configuration.NotificationOptions.IsServiceEnabled(service.Name, notificationType); + } + + public void AddParts(IEnumerable<INotificationService> services, IEnumerable<INotificationTypeFactory> notificationTypeFactories) { _services = services.ToArray(); + _typeFactories = notificationTypeFactories.ToArray(); + } + + public IEnumerable<NotificationTypeInfo> GetNotificationTypes() + { + var list = _typeFactories.Select(i => + { + try + { + return i.GetNotificationTypes().ToList(); + } + catch (Exception ex) + { + _logger.ErrorException("Error in GetNotificationTypes", ex); + return new List<NotificationTypeInfo>(); + } + + }).SelectMany(i => i).ToList(); + + foreach (var i in list) + { + i.Enabled = _config.Configuration.NotificationOptions.IsEnabled(i.Type); + } + + return list; + } + + public IEnumerable<NotificationServiceInfo> GetNotificationServices() + { + return _services.Select(i => new NotificationServiceInfo + { + Name = i.Name, + Id = i.Name.GetMD5().ToString("N") + + }).OrderBy(i => i.Name); } } } |
