Example #1
0
        public async Task DoStep(Step step, ICall call)
        {
            _call = call;
            _call.OnWorkflowStep += OnWorkflowStep;
            _call.Logger.Info("Hold processor start");
            _settings = (HoldStepSettings)step.NodeData.Properties;
            var holdingBridge = await call.CreateBridge(BridgeType.Holding);

            _call.CallState.SetBridge(holdingBridge);
            await _call.SipBridgingApi.AddLineToBridge(_call.CallState.GetIncomingLineId(), _call.CallState.GetBridgeId());

            if (_settings.HoldMusic)
            {
                await _call.SipBridgingApi.PlayMusicOnHoldToBridge(_call.CallState.GetBridgeId());
            }
            else
            {
                HoldPrompt = _settings.WaitPrompt;
                _call.SipApiClient.OnPromptPlaybackFinishedEvent += AriClient_OnPlaybackFinishedEvent;
                _currentPlaybackId = await _call.SipBridgingApi.PlayPromptToBridge(_call.CallState.GetBridgeId(), _settings.WaitPrompt, call.CallState.LanguageCode);
            }
            _call.FireStateChange(Trigger.PlaceOnHold);
            _call.Logger.Info("Hold processor fired");
            _call.ProcessCallLogic();
        }
Example #2
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());
        }