mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-18 06:53:07 +03:00
rework notifications infrastructure
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Notifications;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Notifications;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.Notifications
|
||||
{
|
||||
public class NotificationManager : INotificationManager
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly IUserManager _userManager;
|
||||
private INotificationService[] _services;
|
||||
|
||||
public NotificationManager(ILogManager logManager, IUserManager userManager)
|
||||
{
|
||||
_userManager = userManager;
|
||||
_logger = logManager.GetLogger(GetType().Name);
|
||||
}
|
||||
|
||||
public Task SendNotification(NotificationRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var users = request.UserIds.Select(i => _userManager.GetUserById(new Guid(i)));
|
||||
|
||||
var tasks = _services.Select(i => SendNotification(request, i, users, cancellationToken));
|
||||
|
||||
return Task.WhenAll(tasks);
|
||||
}
|
||||
|
||||
public Task SendNotification(NotificationRequest request,
|
||||
INotificationService service,
|
||||
IEnumerable<User> users,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
users = users.Where(i => IsEnabledForUser(service, i))
|
||||
.ToList();
|
||||
|
||||
var tasks = users.Select(i => SendNotification(request, service, i, cancellationToken));
|
||||
|
||||
return Task.WhenAll(tasks);
|
||||
|
||||
}
|
||||
|
||||
public async Task SendNotification(NotificationRequest request,
|
||||
INotificationService service,
|
||||
User user,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var notification = new UserNotification
|
||||
{
|
||||
Date = request.Date,
|
||||
Description = request.Description,
|
||||
Level = request.Level,
|
||||
Name = request.Name,
|
||||
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);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("Error sending notification to {0}", ex, service.Name);
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsEnabledForUser(INotificationService service, User user)
|
||||
{
|
||||
try
|
||||
{
|
||||
return service.IsEnabledForUser(user);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("Error in IsEnabledForUser", ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddParts(IEnumerable<INotificationService> services)
|
||||
{
|
||||
_services = services.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user