using System ;
using System.Collections.Generic ;
using System.Threading.Tasks ;
using Microsoft.Extensions.Logging ;
using Ombi.Api.Discord ;
using Ombi.Api.Discord.Models ;
using Ombi.Core.Settings ;
using Ombi.Helpers ;
using Ombi.Notifications.Interfaces ;
using Ombi.Notifications.Models ;
using Ombi.Settings.Settings.Models.Notifications ;
using Ombi.Store.Entities ;
using Ombi.Store.Repository ;
using Ombi.Store.Repository.Requests ;
namespace Ombi.Notifications.Agents
{
public class DiscordNotification : BaseNotification < DiscordNotificationSettings > , IDiscordNotification
{
public DiscordNotification ( IDiscordApi api , ISettingsService < DiscordNotificationSettings > sn , ILogger < DiscordNotification > log , INotificationTemplatesRepository r , IMovieRequestRepository m , ITvRequestRepository t ) : base ( sn , r , m , t )
{
Api = api ;
Logger = log ;
}
public override string NotificationName = > "DiscordNotification" ;
private IDiscordApi Api { get ; }
private ILogger < DiscordNotification > Logger { get ; }
protected override bool ValidateConfiguration ( DiscordNotificationSettings settings )
{
if ( ! settings . Enabled )
{
return false ;
}
if ( string . IsNullOrEmpty ( settings . WebhookUrl ) )
{
return false ;
}
try
{
var a = settings . Token ;
var b = settings . WebookId ;
}
catch ( IndexOutOfRangeException )
{
return false ;
}
return true ;
}
protected override async Task NewRequest ( NotificationOptions model , DiscordNotificationSettings settings )
{
var parsed = await LoadTemplate ( NotificationAgent . Discord , NotificationType . NewRequest , model ) ;
var notification = new NotificationMessage
{
Message = parsed . Message ,
} ;
notification . Other . Add ( "image" , parsed . Image ) ;
await Send ( notification , settings ) ;
}
protected override async Task Issue ( NotificationOptions model , DiscordNotificationSettings settings )
{
var parsed = await LoadTemplate ( NotificationAgent . Discord , NotificationType . Issue , model ) ;
var notification = new NotificationMessage
{
Message = parsed . Message ,
} ;
notification . Other . Add ( "image" , parsed . Image ) ;
await Send ( notification , settings ) ;
}
protected override async Task AddedToRequestQueue ( NotificationOptions model , DiscordNotificationSettings settings )
{
var user = string . Empty ;
var title = string . Empty ;
var image = string . Empty ;
if ( model . RequestType = = RequestType . Movie )
{
user = MovieRequest . RequestedUser . UserAlias ;
title = MovieRequest . Title ;
image = MovieRequest . PosterPath ;
}
else
{
user = TvRequest . RequestedUser . UserAlias ;
title = TvRequest . ParentRequest . Title ;
image = TvRequest . ParentRequest . PosterPath ;
}
var message = $"Hello! The user '{user}' has requested {title} but it could not be added. This has been added into the requests queue and will keep retrying" ;
var notification = new NotificationMessage
{
Message = message
} ;
notification . Other . Add ( "image" , image ) ;
await Send ( notification , settings ) ;
}
protected override async Task RequestDeclined ( NotificationOptions model , DiscordNotificationSettings settings )
{
var parsed = await LoadTemplate ( NotificationAgent . Discord , NotificationType . RequestDeclined , model ) ;
var notification = new NotificationMessage
{
Message = parsed . Message ,
} ;
notification . Other . Add ( "image" , parsed . Image ) ;
await Send ( notification , settings ) ;
}
protected override async Task RequestApproved ( NotificationOptions model , DiscordNotificationSettings settings )
{
var parsed = await LoadTemplate ( NotificationAgent . Discord , NotificationType . RequestApproved , model ) ;
var notification = new NotificationMessage
{
Message = parsed . Message ,
} ;
notification . Other . Add ( "image" , parsed . Image ) ;
await Send ( notification , settings ) ;
}
protected override async Task AvailableRequest ( NotificationOptions model , DiscordNotificationSettings settings )
{
var parsed = await LoadTemplate ( NotificationAgent . Discord , NotificationType . RequestAvailable , model ) ;
var notification = new NotificationMessage
{
Message = parsed . Message ,
} ;
notification . Other . Add ( "image" , parsed . Image ) ;
await Send ( notification , settings ) ;
}
protected override async Task Send ( NotificationMessage model , DiscordNotificationSettings settings )
{
try
{
var discordBody = new DiscordWebhookBody
{
content = model . Message ,
username = settings . Username ,
} ;
string image ;
if ( model . Other . TryGetValue ( "image" , out image ) )
{
discordBody . embeds = new List < DiscordEmbeds >
{
new DiscordEmbeds
{
image = new DiscordImage
{
url = image
}
}
} ;
}
await Api . SendMessage ( discordBody , settings . WebookId , settings . Token ) ;
}
catch ( Exception e )
{
Logger . LogError ( LoggingEvents . DiscordNotification , e , "Failed to send Discord Notification" ) ;
}
}
protected override async Task Test ( NotificationOptions model , DiscordNotificationSettings settings )
{
var message = $"This is a test from Ombi, if you can see this then we have successfully pushed a notification!" ;
var notification = new NotificationMessage
{
Message = message ,
} ;
await Send ( notification , settings ) ;
}
}
}