/// <inheritdoc /> protected override async Task InternalExecute(Channel incomingCallChannel, StasisStartEventArgs args) { var callerExtension = incomingCallChannel.Caller.Number; var callId = Guid.NewGuid(); var mainBridge = await InitializeMainBridge(incomingCallChannel.Id, callerExtension, callId); if (mainBridge == null) { return; } var channel = new DAL.Entities.Channel { ChannelId = incomingCallChannel.Id, Extension = callerExtension, CallId = callId, BridgeId = mainBridge, Role = ChannelRoleType.ExternalChannel }; var bNumber = incomingCallChannel.Dialplan.Exten; await _queueSender.Publish(new IncomingCallIntegrationEvent { CallId = callId, CallerExtension = callerExtension, BNumber = bNumber, }); Logger.Information($"Sent message to queue about incoming call. Caller: {callerExtension}; ChannelId: {incomingCallChannel.Id}"); await ChannelRepository.AddChannel(channel); }
private void NotifyAboutNewSms(Guid smsId, string senderExtension, string smsText, SmsMetadata smsMetadata) { _logger.Debug($"Отправка SMS в шину. SenderExtension: {senderExtension}"); var position = smsMetadata.Position == null ? null : new Position { Latitude = smsMetadata.Position.Latitude, Longitude = smsMetadata.Position.Longitude }; var smsEvent = new IncomingSmsIntegrationEvent { CallerExtension = senderExtension, Sms = new Sms { Message = smsText, Timestamp = smsMetadata.Timestamp, Location = new Location { InnerRadius = smsMetadata.InnerRadius, OpeningAngle = smsMetadata.OpeningAngle, OuterRadius = smsMetadata.OuterRadius, Radius = smsMetadata.Radius, StartAngle = smsMetadata.StartAngle, Position = position } }, SmsId = smsId }; _queueSender.Publish(smsEvent); }
/// <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); } }
/// <summary> /// Отправить событие о том, что участник разговора, который звонил в службу завершил разговор /// </summary> private async Task NotifyIfIncomingCallEnded(DAL.Entities.Channel channelEntity) { if (channelEntity.Role == ChannelRoleType.ExternalChannel) { await _queueSender.Publish(new EndCallIntegrationEvent { CallId = channelEntity.CallId }); } }
/// <inheritdoc /> protected override async Task InternalExecute(Channel destinationChannel, StasisStartEventArgs args) { var routeData = args.RouteData; Logger.Information($"AcceptedCallFromUserCommand. DestinationChannelId: {destinationChannel.Id}, UserChannelId: {args.ChannelId}"); try { var destinationExtension = routeData.ToExtension; var destinationChannelEntity = await ChannelRepository.GetByChannelId(destinationChannel.Id); if (destinationChannelEntity == null) { Logger.Warning($"Канал вызываемого участника не найден. ChannelId: {destinationChannel.Id}"); return; } var channelsInBridge = await ChannelRepository.GetByBridgeId(destinationChannelEntity.BridgeId); var userChannel = channelsInBridge.SingleOrDefault(x => x.Role == ChannelRoleType.Conference); if (userChannel == null) { Logger.Warning($"Канал пользователя не найден. LineId: {routeData.LineId}"); return; } var callId = destinationChannelEntity.CallId; await StartCallRecording(userChannel.ChannelId, userChannel.CallId, userChannel.Extension, userChannel.Role, userChannel.BridgeId, routeData.LineId); await InitializeRecordingChannel(destinationChannel.Id, destinationExtension, destinationChannelEntity.Role, userChannel.BridgeId, callId, routeData.LineId); destinationChannelEntity.Role = ChannelRoleType.ExternalChannel; await ChannelRepository.UpdateChannel(destinationChannelEntity); await AriClient.StopBeeps(args.PlaybackId); await AriClient.AddChannelToBridge(userChannel.BridgeId, destinationChannel.Id); Logger.Information($"Участник разговора {destinationExtension} принял вызов от пользователя {userChannel.Extension}"); await _queueSender.Publish(new AcceptCallFromUserIntegrationEvent { CallId = callId }); } catch (Exception ex) { Logger.Warning("AcceptedCallFromUserCommand Error", ex); } }
/// <inheritdoc /> protected override async Task InternalExecute(Channel channel, StasisStartEventArgs args) { var channelId = channel.Id; Logger.Information($"RejectedCallFromUserCommand. DestinationChannelId: {channel.Id}"); try { var destinationChannel = await ChannelRepository.GetByChannelId(channelId); if (destinationChannel == null || destinationChannel.Role != ChannelRoleType.RingingFromUser) { Logger.Debug($"RejectedCallFromUserCommand. Канал участника уничтожен. CallId: {destinationChannel?.CallId}. {destinationChannel?.Role}"); return; } await ChannelRepository.DeleteChannel(destinationChannel.ChannelId); var channelsInBridge = await ChannelRepository.GetByBridgeId(destinationChannel.BridgeId); var userChannel = channelsInBridge.SingleOrDefault(x => x.Role == ChannelRoleType.Conference); if (userChannel == null) { Logger.Warning("RejectedCallFromUserCommand. Канал пользователя не найден."); return; } await AriClient.HangupChannel(userChannel.ChannelId); Logger.Information($"Отправка информации о том, что участник не принял или отклонил вызов от пользователя. Destination: {destinationChannel.Extension}"); await _queueSender.Publish(new RejectCallIntegrationEvent { CallId = destinationChannel.CallId }); } catch (Exception ex) { Logger.Warning("RejectedCallFromUserCommand Error", ex); } }