using BotSharp.Abstraction.Infrastructures; using BotSharp.Core.Infrastructures; using BotSharp.Plugin.Twilio.Interfaces; using BotSharp.Plugin.Twilio.Models; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace BotSharp.Plugin.Twilio.Controllers; public class TwilioRecordController : TwilioController { private readonly TwilioSetting _settings; private readonly IServiceProvider _services; private readonly ILogger _logger; public TwilioRecordController(TwilioSetting settings, IServiceProvider services, IHttpContextAccessor context, ILogger logger) { _settings = settings; _services = services; _logger = logger; } [ValidateRequest] [HttpPost("twilio/record/status")] public async Task PhoneRecordingStatus(ConversationalVoiceRequest request) { if (request.RecordingStatus == "completed") { _logger.LogInformation($"Recording completed for {request.CallSid}, the record URL is {request.RecordingUrl}"); // Set the recording URL to the conversation state var convService = _services.GetRequiredService(); convService.SetConversationId(request.ConversationId, new List { new("phone_recording_url", request.RecordingUrl) }); convService.SaveStates(); // recording completed var emitOptions = new HookEmitOption { ShouldExecute = hook => hook.IsMatch(request) }; await HookEmitter.Emit(_services, x => x.OnRecordingCompleted(request), emitOptions); } else { _logger.LogError($"Unknown record status: {request.CallStatus}, {request.CallSid}"); } return Ok(); } }