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(); }
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()); }