Slack improvements

New: Slack icon can be an emoji or a URL
Fixed: Icon for MatterMost Slack notifications
Mark McDowall 7 years ago
parent b03f434329
commit e10717f6bb
No known key found for this signature in database
GPG Key ID: D4CEFA9A718052E0

@ -12,6 +12,9 @@ namespace NzbDrone.Core.Notifications.Slack.Payloads
[JsonProperty("icon_emoji")] [JsonProperty("icon_emoji")]
public string IconEmoji { get; set; } public string IconEmoji { get; set; }
[JsonProperty("icon_url")]
public string IconUrl { get; set; }
public List<Attachment> Attachments { get; set; } public List<Attachment> Attachments { get; set; }
} }
} }

@ -3,6 +3,8 @@ using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Notifications.Slack.Payloads; using NzbDrone.Core.Notifications.Slack.Payloads;
using NzbDrone.Core.Rest; using NzbDrone.Core.Rest;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
@ -14,10 +16,12 @@ namespace NzbDrone.Core.Notifications.Slack
{ {
public class Slack : NotificationBase<SlackSettings> public class Slack : NotificationBase<SlackSettings>
{ {
private readonly ISlackProxy _proxy;
private readonly Logger _logger; private readonly Logger _logger;
public Slack(Logger logger) public Slack(ISlackProxy proxy, Logger logger)
{ {
_proxy = proxy;
_logger = logger; _logger = logger;
} }
@ -26,65 +30,51 @@ namespace NzbDrone.Core.Notifications.Slack
public override void OnGrab(GrabMessage message) public override void OnGrab(GrabMessage message)
{ {
var payload = new SlackPayload var attachments = new List<Attachment>
{ {
IconEmoji = Settings.Icon, new Attachment
Username = Settings.Username, {
Text = $"Grabbed: {message.Message}", Fallback = message.Message,
Attachments = new List<Attachment> Title = message.Series.Title,
{ Text = message.Message,
new Attachment Color = "warning"
{ }
Fallback = message.Message, };
Title = message.Series.Title, var payload = CreatePayload($"Grabbed: {message.Message}", attachments);
Text = message.Message,
Color = "warning" _proxy.SendPayload(payload, Settings);
}
}
};
NotifySlack(payload);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
var payload = new SlackPayload var attachments = new List<Attachment>
{ {
IconEmoji = Settings.Icon, new Attachment
Username = Settings.Username, {
Text = $"Imported: {message.Message}", Fallback = message.Message,
Attachments = new List<Attachment> Title = message.Series.Title,
{ Text = message.Message,
new Attachment Color = "good"
{ }
Fallback = message.Message, };
Title = message.Series.Title, var payload = CreatePayload($"Imported: {message.Message}", attachments);
Text = message.Message,
Color = "good" _proxy.SendPayload(payload, Settings);
}
}
};
NotifySlack(payload);
} }
public override void OnRename(Series series) public override void OnRename(Series series)
{ {
var payload = new SlackPayload var attachments = new List<Attachment>
{ {
IconEmoji = Settings.Icon, new Attachment
Username = Settings.Username, {
Text = "Renamed", Title = series.Title,
Attachments = new List<Attachment> }
{ };
new Attachment
{ var payload = CreatePayload("Renamed", attachments);
Title = series.Title,
}
}
};
NotifySlack(payload); _proxy.SendPayload(payload, Settings);
} }
public override ValidationResult Test() public override ValidationResult Test()
@ -101,14 +91,9 @@ namespace NzbDrone.Core.Notifications.Slack
try try
{ {
var message = $"Test message from Sonarr posted at {DateTime.Now}"; var message = $"Test message from Sonarr posted at {DateTime.Now}";
var payload = new SlackPayload var payload = CreatePayload(message);
{
IconEmoji = Settings.Icon,
Username = Settings.Username,
Text = message
};
NotifySlack(payload); _proxy.SendPayload(payload, Settings);
} }
catch (SlackExeption ex) catch (SlackExeption ex)
@ -119,24 +104,28 @@ namespace NzbDrone.Core.Notifications.Slack
return null; return null;
} }
private void NotifySlack(SlackPayload payload) private SlackPayload CreatePayload(string message, List<Attachment> attachments = null)
{ {
try var icon = Settings.Icon;
var payload = new SlackPayload
{ {
var client = RestClientFactory.BuildClient(Settings.WebHookUrl); Username = Settings.Username,
var request = new RestRequest(Method.POST) Text = message,
{ Attachments = attachments
RequestFormat = DataFormat.Json, };
JsonSerializer = new JsonNetSerializer()
}; // Set the correct icon based on the value
request.AddBody(payload); if (icon.StartsWith(":") && icon.EndsWith(":"))
client.ExecuteAndValidate(request); {
payload.IconEmoji = icon;
} }
catch (RestException ex) else if (icon.IsNotNullOrWhiteSpace())
{ {
_logger.Error(ex, "Unable to post payload {0}", payload); payload.IconUrl = icon;
throw new SlackExeption("Unable to post payload", ex);
} }
return payload;
} }
} }
} }

@ -0,0 +1,46 @@
using NLog;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Notifications.Slack.Payloads;
using NzbDrone.Core.Rest;
namespace NzbDrone.Core.Notifications.Slack
{
public interface ISlackProxy
{
void SendPayload(SlackPayload payload, SlackSettings settings);
}
public class SlackProxy : ISlackProxy
{
private readonly IHttpClient _httpClient;
private readonly Logger _logger;
public SlackProxy(IHttpClient httpClient, Logger logger)
{
_httpClient = httpClient;
_logger = logger;
}
public void SendPayload(SlackPayload payload, SlackSettings settings)
{
try
{
var request = new HttpRequestBuilder(settings.WebHookUrl)
.Accept(HttpAccept.Json)
.Build();
request.Method = HttpMethod.POST;
request.Headers.ContentType = "application/json";
request.SetContent(payload.ToJson());
_httpClient.Execute(request);
}
catch (RestException ex)
{
_logger.Error(ex, "Unable to post payload {0}", payload);
throw new SlackExeption("Unable to post payload", ex);
}
}
}
}

@ -24,7 +24,7 @@ namespace NzbDrone.Core.Notifications.Slack
[FieldDefinition(1, Label = "Username", HelpText = "Choose the username that this integration will post as", Type = FieldType.Textbox)] [FieldDefinition(1, Label = "Username", HelpText = "Choose the username that this integration will post as", Type = FieldType.Textbox)]
public string Username { get; set; } public string Username { get; set; }
[FieldDefinition(2, Label = "Icon", HelpText = "Change the icon that is used for messages from this integration", Type = FieldType.Textbox, HelpLink = "http://www.emoji-cheat-sheet.com/")] [FieldDefinition(2, Label = "Icon", HelpText = "Change the icon that is used for messages from this integration (Emoji or URL)", Type = FieldType.Textbox, HelpLink = "http://www.emoji-cheat-sheet.com/")]
public string Icon { get; set; } public string Icon { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

@ -896,6 +896,7 @@
<Compile Include="Notifications\Slack\Payloads\SlackPayload.cs" /> <Compile Include="Notifications\Slack\Payloads\SlackPayload.cs" />
<Compile Include="Notifications\Slack\Slack.cs" /> <Compile Include="Notifications\Slack\Slack.cs" />
<Compile Include="Notifications\Slack\SlackExeption.cs" /> <Compile Include="Notifications\Slack\SlackExeption.cs" />
<Compile Include="Notifications\Slack\SlackProxy.cs" />
<Compile Include="Notifications\Slack\SlackSettings.cs" /> <Compile Include="Notifications\Slack\SlackSettings.cs" />
<Compile Include="Notifications\Synology\SynologyException.cs" /> <Compile Include="Notifications\Synology\SynologyException.cs" />
<Compile Include="Notifications\Synology\SynologyIndexer.cs" /> <Compile Include="Notifications\Synology\SynologyIndexer.cs" />

Loading…
Cancel
Save