Lidarr/src/NzbDrone.Core/Notifications/Slack/Slack.cs

282 lines
9.3 KiB
C#

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 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 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 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 void OnManualInteractionRequired(ManualInteractionRequiredMessage message)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = Environment.MachineName,
Text = message.Message,
Color = "warning"
}
};
var payload = CreatePayload("Manual Interaction Required", 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;
}
}
}