예제 #1
0
        /// <summary>
        /// Выполнить команду
        /// </summary>
        protected override async Task InternalExecute(Channel channel, StasisStartEventArgs args)
        {
            if (!(args is RecordingEventArgs eventArgs))
            {
                throw new ArgumentException($"RecordingStartedCommand. Incorrect argument type {nameof(args)}");
            }

            try
            {
                var audioRecord = await AudioRecordRepository.GetRecordByName(eventArgs.RecordName);

                if (audioRecord != null)
                {
                    audioRecord.RecordingStartTime = eventArgs.EventTime;
                    await AudioRecordRepository.UpdateRecord(audioRecord);
                }
                else
                {
                    Logger.Warning($"RecordingStartedCommand. AudioRecord not found. RecordName: {eventArgs.RecordName}.");
                }
            }
            catch (Exception ex)
            {
                Logger.Warning("RecordingStartedCommand.Error.", ex);
            }
        }
예제 #2
0
        /// <summary>
        /// Выполнить команду
        /// </summary>
        protected override async Task InternalExecute(Channel channel, StasisStartEventArgs args)
        {
            if (!(args is RecordingEventArgs eventArgs))
            {
                throw new ArgumentException($"RecordingEndedCommand. Incorrect argument type {nameof(args)}");
            }

            try
            {
                var audioRecord = await AudioRecordRepository.GetRecordByName(eventArgs.RecordName);

                if (audioRecord == null || audioRecord.RecordingStartTime.HasValue == false)
                {
                    Logger.Warning($"Record with name {eventArgs.RecordName} not found");
                    return;
                }

                Logger.Information($"Audio record created. RecordName: {eventArgs.RecordName};");
                await _queueSender.Publish(new AudioRecordedIntegrationEvent
                {
                    LineId             = audioRecord.LineId,
                    CallId             = audioRecord.CallId,
                    FileName           = $"{eventArgs.RecordName}.{AsteriskAriClient.RecordingFormat}",
                    RecordingStartTime = audioRecord.RecordingStartTime.Value,
                    RecordingEndTime   = eventArgs.EventTime
                });

                audioRecord.RecordingEndTime = eventArgs.EventTime;
                await AudioRecordRepository.UpdateRecord(audioRecord);
            }
            catch (Exception ex)
            {
                Logger.Warning("RecordingEndedCommand.Error.", ex);
            }
        }
예제 #3
0
        /// <summary>
        /// Начать запись канала
        /// </summary>
        protected async Task <Result> StartRecordingChannel(string snoopChannelId, Guid callId, Guid?lineId)
        {
            if (!_asteriskOptions.RecordingEnabled)
            {
                return(Result.Failure(ErrorCodes.RecordingError));
            }

            var audioRecord = new AudioRecord
            {
                CallId   = callId,
                LineId   = lineId,
                FileName = snoopChannelId
            };
            await AudioRecordRepository.AddAudioRecord(audioRecord);

            var result = await AriClient.StartRecordingChannel(snoopChannelId);

            if (result.IsFailure)
            {
                Logger.Warning($"StartRecordingChannel. Could not start recording channel. CallId: {callId}");
                return(result);
            }

            Logger.Information($"StartRecordingChannel. Channel recording started. {snoopChannelId}");

            return(Result.Success());
        }
예제 #4
0
        /// <summary>
        /// Начать запись разговора
        /// </summary>
        protected async Task StartCallRecording(string initialChannelId, Guid initialCallId, string extension, ChannelRoleType role, string mainBridgeId, Guid?lineId = null)
        {
            if (!_asteriskOptions.RecordingEnabled)
            {
                return;
            }

            var recordsBridgeId = GetCommonRecordingBridgeId(mainBridgeId);
            var fullAudioRecord = new AudioRecord
            {
                FileName = $"{recordsBridgeId}",
                LineId   = lineId,
                CallId   = null
            };
            await AudioRecordRepository.AddAudioRecord(fullAudioRecord);

            await AriClient.CreateBridge(recordsBridgeId);

            await AddChannelToCommonRecordingBridge(initialChannelId, extension, role, mainBridgeId, initialCallId, lineId);

            var result = await AriClient.StartRecordingBridge(recordsBridgeId);

            if (result.IsFailure)
            {
                Logger.Warning($"StartCallRecording. Failed to start call recording. MainBridgeId: {mainBridgeId}");
                return;
            }

            await CreateSnoopChannelForRecording(initialChannelId, extension, role, false, initialCallId, lineId);

            Logger.Information($"StartRecordingBridge. Bridge recording started. {mainBridgeId}");
        }
        private async Task DestroyRecordingBridge(string bridgeId)
        {
            var commonRecordsBridgeId = GetCommonRecordingBridgeId(bridgeId);
            var audioRecordCommon     = await AudioRecordRepository.GetRecordByName(commonRecordsBridgeId);

            if (audioRecordCommon == null)
            {
                return;
            }

            var recordingBridgeId = GetCommonRecordingBridgeId(bridgeId);

            AriClient.DestroyBridge(recordingBridgeId);
        }
예제 #6
0
        private async Task UpdateAudioRecords(string mainBridgeId, Guid initCallId, Guid?lineId)
        {
            var commonBridgeId = GetCommonRecordingBridgeId(mainBridgeId);

            var audioRecord = await AudioRecordRepository.GetRecordByName(commonBridgeId);

            if (audioRecord != null)
            {
                audioRecord.LineId = lineId;
                await AudioRecordRepository.UpdateRecord(audioRecord);
            }

            var initCallRecord = await AudioRecordRepository.GetRecordByCallId(initCallId);

            if (initCallRecord != null)
            {
                initCallRecord.LineId = lineId;
                await AudioRecordRepository.UpdateRecord(initCallRecord);
            }
        }