58 lines
2.6 KiB
C#
58 lines
2.6 KiB
C#
using System.Net;
|
|
using dy.net.model.entity;
|
|
|
|
namespace dy.net.service
|
|
{
|
|
public sealed class LiveEmailNotificationService
|
|
{
|
|
private readonly EmailNotificationSettingsService _settingsService;
|
|
private readonly IEmailNotificationSender _sender;
|
|
|
|
public LiveEmailNotificationService(
|
|
EmailNotificationSettingsService settingsService,
|
|
IEmailNotificationSender sender)
|
|
{
|
|
_settingsService = settingsService;
|
|
_sender = sender;
|
|
}
|
|
|
|
public Task<string> GetReadinessErrorAsync() => _settingsService.GetReadinessErrorAsync();
|
|
|
|
public async Task<(bool Sent, string Error)> SendLiveStartedAsync(
|
|
DouyinFollowed follow,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
try
|
|
{
|
|
var settings = await _settingsService.GetAsync();
|
|
if (!settings.Enabled || !follow.LiveEmailNotificationEnabled) return (false, null);
|
|
var password = await _settingsService.GetPasswordAsync(settings);
|
|
var roomUrl = !string.IsNullOrWhiteSpace(follow.LiveWebRid)
|
|
? "https://live.douyin.com/" + Uri.EscapeDataString(follow.LiveWebRid)
|
|
: "https://www.douyin.com/user/" + Uri.EscapeDataString(follow.SecUid ?? string.Empty);
|
|
var blogger = WebUtility.HtmlEncode(follow.UperName ?? "关注博主");
|
|
var title = WebUtility.HtmlEncode(follow.LiveTitle ?? "正在直播");
|
|
var safeUrl = WebUtility.HtmlEncode(roomUrl);
|
|
var subject = $"[dysync.net] {follow.UperName ?? "关注博主"} 开播了";
|
|
var body = $"<h2>{blogger} 正在直播</h2><p>{title}</p>" +
|
|
$"<p>检测时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>" +
|
|
$"<p><a href=\"{safeUrl}\">进入直播间</a></p>";
|
|
await _sender.SendAsync(settings, password, subject, body, cancellationToken);
|
|
return (true, null);
|
|
}
|
|
catch (Exception ex) when (ex is not OperationCanceledException)
|
|
{
|
|
Serilog.Log.Warning(ex, "发送开播邮件失败:Blogger={Blogger}", follow.UperName);
|
|
return (false, SafeError(ex));
|
|
}
|
|
}
|
|
|
|
private static string SafeError(Exception ex)
|
|
{
|
|
var message = ex.GetBaseException().Message?.Trim();
|
|
if (string.IsNullOrWhiteSpace(message)) return "开播邮件发送失败,请检查邮箱设置";
|
|
return message.Length <= 1000 ? message : message[..1000];
|
|
}
|
|
}
|
|
}
|