private async void HandleDial(Command command, RemoteUser remoteUser) { var callerNumber = _commandBuilder.GetUnderlyingObject <string>(command); var opponent = _connectionsManager.FindRemoteUserByNumber(callerNumber); var dialResult = new DialResult(); if (opponent == null) { var opponentUser = _usersRepository.GetByNumber(callerNumber); if (opponentUser != null) { _pushSender.SendVoipPush(opponentUser.PushUri, remoteUser.User.Number, remoteUser.User.Number); var resultCommand = await _connectionsManager.PostWaiter(opponentUser.UserId, CommandName.IncomingCall); var answerType = _commandBuilder.GetUnderlyingObject <AnswerResultType>(resultCommand); if (answerType == AnswerResultType.Answered) { dialResult.Result = DialResultType.Answered; opponent.IsInCallWith = remoteUser; remoteUser.IsInCallWith = opponent; } else { dialResult.Result = DialResultType.Declined; } } else { dialResult.Result = DialResultType.NotFound; } } else { var incomingCallCommand = _commandBuilder.Create(CommandName.IncomingCall, callerNumber); var resultCommand = await opponent.Peer.SendCommandAndWaitAnswer(incomingCallCommand); var answerType = _commandBuilder.GetUnderlyingObject <AnswerResultType>(resultCommand); if (answerType == AnswerResultType.Answered) { dialResult.Result = DialResultType.Answered; opponent.IsInCallWith = remoteUser; remoteUser.IsInCallWith = opponent; } else { dialResult.Result = DialResultType.Declined; } } _commandBuilder.ChangeUnderlyingObject(command, dialResult); remoteUser.Peer.SendCommand(command); }