private async Task DestroyBridge(string bridgeId) { Logger.Information($"DestroyBridge: {bridgeId}"); var allChannelsInBridge = await ChannelRepository.GetByBridgeId(bridgeId); if (allChannelsInBridge.Count > 1) { Logger.Debug("Bridge contains more than 1 channel"); return; } if (allChannelsInBridge.Count == 1) { var lastChannelInBridge = allChannelsInBridge.First(); if (lastChannelInBridge.Interrupted) { Logger.Information($"Канал {lastChannelInBridge.ChannelId} {lastChannelInBridge.Role} ожидает ответа."); return; } await AriClient.HangupChannel(lastChannelInBridge.ChannelId); return; } AriClient.DestroyBridge(bridgeId); await DestroyRecordingBridge(bridgeId); }
private async Task HangUpAllChannelsInBridge(string bridgeId) { var allChannels = await ChannelRepository.GetByBridgeId(bridgeId); foreach (var channel in allChannels) { await AriClient.HangupChannel(channel.ChannelId); } }
private async Task HangUpOldSnoopChannels(string originalChannelId, IList <DAL.Entities.Channel> channelsInLine) { var snoopChannels = channelsInLine .Where(t => (t.Role == ChannelRoleType.SnoopChannel || t.Role == ChannelRoleType.SpeakSnoopChannel) && t.OriginalChannelId == originalChannelId) .ToList(); foreach (var snoopChannel in snoopChannels) { await AriClient.HangupChannel(snoopChannel.ChannelId); } }
/// <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); } }
/// <summary> /// Выполнить команду /// </summary> protected override async Task InternalExecute(Channel channel, StasisStartEventArgs args) { var routeData = args.RouteData; if (routeData.FromCallId.HasValue) { var incomingCallChannel = await ChannelRepository.GetChannelByCallId(routeData.FromCallId.Value); if (incomingCallChannel != null) { incomingCallChannel.Interrupted = true; await ChannelRepository.UpdateChannel(incomingCallChannel); } } var channelForDelete = await ChannelRepository.GetChannelByCallId(routeData.ToCallId); if (channelForDelete != null) { await AriClient.HangupChannel(channelForDelete.ChannelId); } }