Esempio n. 1
0
        public async Task DoStepAsync(Step step, ICall call)
        {
            _call = call;
            _step = step;
            var transferSettings = step.NodeData.Properties as TransferSettings;

            call.CallState.CallCanBeAbandoned = false;
            var transferLine =
                await call.SipLineApi.CreateOutboundCallAsync(transferSettings.DialString, transferSettings.Endpoint);

            transferChannel = call.CallState.CreateTransferLine(transferLine);
            await Task.Delay(500);

            call.SipApiClient.OnLineHangupAsyncEvent += SipApiClientOnOnLineHangupEvent;

            switch (transferSettings.Direction)
            {
            case Direction.Outgoing:
            {
                var transferBridge = await call.CreateBridgeAsync(BridgeType.WithDTMF);

                outboundLineId = call.CallState.GetOutgoingLineId();
                await Task.Delay(500);

                await call.AddLineToBridgeAsync(call.CallState.GetOutgoingLineId(), transferBridge.Id);

                await Task.Delay(500);

                await call.AddLineToBridgeAsync(transferChannel.Id.ToString(), transferBridge.Id);

                break;
            }

            case Direction.Incoming:
            {
                var transferBridge = await call.CreateBridgeAsync(BridgeType.WithDTMF);

                await call.AddLineToBridgeAsync(call.CallState.GetIncomingLineId(), transferBridge.Id);

                await call.AddLineToBridgeAsync(transferChannel.Id.ToString(), transferBridge.Id);

                break;
            }

            case Direction.Both:
                // bad config here?
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 2
0
        public async Task DoStepAsync(Step step, ICall call)
        {
            _call = call;
            if (!string.IsNullOrEmpty(call.CallState.GetBridgeId()))
            {
                await call.StopHoldingBridgeAsync().ConfigureAwait(false);
            }
            _callBridge = await call.CreateBridgeAsync(BridgeType.NoDTMF).ConfigureAwait(false);

            call.CallState.CalledPartyAcceptTime = DateTimeOffset.Now;
            call.CallState.SetBridge(_callBridge);
            call.InputProcessor.ChangeInputSettings(null);

            if (!await AreBothLinesStillConnected())
            {
                await call.FireStateChange(Trigger.FailedCallFlow);

                return;
            }
            await call.AddLineToBridgeAsync(call.CallState.GetIncomingLineId(), _callBridge.Id).ConfigureAwait(false);

            //await call.SipBridgingApi.MuteLineAsync(call.CallState.GetIncomingLineId());
            await call.AddLineToBridgeAsync(call.CallState.GetOutgoingLineId(), _callBridge.Id).ConfigureAwait(false);

            //await call.SipBridgingApi.MuteLineAsync(call.CallState.GetOutgoingLineId());

            call.CallState.AddStepToIncomingQueue(step.GetStepFromConnector(NextStep));
            await call.FireStateChange(Trigger.NextCallFlowStep);
        }
Esempio n. 3
0
        public async Task DoStepAsync(Step step, ICall call)
        {
            _call = call;
            _call.OnWorkflowStep += OnWorkflowStep;
            _call.Logger.Information("Hold processor start {@Call}", call.CallState);
            _settings    = (HoldStepSettings)step.NodeData.Properties;
            _timeoutStep = step.GetStepFromConnector("TimeoutStep");

            _holdingBridge = await call.CreateBridgeAsync(BridgeType.Holding);

            _call.CallState.SetBridge(_holdingBridge);
            try
            {
                await _call.SipBridgingApi.AddLineToBridgeAsync(_call.CallState.GetIncomingLineId(), _call.CallState.GetBridgeId());
            }
            catch (Exception e)
            {
                _call.Logger.Error(e, "Failed to place line on hold. Probably hungup. {@Call}", call.CallState);
                await _call.FireStateChange(Trigger.FailedCallFlow);

                await _call.ProcessCallLogicAsync();

                return;
            }

            if (_settings.HoldMusic)
            {
                await _call.SipBridgingApi.PlayMusicOnHoldToBridgeAsync(_call.CallState.GetBridgeId());
            }
            else
            {
                _call.CallState.HoldPrompt = _settings.WaitPrompt;
                _call.SipApiClient.OnPromptPlaybackFinishedAsyncEvent += AriClient_OnPlaybackFinishedAsyncEvent;
                _currentPlaybackId = await _call.SipBridgingApi.PlayPromptToBridgeAsync(_call.CallState.GetBridgeId(), _settings.WaitPrompt, call.CallState.LanguageCode);
            }
            call.SipApiClient.OnLineHangupAsyncEvent += SipApiClientOnOnLineHangupEvent;

            await _call.FireStateChange(Trigger.PlaceOnHold);

            _call.Logger.Information("Hold processor fired {@Call}", call.CallState);

#pragma warning disable 4014 // we want to keep going without waiting.
            _call.ProcessCallLogicAsync();
#pragma warning restore 4014

            await Task.Delay(_settings.HoldTimeoutInSeconds * 1000).ContinueWith(HoldTimeoutAction());
        }