using System; using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Repository; using PetaPoco; namespace NzbDrone.Core.Providers { public class ExternalNotificationProvider { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly IDatabase _database; private IList _notifiers; public ExternalNotificationProvider(IDatabase database, IEnumerable notifiers) { _database = database; _notifiers = notifiers.ToList(); InitializeNotifiers(_notifiers); } public ExternalNotificationProvider() { } public virtual List All() { return _database.Fetch(); } public virtual void SaveSettings(ExternalNotificationDefinition settings) { if (settings.Id == 0) { Logger.Debug("Adding External Notification definition for {0}", settings.Name); _database.Insert(settings); } else { Logger.Debug("Updating External Notification definition for {0}", settings.Name); _database.Update(settings); } } public virtual ExternalNotificationDefinition GetSettings(Type type) { return _database.SingleOrDefault("WHERE ExternalNotificationProviderType = @0", type.ToString()); } public virtual IList GetEnabledExternalNotifiers() { var all = All(); return _notifiers.Where(i => all.Exists(c => c.ExternalNotificationProviderType == i.GetType().ToString() && c.Enable)).ToList(); } private void InitializeNotifiers(IList notifiers) { Logger.Debug("Initializing notifiers. Count {0}", notifiers.Count); _notifiers = notifiers; var currentNotifiers = All(); foreach (var notificationProvider in notifiers) { ExternalNotificationBase externalNotificationProviderLocal = notificationProvider; if (!currentNotifiers.Exists(c => c.ExternalNotificationProviderType == externalNotificationProviderLocal.GetType().ToString())) { var settings = new ExternalNotificationDefinition { Enable = false, ExternalNotificationProviderType = externalNotificationProviderLocal.GetType().ToString(), Name = externalNotificationProviderLocal.Name }; SaveSettings(settings); } } } public virtual void OnGrab(string message) { foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) { notifier.OnGrab(message); } } public virtual void OnDownload(string message, Series series) { foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) { notifier.OnDownload(message, series); } } public virtual void OnRename(string message, Series series) { foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) { notifier.OnRename(message, series); } } public virtual void AfterRename(string message, Series series) { foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) { notifier.AfterRename(message, series); } } } }