using System; using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Common; using NzbDrone.Common.Composition; using NzbDrone.Common.Messaging; using NzbDrone.Core.Download; using NzbDrone.Core.MediaFiles.Events; namespace NzbDrone.Core.Notifications { public interface INotificationService { List All(); } public class NotificationService : INotificationService, IHandle, IHandle, IHandle { private readonly INotificationRepository _notificationRepository; private readonly IContainer _container; private readonly List _notifications; private readonly Logger _logger; public NotificationService(INotificationRepository notificationRepository, IEnumerable notifications, IContainer container, Logger logger) { _notificationRepository = notificationRepository; _container = container; _notifications = notifications.ToList(); _logger = logger; } public List All() { return _notificationRepository.All().Select(ToNotification).ToList(); } private Notification ToNotification(NotificationDefinition definition) { var notification = new Notification(); notification.Id = definition.Id; notification.OnGrab = definition.OnGrab; notification.OnDownload = definition.OnDownload; notification.Instance = GetInstance(definition); notification.Name = definition.Name; if (notification.Instance.GetType().GetMethod("ImportSettingsFromJson") != null) { notification.Settings = ((dynamic)notification.Instance).ImportSettingsFromJson(definition.Settings); } else { notification.Settings = NullSetting.Instance; } return notification; } private INotification GetInstance(NotificationDefinition indexerDefinition) { var type = _notifications.Single(c => c.GetType().Name.Equals(indexerDefinition.Implementation, StringComparison.InvariantCultureIgnoreCase)).GetType(); var instance = (INotification)_container.Resolve(type); instance.InstanceDefinition = indexerDefinition; return instance; } public void Handle(EpisodeGrabbedEvent message) { All().Where(n => n.OnGrab) .ToList() .ForEach(notification => notification.Instance .OnGrab("Grabbed!") ); } public void Handle(EpisodeDownloadedEvent message) { All().Where(n => n.OnDownload) .ToList() .ForEach(notification => notification.Instance .OnDownload("Downloaded!", message.Series) ); } public void Handle(SeriesRenamedEvent message) { All().Where(n => n.OnDownload) .ToList() .ForEach(notification => notification.Instance .OnDownload("Renamed!", message.Series) ); } } }