75 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|