From c77c65c68a75d8ed052b9a40643c5d9549ff374d Mon Sep 17 00:00:00 2001 From: Qstick Date: Wed, 5 Aug 2020 22:28:03 -0400 Subject: [PATCH] Remove Prowlin Dependency --- .../NotificationTests/ProwlProviderTest.cs | 10 +- .../Prowl/InvalidApiKeyException.cs | 15 --- .../Notifications/Prowl/Prowl.cs | 16 ++- .../Notifications/Prowl/ProwlException.cs | 18 +++ .../Notifications/Prowl/ProwlProxy.cs | 78 +++++++++++++ .../Notifications/Prowl/ProwlService.cs | 105 ------------------ .../Notifications/Prowl/ProwlSettings.cs | 2 +- src/NzbDrone.Core/Sonarr.Core.csproj | 1 - 8 files changed, 111 insertions(+), 134 deletions(-) delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/InvalidApiKeyException.cs create mode 100644 src/NzbDrone.Core/Notifications/Prowl/ProwlException.cs create mode 100644 src/NzbDrone.Core/Notifications/Prowl/ProwlProxy.cs delete mode 100644 src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs diff --git a/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs b/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs index ca0e0825c..78e56d56d 100644 --- a/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs +++ b/src/NzbDrone.Core.Test/NotificationTests/ProwlProviderTest.cs @@ -9,23 +9,27 @@ namespace NzbDrone.Core.Test.NotificationTests [Explicit] [ManualTest] [TestFixture] - public class ProwlProviderTest : CoreTest + public class ProwlProviderTest : CoreTest { private const string _apiKey = "66e9f688b512152eb2688f0486ae542c76e564a2"; private const string _badApiKey = "1234567890abcdefghijklmnopqrstuvwxyz1234"; + private ProwlSettings _settings = new ProwlSettings { ApiKey = _apiKey }; + [Test] public void Verify_should_not_throw_for_a_valid_apiKey() { - Subject.Verify(_apiKey); + Subject.Test(_settings); ExceptionVerification.ExpectedWarns(0); } [Test] public void Verify_should_throw_for_an_invalid_apiKey() { - Assert.Throws(() => Subject.Verify(_badApiKey)); + _settings.ApiKey = _badApiKey; + + Assert.Throws(() => Subject.Test(_settings)); ExceptionVerification.ExpectedWarns(1); } 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 index 42e7c0b0f..e3915a824 100644 --- a/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs +++ b/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs @@ -1,18 +1,16 @@ using System.Collections.Generic; using FluentValidation.Results; using NzbDrone.Common.Extensions; -using NzbDrone.Core.Tv; -using Prowlin; namespace NzbDrone.Core.Notifications.Prowl { public class Prowl : NotificationBase { - private readonly IProwlService _prowlService; + private readonly IProwlProxy _prowlProxy; - public Prowl(IProwlService prowlService) + public Prowl(IProwlProxy prowlProxy) { - _prowlService = prowlService; + _prowlProxy = prowlProxy; } public override string Link => "https://www.prowlapp.com/"; @@ -20,24 +18,24 @@ namespace NzbDrone.Core.Notifications.Prowl public override void OnGrab(GrabMessage grabMessage) { - _prowlService.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); + _prowlProxy.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority); } public override void OnDownload(DownloadMessage message) { - _prowlService.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); + _prowlProxy.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority); } public override void OnHealthIssue(HealthCheck.HealthCheck message) { - _prowlService.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); + _prowlProxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority); } public override ValidationResult Test() { var failures = new List(); - failures.AddIfNotNull(_prowlService.Test(Settings)); + failures.AddIfNotNull(_prowlProxy.Test(Settings)); return new ValidationResult(failures); } diff --git a/src/NzbDrone.Core/Notifications/Prowl/ProwlException.cs b/src/NzbDrone.Core/Notifications/Prowl/ProwlException.cs new file mode 100644 index 000000000..ee1a61df4 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Prowl/ProwlException.cs @@ -0,0 +1,18 @@ +using System; +using NzbDrone.Common.Exceptions; + +namespace NzbDrone.Core.Notifications.Prowl +{ + public class ProwlException : NzbDroneException + { + public ProwlException(string message) + : base(message) + { + } + + public ProwlException(string message, Exception innerException, params object[] args) + : base(message, innerException, args) + { + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Prowl/ProwlProxy.cs b/src/NzbDrone.Core/Notifications/Prowl/ProwlProxy.cs new file mode 100644 index 000000000..53f8ee71e --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Prowl/ProwlProxy.cs @@ -0,0 +1,78 @@ +using System; +using System.Net; +using FluentValidation.Results; +using NLog; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Http; + +namespace NzbDrone.Core.Notifications.Prowl +{ + public interface IProwlProxy + { + void SendNotification(string title, string message, string apiKey, ProwlPriority priority = ProwlPriority.Normal, string url = null); + ValidationFailure Test(ProwlSettings settings); + } + + public class ProwlProxy : IProwlProxy + { + private const string PUSH_URL = "https://api.prowlapp.com/publicapi/add"; + private readonly IHttpClient _httpClient; + private readonly Logger _logger; + + public ProwlProxy(IHttpClient httpClient, Logger logger) + { + _httpClient = httpClient; + _logger = logger; + } + + public void SendNotification(string title, string message, string apiKey, ProwlPriority priority = ProwlPriority.Normal, string url = null) + { + try + { + var requestBuilder = new HttpRequestBuilder(PUSH_URL); + + var request = requestBuilder.Post() + .AddFormParameter("apikey", apiKey) + .AddFormParameter("application", BuildInfo.AppName) + .AddFormParameter("event", title) + .AddFormParameter("description", message) + .AddFormParameter("priority", priority) + .AddFormParameter("url", url) + .Build(); + + _httpClient.Post(request); + } + catch (HttpException ex) + { + if (ex.Response.StatusCode == HttpStatusCode.Unauthorized) + { + _logger.Error(ex, "Apikey is invalid: {0}", apiKey); + throw new ProwlException("Apikey is invalid", ex); + } + + throw new ProwlException("Unable to send text message: " + ex.Message, ex); + } + catch (WebException ex) + { + throw new ProwlException("Failed to connect to prowl, please check your settings.", ex); + } + } + + public ValidationFailure Test(ProwlSettings settings) + { + try + { + const string title = "Test Notification"; + const string body = "This is a test message from Sonarr"; + + SendNotification(title, body, settings.ApiKey); + } + catch (Exception ex) + { + return new ValidationFailure("ApiKey", ex.Message); + } + + return null; + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs b/src/NzbDrone.Core/Notifications/Prowl/ProwlService.cs deleted file mode 100644 index 738ace909..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"; - const string body = "This is a test message from Sonarr"; - - 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 index 67a5f3cb4..9f23a9320 100644 --- a/src/NzbDrone.Core/Notifications/Prowl/ProwlSettings.cs +++ b/src/NzbDrone.Core/Notifications/Prowl/ProwlSettings.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.Notifications.Prowl [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) )] + [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; diff --git a/src/NzbDrone.Core/Sonarr.Core.csproj b/src/NzbDrone.Core/Sonarr.Core.csproj index 48df7d8f2..b4eab9496 100644 --- a/src/NzbDrone.Core/Sonarr.Core.csproj +++ b/src/NzbDrone.Core/Sonarr.Core.csproj @@ -11,7 +11,6 @@ -