Files
live_recorder/src/LiveRecorder.Application/Services/LiveRoomStatusService.cs
T

75 lines
2.6 KiB
C#

using LiveRecorder.Application.Abstractions.Notifications;
using LiveRecorder.Application.Abstractions.Platforms;
using LiveRecorder.Application.Abstractions.Scripting;
using LiveRecorder.Domain.Entities;
using LiveRecorder.Domain.Enums;
namespace LiveRecorder.Application.Services;
public sealed class LiveRoomStatusService
{
private readonly IEmailNotificationService _emailNotificationService;
private readonly IWebhookNotificationService _webhookNotificationService;
private readonly IEventScriptService _eventScriptService;
public LiveRoomStatusService(
IEmailNotificationService emailNotificationService,
IWebhookNotificationService webhookNotificationService,
IEventScriptService eventScriptService)
{
_emailNotificationService = emailNotificationService;
_webhookNotificationService = webhookNotificationService;
_eventScriptService = eventScriptService;
}
public async Task ApplySnapshotAsync(
LiveRoom liveRoom,
LiveStatusSnapshot liveStatus,
DateTimeOffset observedAt,
bool updateMetadata = true,
CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(liveRoom);
ArgumentNullException.ThrowIfNull(liveStatus);
var wasLive = liveRoom.AvailabilityStatus == LiveRoomAvailabilityStatus.Live;
if (updateMetadata)
{
liveRoom.UpdateMetadata(
liveStatus.Title,
liveStatus.AnchorName,
liveStatus.AnchorId,
liveStatus.AvatarUrl,
liveStatus.CoverUrl,
observedAt);
}
liveRoom.UpdateAvailability(
liveStatus.IsLive ? LiveRoomAvailabilityStatus.Live : LiveRoomAvailabilityStatus.Offline,
observedAt);
if (wasLive && !liveStatus.IsLive)
{
await _eventScriptService.RunLiveEndedAsync(liveRoom, observedAt, cancellationToken);
return;
}
if (!liveStatus.IsLive || liveRoom.HasSentLiveNotificationForCurrentSession)
{
return;
}
var eventScriptResult = await _eventScriptService.RunLiveStartedAsync(liveRoom, observedAt, cancellationToken);
await _emailNotificationService.SendLiveStartedAsync(
liveRoom,
cancellationToken,
eventScriptOutput: eventScriptResult?.CustomLogOutput);
await _webhookNotificationService.SendLiveStartedAsync(
liveRoom,
cancellationToken,
eventScriptOutput: eventScriptResult?.CustomLogOutput);
liveRoom.MarkLiveNotificationSent(observedAt);
}
}