From 3ced1843bf699a14edb95cb9c45659ed3ae80bcb Mon Sep 17 00:00:00 2001 From: ta264 Date: Tue, 17 Sep 2019 21:52:40 +0100 Subject: [PATCH] Changed: Remove growl and prowl --- src/Libraries/Growl.Connector.dll | Bin 50688 -> 0 bytes src/Libraries/Growl.CoreLibrary.dll | Bin 17408 -> 0 bytes .../NotificationTests/ProwlProviderTest.cs | 48 ------ .../Migration/037_remove_growl_prowl.cs | 15 ++ src/NzbDrone.Core/Lidarr.Core.csproj | 7 - .../Notifications/Growl/Growl.cs | 55 ------ .../Notifications/Growl/GrowlService.cs | 162 ------------------ .../Notifications/Growl/GrowlSettings.cs | 42 ----- .../Prowl/InvalidApiKeyException.cs | 15 -- .../Notifications/Prowl/Prowl.cs | 44 ----- .../Notifications/Prowl/ProwlPriority.cs | 11 -- .../Notifications/Prowl/ProwlService.cs | 105 ------------ .../Notifications/Prowl/ProwlSettings.cs | 33 ---- 13 files changed, 15 insertions(+), 522 deletions(-) delete mode 100644 src/Libraries/Growl.Connector.dll delete mode 100644 src/Libraries/Growl.CoreLibrary.dll delete mode 100644 src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/037_remove_growl_prowl.cs delete mode 100644 src/NzbDrone.Core/Notifications/Growl/Growl.cs delete mode 100644 src/NzbDrone.Core/Notifications/Growl/GrowlService.cs delete mode 100644 src/NzbDrone.Core/Notifications/Growl/GrowlSettings.cs delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/InvalidApiKeyException.cs delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/Prowl.cs delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/ProwlPriority.cs delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/ProwlSettings.cs diff --git a/src/Libraries/Growl.Connector.dll b/src/Libraries/Growl.Connector.dll deleted file mode 100644 index ba848ae440a489b7b6c8eae8af9a1f9551269e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50688 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 NS{3|X?z4=6e*igmpELjf diff --git a/src/Libraries/Growl.CoreLibrary.dll b/src/Libraries/Growl.CoreLibrary.dll deleted file mode 100644 index 5e67e08f40c03cb8e76163e4d0824db30faa2486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 diff --git a/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs b/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs deleted file mode 100644 index ca0e0825c..000000000 --- a/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs +++ /dev/null @@ -1,48 +0,0 @@ -using NUnit.Framework; -using NzbDrone.Core.Notifications.Prowl; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; -using NzbDrone.Test.Common.Categories; - -namespace NzbDrone.Core.Test.NotificationTests -{ - [Explicit] - [ManualTest] - [TestFixture] - public class ProwlProviderTest : CoreTest - { - private const string _apiKey = "66e9f688b512152eb2688f0486ae542c76e564a2"; - - private const string _badApiKey = "1234567890abcdefghijklmnopqrstuvwxyz1234"; - - [Test] - public void Verify_should_not_throw_for_a_valid_apiKey() - { - Subject.Verify(_apiKey); - ExceptionVerification.ExpectedWarns(0); - } - - [Test] - public void Verify_should_throw_for_an_invalid_apiKey() - { - Assert.Throws(() => Subject.Verify(_badApiKey)); - - ExceptionVerification.ExpectedWarns(1); - } - - [Test] - public void SendNotification_should_not_throw_for_a_valid_apiKey() - { - Subject.SendNotification("NzbDrone Test", "This is a test message from NzbDrone", _apiKey); - ExceptionVerification.ExpectedWarns(0); - } - - [Test] - public void SendNotification_should_log_a_warning_for_an_invalid_apiKey() - { - Subject.SendNotification("NzbDrone Test", "This is a test message from NzbDrone", _badApiKey); - - ExceptionVerification.ExpectedWarns(1); - } - } -} \ No newline at end of file diff --git a/src/NzbDrone.Core/Datastore/Migration/037_remove_growl_prowl.cs b/src/NzbDrone.Core/Datastore/Migration/037_remove_growl_prowl.cs new file mode 100644 index 000000000..9d6e3d20b --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/037_remove_growl_prowl.cs @@ -0,0 +1,15 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(37)] + public class remove_growl_prowl : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Delete.FromTable("Notifications").Row(new { Implementation = "Growl" }); + Delete.FromTable("Notifications").Row(new { Implementation = "Prowl" }); + } + } +} diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index 902611ddc..f4f5c9b1b 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -9,7 +9,6 @@ - @@ -24,12 +23,6 @@ - - ..\Libraries\Growl.Connector.dll - - - ..\Libraries\Growl.CoreLibrary.dll - ..\Libraries\Sqlite\System.Data.SQLite.dll diff --git a/src/NzbDrone.Core/Notifications/Growl/Growl.cs b/src/NzbDrone.Core/Notifications/Growl/Growl.cs deleted file mode 100644 index 6ae211cee..000000000 --- a/src/NzbDrone.Core/Notifications/Growl/Growl.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections.Generic; -using FluentValidation.Results; -using NzbDrone.Common.Extensions; - -namespace NzbDrone.Core.Notifications.Growl -{ - public class Growl : NotificationBase - { - private readonly IGrowlService _growlService; - - public override string Name => "Growl"; - - - public Growl(IGrowlService growlService) - { - _growlService = growlService; - } - - public override string Link => "http://growl.info/"; - - public override void OnGrab(GrabMessage grabMessage) - { - _growlService.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, "GRAB", Settings.Host, Settings.Port, Settings.Password); - } - - public override void OnReleaseImport(AlbumDownloadMessage message) - { - _growlService.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, "ALBUMDOWNLOAD", Settings.Host, Settings.Port, Settings.Password); - } - - public override void OnHealthIssue(HealthCheck.HealthCheck message) - { - _growlService.SendNotification(HEALTH_ISSUE_TITLE, message.Message, "HEALTHISSUE", Settings.Host, Settings.Port, Settings.Password); - } - - public override void OnDownloadFailure(DownloadFailedMessage message) - { - _growlService.SendNotification(DOWNLOAD_FAILURE_TITLE, message.Message, "DOWNLOADFAILURE", Settings.Host, Settings.Port, Settings.Password); - } - - public override void OnImportFailure(AlbumDownloadMessage message) - { - _growlService.SendNotification(IMPORT_FAILURE_TITLE, message.Message, "IMPORTFAILURE", Settings.Host, Settings.Port, Settings.Password); - } - - public override ValidationResult Test() - { - var failures = new List(); - - failures.AddIfNotNull(_growlService.Test(Settings)); - - return new ValidationResult(failures); - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Growl/GrowlService.cs b/src/NzbDrone.Core/Notifications/Growl/GrowlService.cs deleted file mode 100644 index fa2a6971e..000000000 --- a/src/NzbDrone.Core/Notifications/Growl/GrowlService.cs +++ /dev/null @@ -1,162 +0,0 @@ -using FluentValidation.Results; -using Growl.Connector; -using Growl.CoreLibrary; -using NzbDrone.Common.Extensions; -using GrowlNotification = Growl.Connector.Notification; -using NLog; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace NzbDrone.Core.Notifications.Growl -{ - public interface IGrowlService - { - void SendNotification(string title, string message, string notificationTypeName, string hostname, int port, string password); - ValidationFailure Test(GrowlSettings settings); - } - - public class GrowlService : IGrowlService - { - private readonly Logger _logger; - - private readonly Application _growlApplication = new Application("Lidarr"); - private readonly NotificationType[] _notificationTypes; - - private class GrowlRequestState - { - private AutoResetEvent _autoEvent = new AutoResetEvent(false); - private bool _isError; - private int _code; - private string _description; - - public void Wait(int timeoutMs) - { - try - { - if (!_autoEvent.WaitOne(timeoutMs)) - { - throw new GrowlException(ErrorCode.TIMED_OUT, ErrorDescription.TIMED_OUT, null); - } - if (_isError) - { - throw new GrowlException(_code, _description, null); - } - } - finally - { - _autoEvent.Reset(); - _isError = false; - _code = 0; - _description = null; - } - } - - public void Update() - { - _autoEvent.Set(); - } - - public void Update(int code, string description) - { - _code = code; - _description = description; - _isError = true; - _autoEvent.Set(); - } - } - - public GrowlService(Logger logger) - { - _logger = logger; - _notificationTypes = GetNotificationTypes(); - - var logo = typeof(GrowlService).Assembly.GetManifestResourceBytes("NzbDrone.Core.Resources.Logo.64.png"); - - _growlApplication.Icon = new BinaryData(logo); - } - - private GrowlConnector GetGrowlConnector(string hostname, int port, string password) - { - var growlConnector = new GrowlConnector(password, hostname, port); - growlConnector.OKResponse += GrowlOKResponse; - growlConnector.ErrorResponse += GrowlErrorResponse; - return growlConnector; - } - - public void SendNotification(string title, string message, string notificationTypeName, string hostname, int port, string password) - { - _logger.Debug("Sending Notification to: {0}:{1}", hostname, port); - - var notificationType = _notificationTypes.Single(n => n.Name == notificationTypeName); - var notification = new GrowlNotification(_growlApplication.Name, notificationType.Name, DateTime.Now.Ticks.ToString(), title, message); - - var growlConnector = GetGrowlConnector(hostname, port, password); - - var requestState = new GrowlRequestState(); - growlConnector.Notify(notification, requestState); - requestState.Wait(5000); - } - - private void Register(string host, int port, string password) - { - _logger.Debug("Registering Lidarr with Growl host: {0}:{1}", host, port); - - var growlConnector = GetGrowlConnector(host, port, password); - - var requestState = new GrowlRequestState(); - growlConnector.Register(_growlApplication, _notificationTypes, requestState); - requestState.Wait(5000); - } - - private void GrowlErrorResponse(Response response, object state) - { - var requestState = state as GrowlRequestState; - if (requestState != null) - { - requestState.Update(response.ErrorCode, response.ErrorDescription); - } - } - - private void GrowlOKResponse(Response response, object state) - { - var requestState = state as GrowlRequestState; - if (requestState != null) - { - requestState.Update(); - } - } - - private NotificationType[] GetNotificationTypes() - { - var notificationTypes = new List(); - notificationTypes.Add(new NotificationType("TEST", "Test")); - notificationTypes.Add(new NotificationType("GRAB", "Album Grabbed")); - notificationTypes.Add(new NotificationType("TRACKDOWNLOAD", "Track Complete")); - notificationTypes.Add(new NotificationType("ALBUMDOWNLOAD", "Album Complete")); - - return notificationTypes.ToArray(); - } - - public ValidationFailure Test(GrowlSettings settings) - { - try - { - Register(settings.Host, settings.Port, settings.Password); - - const string title = "Test Notification"; - const string body = "This is a test message from Lidarr"; - - SendNotification(title, body, "TEST", settings.Host, settings.Port, settings.Password); - } - catch (Exception ex) - { - _logger.Error(ex, "Unable to send test message"); - return new ValidationFailure("Host", "Unable to send test message"); - } - - return null; - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Growl/GrowlSettings.cs b/src/NzbDrone.Core/Notifications/Growl/GrowlSettings.cs deleted file mode 100644 index 55682003d..000000000 --- a/src/NzbDrone.Core/Notifications/Growl/GrowlSettings.cs +++ /dev/null @@ -1,42 +0,0 @@ -using FluentValidation; -using NzbDrone.Core.Annotations; -using NzbDrone.Core.ThingiProvider; -using NzbDrone.Core.Validation; - -namespace NzbDrone.Core.Notifications.Growl -{ - public class GrowlSettingsValidator : AbstractValidator - { - public GrowlSettingsValidator() - { - RuleFor(c => c.Host).ValidHost(); - RuleFor(c => c.Port).InclusiveBetween(1, 65535); - } - } - - public class GrowlSettings : IProviderConfig - { - private static readonly GrowlSettingsValidator Validator = new GrowlSettingsValidator(); - - public GrowlSettings() - { - Port = 23053; - } - - [FieldDefinition(0, Label = "Host")] - public string Host { get; set; } - - [FieldDefinition(1, Label = "Port")] - public int Port { get; set; } - - [FieldDefinition(2, Label = "Password")] - public string Password { get; set; } - - public bool IsValid => !string.IsNullOrWhiteSpace(Host) && !string.IsNullOrWhiteSpace(Password) && Port > 0; - - public NzbDroneValidationResult Validate() - { - return new NzbDroneValidationResult(Validator.Validate(this)); - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Prowl/InvalidApiKeyException.cs b/src/NzbDrone.Core/Notifications/Prowl/InvalidApiKeyException.cs deleted file mode 100644 index d72cd1970..000000000 --- a/src/NzbDrone.Core/Notifications/Prowl/InvalidApiKeyException.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace NzbDrone.Core.Notifications.Prowl -{ - public class InvalidApiKeyException : Exception - { - public InvalidApiKeyException() - { - } - - public InvalidApiKeyException(string message) : base(message) - { - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs b/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs deleted file mode 100644 index 505f4e099..000000000 --- a/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; -using FluentValidation.Results; -using NzbDrone.Common.Extensions; -using Prowlin; - -namespace NzbDrone.Core.Notifications.Prowl -{ - public class Prowl : NotificationBase - { - private readonly IProwlService _prowlService; - - public Prowl(IProwlService prowlService) - { - _prowlService = prowlService; - } - - public override string Link => "https://www.prowlapp.com/"; - public override string Name => "Prowl"; - - public override void OnGrab(GrabMessage grabMessage) - { - _prowlService.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); - } - - public override void OnReleaseImport(AlbumDownloadMessage message) - { - _prowlService.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); - } - - public override void OnHealthIssue(HealthCheck.HealthCheck message) - { - _prowlService.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); - } - - public override ValidationResult Test() - { - var failures = new List(); - - failures.AddIfNotNull(_prowlService.Test(Settings)); - - return new ValidationResult(failures); - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Prowl/ProwlPriority.cs b/src/NzbDrone.Core/Notifications/Prowl/ProwlPriority.cs deleted file mode 100644 index 858677964..000000000 --- a/src/NzbDrone.Core/Notifications/Prowl/ProwlPriority.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NzbDrone.Core.Notifications.Prowl -{ - public enum ProwlPriority - { - VeryLow = -2, - Low = -1, - Normal = 0, - High = 1, - Emergency = 2 - } -} diff --git a/src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs b/src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs deleted file mode 100644 index a49663686..000000000 --- a/src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using FluentValidation.Results; -using NLog; -using NzbDrone.Common.EnvironmentInfo; -using Prowlin; - -namespace NzbDrone.Core.Notifications.Prowl -{ - public interface IProwlService - { - void SendNotification(string title, string message, string apiKey, NotificationPriority priority = NotificationPriority.Normal, string url = null); - ValidationFailure Test(ProwlSettings settings); - } - - public class ProwlService : IProwlService - { - private readonly Logger _logger; - - public ProwlService(Logger logger) - { - _logger = logger; - } - - public void SendNotification(string title, string message, string apiKey, NotificationPriority priority = NotificationPriority.Normal, string url = null) - { - try - { - var notification = new Prowlin.Notification - { - Application = BuildInfo.AppName, - Description = message, - Event = title, - Priority = priority, - Url = url - }; - - notification.AddApiKey(apiKey.Trim()); - - var client = new ProwlClient(); - - _logger.Debug("Sending Prowl Notification"); - - var notificationResult = client.SendNotification(notification); - - if (!string.IsNullOrWhiteSpace(notificationResult.ErrorMessage)) - { - throw new InvalidApiKeyException("API Key: " + apiKey + " is invalid"); - } - } - - catch (Exception ex) - { - _logger.Debug(ex, ex.Message); - _logger.Warn("Invalid API Key: {0}", apiKey); - } - } - - public void Verify(string apiKey) - { - try - { - var verificationRequest = new Verification(); - verificationRequest.ApiKey = apiKey; - - var client = new ProwlClient(); - - _logger.Debug("Verifying API Key: {0}", apiKey); - - var verificationResult = client.SendVerification(verificationRequest); - if (!string.IsNullOrWhiteSpace(verificationResult.ErrorMessage) && - verificationResult.ResultCode != "200") - { - throw new InvalidApiKeyException("API Key: " + apiKey + " is invalid"); - } - } - - catch (Exception ex) - { - _logger.Debug(ex, ex.Message); - _logger.Warn("Invalid API Key: {0}", apiKey); - throw new InvalidApiKeyException("API Key: " + apiKey + " is invalid"); - } - } - - public ValidationFailure Test(ProwlSettings settings) - { - try - { - Verify(settings.ApiKey); - - const string title = "Test Notification"; - string body = $"This is a test message from {BuildInfo.AppName}"; - - SendNotification(title, body, settings.ApiKey); - } - catch (Exception ex) - { - _logger.Error(ex, "Unable to send test message"); - return new ValidationFailure("ApiKey", "Unable to send test message"); - } - - return null; - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Prowl/ProwlSettings.cs b/src/NzbDrone.Core/Notifications/Prowl/ProwlSettings.cs deleted file mode 100644 index 67a5f3cb4..000000000 --- a/src/NzbDrone.Core/Notifications/Prowl/ProwlSettings.cs +++ /dev/null @@ -1,33 +0,0 @@ -using FluentValidation; -using NzbDrone.Core.Annotations; -using NzbDrone.Core.ThingiProvider; -using NzbDrone.Core.Validation; - -namespace NzbDrone.Core.Notifications.Prowl -{ - public class ProwlSettingsValidator : AbstractValidator - { - public ProwlSettingsValidator() - { - RuleFor(c => c.ApiKey).NotEmpty(); - } - } - - public class ProwlSettings : IProviderConfig - { - private static readonly ProwlSettingsValidator Validator = new ProwlSettingsValidator(); - - [FieldDefinition(0, Label = "API Key", HelpLink = "https://www.prowlapp.com/api_settings.php")] - public string ApiKey { get; set; } - - [FieldDefinition(1, Label = "Priority", Type = FieldType.Select, SelectOptions= typeof(ProwlPriority) )] - public int Priority { get; set; } - - public bool IsValid => !string.IsNullOrWhiteSpace(ApiKey) && Priority >= -2 && Priority <= 2; - - public NzbDroneValidationResult Validate() - { - return new NzbDroneValidationResult(Validator.Validate(this)); - } - } -}