New: Added support for Gotify notifications (#730)

* Added support for Gotify notifications

* Removed non-supported features and adjusted priorities

* Use string interpolation to build url

* Rename a few variables and improve Url validation

* Improve building of the Url, move validation to Gotify.cs (adapting changes by markus101 over at Sonarr)

* Move validation from GotifyProxy.cs to here (adapting changes by markus101 over at Sonarr)
pull/808/head
stephanrenggli 6 years ago committed by Qstick
parent e9dfdab907
commit bcdef2723f

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using FluentValidation.Results;
using NLog;
namespace NzbDrone.Core.Notifications.Gotify
{
public class Gotify : NotificationBase<GotifySettings>
{
private readonly IGotifyProxy _proxy;
private readonly Logger _logger;
public Gotify(IGotifyProxy proxy, Logger logger)
{
_proxy = proxy;
_logger = logger;
}
public override string Name => "Gotify";
public override string Link => "https://gotify.net/";
public override void OnGrab(GrabMessage grabMessage)
{
_proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings);
}
public override void OnReleaseImport(AlbumDownloadMessage message)
{
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
}
public override void OnDownloadFailure(DownloadFailedMessage message)
{
_proxy.SendNotification(DOWNLOAD_FAILURE_TITLE, message.Message, Settings);
}
public override void OnImportFailure(AlbumDownloadMessage message)
{
_proxy.SendNotification(IMPORT_FAILURE_TITLE, message.Message, Settings);
}
public override ValidationResult Test()
{
var failures = new List<ValidationFailure>();
try
{
const string title = "Test Notification";
const string body = "This is a test message from Lidarr";
_proxy.SendNotification(title, body, Settings);
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message");
failures.Add(new ValidationFailure("", "Unable to send test message"));
}
return new ValidationResult(failures);
}
}
}

@ -0,0 +1,11 @@
namespace NzbDrone.Core.Notifications.Gotify
{
public enum GotifyPriority
{
Min = 0,
Low = 2,
Normal = 5,
High = 8
}
}

@ -0,0 +1,26 @@
using RestSharp;
using NzbDrone.Core.Rest;
namespace NzbDrone.Core.Notifications.Gotify
{
public interface IGotifyProxy
{
void SendNotification(string title, string message, GotifySettings settings);
}
public class GotifyProxy : IGotifyProxy
{
public void SendNotification(string title, string message, GotifySettings settings)
{
var client = RestClientFactory.BuildClient(settings.Server);
var request = new RestRequest("message", Method.POST);
request.AddQueryParameter("token", settings.AppToken);
request.AddParameter("title", title);
request.AddParameter("message", message);
request.AddParameter("priority", settings.Priority);
client.ExecuteAndValidate(request);
}
}
}

@ -0,0 +1,40 @@
using FluentValidation;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Validation;
namespace NzbDrone.Core.Notifications.Gotify
{
public class GotifySettingsValidator : AbstractValidator<GotifySettings>
{
public GotifySettingsValidator()
{
RuleFor(c => c.Server).IsValidUrl();
RuleFor(c => c.AppToken).NotEmpty();
}
}
public class GotifySettings : IProviderConfig
{
private static readonly GotifySettingsValidator Validator = new GotifySettingsValidator();
public GotifySettings()
{
Priority = 5;
}
[FieldDefinition(0, Label = "Gotify Server", HelpText = "Gotify server URL, including http(s):// and port if needed")]
public string Server { get; set; }
[FieldDefinition(1, Label = "App Token", HelpText = "The Application Token generated by Gotify")]
public string AppToken { get; set; }
[FieldDefinition(2, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(GotifyPriority), HelpText = "Priority of the notification")]
public int Priority { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));
}
}
}

@ -0,0 +1,15 @@
using System;
namespace NzbDrone.Core.Notifications.Gotify
{
public class InvalidResponseException : Exception
{
public InvalidResponseException()
{
}
public InvalidResponseException(string message) : base(message)
{
}
}
}

@ -936,6 +936,11 @@
<Compile Include="Music\TrackService.cs" /> <Compile Include="Music\TrackService.cs" />
<Compile Include="Notifications\AlbumDownloadMessage.cs" /> <Compile Include="Notifications\AlbumDownloadMessage.cs" />
<Compile Include="Notifications\DownloadFailedMessage.cs" /> <Compile Include="Notifications\DownloadFailedMessage.cs" />
<Compile Include="Notifications\Gotify\Gotify.cs" />
<Compile Include="Notifications\Gotify\GotifyPriority.cs" />
<Compile Include="Notifications\Gotify\GotifyProxy.cs" />
<Compile Include="Notifications\Gotify\GotifySettings.cs" />
<Compile Include="Notifications\Gotify\InvalidResponseException.cs" />
<Compile Include="Notifications\Join\JoinAuthException.cs" /> <Compile Include="Notifications\Join\JoinAuthException.cs" />
<Compile Include="Notifications\Join\JoinInvalidDeviceException.cs" /> <Compile Include="Notifications\Join\JoinInvalidDeviceException.cs" />
<Compile Include="Notifications\Join\JoinPriority.cs" /> <Compile Include="Notifications\Join\JoinPriority.cs" />

Loading…
Cancel
Save