• Модуль: imconnector
  • Путь к файлу: ~/bitrix/modules/imconnector/lib/Controller/Openlines.php
  • Класс: BitrixImConnectorControllerOpenlines
  • Вызов: Openlines::createAction
public function createAction(
	string $connectorId,
	string $botToken,
	?int $lineId = null,
	array $userIds = [],
	bool $withQr = false
): ?array
{
	$config = new Config();
	if (!$lineId)
	{
		$lineId = $config->create([
			'QUEUE' => array_merge([$this->getCurrentUser()->getId()], $userIds),
		]);
	}
	else
	{
		$info = Connector::infoConnectorsLine($lineId);
		if ($info && isset($info[$connectorId]))
		{
			$this->addError(new Error(
				Openlines::ERROR_CONNECTOR_ALREADY_EXISTS['message'],
				Openlines::ERROR_CONNECTOR_ALREADY_EXISTS['code']
			));
			return null;
		}
	}

	$connectorOutput = new Output($connectorId, $lineId);
	$status = Status::getInstance($connectorId, $lineId);

	$saveResult = $connectorOutput->saveSettings([
		'api_token' => $botToken,
	]);

	if (!$saveResult->isSuccess())
	{
		$this->addErrors($saveResult->getErrors());
		return null;
	}

	$testConnect = $connectorOutput->testConnect();

	if (!$testConnect->isSuccess())
	{
		$this->addErrors($testConnect->getErrors());
		return null;
	}

	$register = $connectorOutput->register();

	if (!$register->isSuccess())
	{
		$this->addErrors($register->getErrors());
		return null;
	}
	Cache::createInstance()->cleanDir(Library::CACHE_DIR_COMPONENT);

	$status
		->setActive(true)
		->setConnection(true)
		->setRegister(true)
		->setError(false)
	;


	if (!is_array($status->getData()))
	{
		$status->setData([]);
	}
	$status->save();

	Status::addBackgroundTasks($connectorId, $lineId);

	Connector::cleanCacheConnector($lineId, Connector::getCacheIdConnector($lineId, $connectorId));

	$connectInfo = InfoConnectors::addInfoConnectors($lineId);
	$connectInfoData = $connectInfo->getResult();

	$botName = $botUrl = '';
	if (!empty($connectInfoData[$connectorId]))
	{
		$botCode = $connectInfoData[$connectorId][self::CONNECTORS[$connectorId]['usernameField']];
		$botName = $connectInfoData[$connectorId][self::CONNECTORS[$connectorId]['titleField']];
		$botUrl = self::CONNECTORS[$connectorId]['urlPrefix'] . $botCode;
	}
	else
	{
		$connectorOutput = new Output($connectorId, $lineId);
		$infoConnect = $connectorOutput->infoConnect();
		if ($infoConnect->isSuccess())
		{
			$connectInfoData = $infoConnect->getData();
			$botName = $connectInfoData[self::CONNECTORS[$connectorId]['titleField']];
			$botUrl = $connectInfoData['url'];
		}
	}
	if (empty($botUrl))
	{
		$messengerUrl = Connector::getImMessengerUrl($lineId, $connectorId);
		if ($messengerUrl)
		{
			$botUrl = $messengerUrl['web'];
		}
	}

	$line = $config->get($lineId);
	$result = [
		'lineId' => $lineId,
		'lineName' => $line['LINE_NAME'],
		'userIds' => array_map('intval', $line['QUEUE'] ?? []),
		'botName' => $botName,
		'url' => $botUrl,
	];

	if (
		Loader::includeModule('ui')
		&& $withQr
		&& $result['url']
	)
	{
		$urlQR = (new Barcode())
			->option('w', self::QR_WIDTH)
			->option('h', self::QR_HEIGHT)
			->render($result['url']);

		$result['qr'] = base64_encode($urlQR);
	}

	return $result;
}