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);
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        /// <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);
            }
        }
Exemplo n.º 5
0
        /// <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);
            }
        }