|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using FluentValidation.Results;
|
|
|
|
using NzbDrone.Common.Extensions;
|
|
|
|
using NzbDrone.Core.MediaFiles;
|
|
|
|
using NzbDrone.Core.Music;
|
|
|
|
using NzbDrone.Core.Notifications.Slack.Payloads;
|
|
|
|
using NzbDrone.Core.Validation;
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Notifications.Slack
|
|
|
|
{
|
|
|
|
public class Slack : NotificationBase<SlackSettings>
|
|
|
|
{
|
|
|
|
private readonly ISlackProxy _proxy;
|
|
|
|
|
|
|
|
public Slack(ISlackProxy proxy)
|
|
|
|
{
|
|
|
|
_proxy = proxy;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override string Name => "Slack";
|
|
|
|
public override string Link => "https://my.slack.com/services/new/incoming-webhook/";
|
|
|
|
|
|
|
|
public override void OnGrab(GrabMessage message)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Fallback = message.Message,
|
|
|
|
Title = message.Artist.Name,
|
|
|
|
Text = message.Message,
|
|
|
|
Color = "warning"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var payload = CreatePayload($"Grabbed: {message.Message}", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnReleaseImport(AlbumDownloadMessage message)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Fallback = message.Message,
|
|
|
|
Title = message.Artist.Name,
|
|
|
|
Text = message.Message,
|
|
|
|
Color = "good"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var payload = CreatePayload($"Imported: {message.Message}", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnRename(Artist artist, List<RenamedTrackFile> renamedFiles)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = artist.Name,
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Renamed", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnArtistAdd(ArtistAddMessage message)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = message.Artist.Metadata.Value.Name,
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Artist Added", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = deleteMessage.Artist.Metadata.Value.Name,
|
|
|
|
Text = deleteMessage.DeletedFilesMessage
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Artist Deleted", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = deleteMessage.Album.Title,
|
|
|
|
Text = deleteMessage.DeletedFilesMessage
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Album Deleted", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = healthCheck.Source.Name,
|
|
|
|
Text = healthCheck.Message,
|
|
|
|
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? "warning" : "danger"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Health Issue", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = previousCheck.Source.Name,
|
|
|
|
Text = $"The following issue is now resolved: {previousCheck.Message}",
|
|
|
|
Color = "good"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Health Issue Resolved", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnTrackRetag(TrackRetagMessage message)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = TRACK_RETAGGED_TITLE,
|
|
|
|
Text = message.Message
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload(TRACK_RETAGGED_TITLE, attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnDownloadFailure(DownloadFailedMessage message)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Fallback = message.Message,
|
|
|
|
Title = message.SourceTitle,
|
|
|
|
Text = message.Message,
|
|
|
|
Color = "danger"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var payload = CreatePayload($"Download Failed: {message.Message}", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnImportFailure(AlbumDownloadMessage message)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Fallback = message.Message,
|
|
|
|
Text = message.Message,
|
|
|
|
Color = "warning"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var payload = CreatePayload($"Import Failed: {message.Message}", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage)
|
|
|
|
{
|
|
|
|
var attachments = new List<Attachment>
|
|
|
|
{
|
|
|
|
new Attachment
|
|
|
|
{
|
|
|
|
Title = Environment.MachineName,
|
|
|
|
Text = updateMessage.Message,
|
|
|
|
Color = "good"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var payload = CreatePayload("Application Updated", attachments);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
public override ValidationResult Test()
|
|
|
|
{
|
|
|
|
var failures = new List<ValidationFailure>();
|
|
|
|
|
|
|
|
failures.AddIfNotNull(TestMessage());
|
|
|
|
|
|
|
|
return new ValidationResult(failures);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ValidationFailure TestMessage()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
var message = $"Test message from Lidarr posted at {DateTime.Now}";
|
|
|
|
var payload = CreatePayload(message);
|
|
|
|
|
|
|
|
_proxy.SendPayload(payload, Settings);
|
|
|
|
}
|
|
|
|
catch (SlackExeption ex)
|
|
|
|
{
|
|
|
|
return new NzbDroneValidationFailure("Unable to post", ex.Message);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
private SlackPayload CreatePayload(string message, List<Attachment> attachments = null)
|
|
|
|
{
|
|
|
|
var icon = Settings.Icon;
|
|
|
|
var channel = Settings.Channel;
|
|
|
|
|
|
|
|
var payload = new SlackPayload
|
|
|
|
{
|
|
|
|
Username = Settings.Username,
|
|
|
|
Text = message,
|
|
|
|
Attachments = attachments
|
|
|
|
};
|
|
|
|
|
|
|
|
if (icon.IsNotNullOrWhiteSpace())
|
|
|
|
{
|
|
|
|
// Set the correct icon based on the value
|
|
|
|
if (icon.StartsWith(":") && icon.EndsWith(":"))
|
|
|
|
{
|
|
|
|
payload.IconEmoji = icon;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
payload.IconUrl = icon;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (channel.IsNotNullOrWhiteSpace())
|
|
|
|
{
|
|
|
|
payload.Channel = channel;
|
|
|
|
}
|
|
|
|
|
|
|
|
return payload;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|