mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-16 22:13:06 +03:00
add new notification features
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user