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); } }