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