add new notification features

This commit is contained in:
Luke Pulverenti
2014-04-26 23:42:05 -04:00
parent bdffaf22c9
commit fadda8ef56
71 changed files with 1665 additions and 1265 deletions

View File

@@ -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");
}
}
}
}

View File

@@ -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 INotificationService[] _services;
private readonly IServerConfigurationManager _config;
public NotificationManager(ILogManager logManager, IUserManager userManager)
private INotificationService[] _services;
private INotificationTypeFactory[] _typeFactories;
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);
}
}
}