• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/controller/call.php
  • Класс: BitrixImControllerCall
  • Вызов: Call::declineAction
public function declineAction(int $callId, $callInstanceId, int $code = 603)
{
	$currentUserId = $this->getCurrentUser()->getId();
	$call = Registry::getCallWithId($callId);
	if (!$call)
	{
		$this->addError(new Error(Loc::getMessage("IM_REST_CALL_ERROR_CALL_NOT_FOUND"), "call_not_found"));
		return null;
	}

	if(!$this->checkCallAccess($call, $currentUserId))
		return null;

	$lockName = static::getLockNameWithCallId($callId);
	if (!Application::getConnection()->lock($lockName, static::LOCK_TTL))
	{
		$this->addError(new Error("Could not get exclusive lock", "could_not_lock"));
		return null;
	}

	$callUser = $call->getUser($currentUserId);
	if(!$callUser)
	{
		$this->addError(new Error("User is not part of the call", "unknown_call_user"));
		Application::getConnection()->unlock($lockName);
		return null;
	}

	if ($callUser->getState() === CallUser::STATE_READY)
	{
		$this->addError(new Error("Can not decline in {$callUser->getState()} user state", "wrong_user_state"));
		Application::getConnection()->unlock($lockName);
		return null;
	}

	if($code === 486)
	{
		$callUser->updateState(CallUser::STATE_BUSY);
	}
	else
	{
		$callUser->updateState(CallUser::STATE_DECLINED);
	}
	$callUser->updateLastSeen(new DateTime());

	$userIds = $call->getUsers();
	$call->getSignaling()->sendHangup($currentUserId, $userIds, $callInstanceId, $code);

	if(!$call->hasActiveUsers())
	{
		$call->finish();
	}

	Application::getConnection()->unlock($lockName);
}