aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Notifications
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Notifications')
-rw-r--r--MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs131
-rw-r--r--MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs116
2 files changed, 238 insertions, 9 deletions
diff --git a/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs b/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs
new file mode 100644
index 000000000..bf5228dd9
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs
@@ -0,0 +1,131 @@
+using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Notifications;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Notifications;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace MediaBrowser.Server.Implementations.Notifications
+{
+ public class CoreNotificationTypes : INotificationTypeFactory
+ {
+ private readonly ILocalizationManager _localization;
+
+ public CoreNotificationTypes(ILocalizationManager localization)
+ {
+ _localization = localization;
+ }
+
+ public IEnumerable<NotificationTypeInfo> GetNotificationTypes()
+ {
+ var knownTypes = new List<NotificationTypeInfo>
+ {
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.ApplicationUpdateAvailable.ToString(),
+ DefaultTitle = "A new version of Media Browser Server is available for download."
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.ApplicationUpdateInstalled.ToString(),
+ DefaultTitle = "A new version of Media Browser Server has been installed.",
+ Variables = new List<string>{"Version"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.InstallationFailed.ToString(),
+ DefaultTitle = "{Name} installation failed.",
+ Variables = new List<string>{"Name", "Version"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.PluginInstalled.ToString(),
+ DefaultTitle = "{Name} was installed.",
+ Variables = new List<string>{"Name", "Version"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.PluginUninstalled.ToString(),
+ DefaultTitle = "{Name} was uninstalled.",
+ Variables = new List<string>{"Name", "Version"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.PluginUpdateInstalled.ToString(),
+ DefaultTitle = "{Name} was updated.",
+ Variables = new List<string>{"Name", "Version"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.ServerRestartRequired.ToString(),
+ DefaultTitle = "Please restart Media Browser Server to finish updating."
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.TaskFailed.ToString(),
+ DefaultTitle = "{Name} failed.",
+ Variables = new List<string>{"Name"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.NewLibraryContent.ToString(),
+ DefaultTitle = "{Name} has been added to your media library.",
+ Variables = new List<string>{"Name"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.AudioPlayback.ToString(),
+ DefaultTitle = "{UserName} is playing {ItemName} on {DeviceName}.",
+ Variables = new List<string>{"UserName", "ItemName", "DeviceName", "AppName"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.GamePlayback.ToString(),
+ DefaultTitle = "{UserName} is playing {ItemName} on {DeviceName}.",
+ Variables = new List<string>{"UserName", "ItemName", "DeviceName", "AppName"}
+ },
+
+ new NotificationTypeInfo
+ {
+ Type = NotificationType.VideoPlayback.ToString(),
+ DefaultTitle = "{UserName} is playing {ItemName} on {DeviceName}.",
+ Variables = new List<string>{"UserName", "ItemName", "DeviceName", "AppName"}
+ }
+ };
+
+ foreach (var type in knownTypes)
+ {
+ Update(type);
+ }
+
+ return knownTypes.OrderBy(i => i.Category).ThenBy(i => i.Name);
+ }
+
+ private void Update(NotificationTypeInfo note)
+ {
+ note.Name = _localization.GetLocalizedString("NotificationOption" + note.Type) ?? note.Type;
+
+ note.IsBasedOnUserEvent = note.Type.IndexOf("Playback", StringComparison.OrdinalIgnoreCase) != -1;
+
+ if (note.Type.IndexOf("Playback", StringComparison.OrdinalIgnoreCase) != -1)
+ {
+ note.Category = _localization.GetLocalizedString("CategoryUser");
+ }
+ else
+ {
+ note.Category = _localization.GetLocalizedString("CategorySystem");
+ }
+ }
+ }
+}
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);
}
}
}