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 { 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 { 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 { 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 renamedFiles) { var attachments = new List { new Attachment { Title = artist.Name, } }; var payload = CreatePayload("Renamed", attachments); _proxy.SendPayload(payload, Settings); } public override void OnArtistAdd(ArtistAddMessage message) { var attachments = new List { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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(); 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 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; } } }