• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/V2/Chat/PrivateChat.php
  • Класс: BitrixImV2ChatPrivateChat
  • Вызов: PrivateChat::add
public function add(array $params, ?Context $context = null): Result
{
	$result = new Result;

	$paramsResult = $this->prepareParams($params);
	if (!$paramsResult->isSuccess())
	{
		return $result->addErrors($paramsResult->getErrors());
	}

	$params = $paramsResult->getResult();

	if (!BitrixImDialog::hasAccess($params['FROM_USER_ID'], $params['TO_USER_ID']))
	{
		return $result->addError(new ChatError(ChatError::ACCESS_DENIED));
	}

	if ($params['FROM_USER_ID'] == $params['TO_USER_ID'])
	{
		return (new FavoriteChat($params))->add($params);
	}

	$chatResult = self::find($params);
	if ($chatResult->isSuccess() && $chatResult->hasResult())
	{
		$chatParams = $chatResult->getResult();

		return $result->setResult([
			'CHAT_ID' => (int)$chatParams['ID'],
			'CHAT' => self::load($chatParams),
		]);
	}

	$chat = new static($params);
	$chat->save();

	if ($chat->getChatId() <= 0)
	{
		return $result->addError(new ChatError(ChatError::CREATION_ERROR));
	}

	BitrixImModelRelationTable::add([
		'CHAT_ID' => $chat->getChatId(),
		'MESSAGE_TYPE' => IM_MESSAGE_PRIVATE,
		'USER_ID' => $params['FROM_USER_ID'],
		'STATUS' => IM_STATUS_READ,
	]);
	BitrixImModelRelationTable::add([
		'CHAT_ID' => $chat->getChatId(),
		'MESSAGE_TYPE' => IM_MESSAGE_PRIVATE,
		'USER_ID' => $params['TO_USER_ID'],
		'STATUS' => IM_STATUS_READ,
	]);

	$botJoinFields = [
		'CHAT_TYPE' => IM_MESSAGE_PRIVATE,
		'MESSAGE_TYPE' => IM_MESSAGE_PRIVATE
	];
	if (
		User::getInstance($params['FROM_USER_ID'])->isExists()
		&& !User::getInstance($params['FROM_USER_ID'])->isBot()
	)
	{
		$botJoinFields['BOT_ID'] = $params['TO_USER_ID'];
		$botJoinFields['USER_ID'] = $params['FROM_USER_ID'];
		$botJoinFields['TO_USER_ID'] = $params['TO_USER_ID'];
		$botJoinFields['FROM_USER_ID'] = $params['FROM_USER_ID'];
		BitrixImBot::onJoinChat($params['FROM_USER_ID'], $botJoinFields);
	}
	elseif (
		User::getInstance($params['TO_USER_ID'])->isExists()
		&& !User::getInstance($params['TO_USER_ID'])->isBot()
	)
	{
		$botJoinFields['BOT_ID'] = $params['FROM_USER_ID'];
		$botJoinFields['USER_ID'] = $params['TO_USER_ID'];
		$botJoinFields['TO_USER_ID'] = $params['TO_USER_ID'];
		$botJoinFields['FROM_USER_ID'] = $params['FROM_USER_ID'];
		BitrixImBot::onJoinChat($params['TO_USER_ID'], $botJoinFields);
	}

	return $result->setResult([
		'CHAT_ID' => $chat->getChatId(),
		'CHAT' => $chat,
	]);
}