• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/widget/dialog.php
  • Класс: BitrixImopenlinesWidgetDialog
  • Вызов: Dialog::get
static function get($userId, $configId, int $chatId = 0)
{
	$userId = intval($userId);
	$configId = intval($configId);

	self::clearError();

	if (!BitrixMainLoader::includeModule('im'))
	{
		self::setError(__METHOD__, 'IM_NOT_FOUND', Loc::getMessage('IMOL_WIDGET_CONFIG_IM_NOT_FOUND'));
		return false;
	}

	$config = BitrixImopenlinesModelConfigTable::getById($configId)->fetch();
	if (!$config)
	{
		self::setError(__METHOD__, 'CONFIG_ERROR', Loc::getMessage('IMOL_WIDGET_CHAT_ERROR_CONFIG_NOT_FOUND'));
		return false;
	}

	$filterParams = [
		'=ENTITY_TYPE' => 'LIVECHAT',
		'=ENTITY_ID' => $configId . '|' . $userId
	];
	if ($chatId > 0)
	{
		$filterParams['ID'] = $chatId;
	}

	$chat = BitrixImModelChatTable::getList([
		'select' => ['ID', 'DISK_FOLDER_ID', 'ENTITY_DATA_1', 'ENTITY_DATA_2', 'ENTITY_DATA_3'],
		'filter' => $filterParams,
		'order' => ['ID' => 'DESC'],
		'limit' => 1
	])->fetch();
	if (!$chat)
	{
		self::setError(__METHOD__, 'CHAT_ERROR', Loc::getMessage('IMOL_WIDGET_CHAT_NOT_FOUND'), []);
		return false;
	}

	$chatId = $chat['ID'];
	$diskFolderId = $chat['DISK_FOLDER_ID'];
	$sessionId = 0;
	$sessionClosed = true;
	$sessionStatus = Session::ACTION_NONE;
	$userVote = self::VOTE_NONE;
	$dateCloseVote = '';

	$operator = [
		'ID' => 0,
		'NAME' => '',
		'FIRST_NAME' => '',
		'LAST_NAME' => '',
		'WORK_POSITION' => '',
		'GENDER' => 'F',
		'AVATAR' => '',
		'AVATAR_ID' => 0,
		'ONLINE' => false
	];

	$operatorChatId = 0;

	$userCodeSession = 'livechat|'.$configId.'|'.$chatId.'|'.$userId;

	$sessionData =BitrixImopenlinesModelSessionTable::getList([
		'select' => [
			'ID',
			'CLOSED',
			'VOTE',
			'DATE_CLOSE_VOTE',
			'STATUS',
			'OPERATOR_CHAT_ID' => 'CHAT_ID',
			'CHAT_OPERATOR_ID' => 'CHAT.AUTHOR_ID',
			'OPERATOR_AVATAR' => 'CHAT.AUTHOR.PERSONAL_PHOTO',
			'OPERATOR_ONLINE' => 'CHAT.AUTHOR.IS_ONLINE'
		],
		'filter' => [
			'=USER_CODE' => $userCodeSession
		],
		'order' => ['ID' => 'DESC'],
		'limit' => 1
	])->fetch();

	if ($sessionData)
	{
		$sessionId = $sessionData['ID'];
		$sessionStatus = (int)$sessionData['STATUS'];

		$sessionData['VOTE'] = (int)$sessionData['VOTE'];

		if ($sessionData['VOTE'] === BitrixImopenlinesSession::VOTE_LIKE)
		{
			$userVote = self::VOTE_LIKE;
		}
		else if ($sessionData['VOTE'] === BitrixImopenlinesSession::VOTE_DISLIKE)
		{
			$userVote = self::VOTE_DISLIKE;
		}

		if(
			!empty($sessionData['DATE_CLOSE_VOTE']) &&
			$sessionData['DATE_CLOSE_VOTE'] instanceof DateTime
		)
		{
			$dateCloseVote = date('c', $sessionData['DATE_CLOSE_VOTE']->getTimestamp());
		}

		$sessionClosed = $sessionData['CLOSED'] == 'Y';

		if ($sessionData['CHAT_OPERATOR_ID'])
		{
			$actualLineId = BitrixImOpenLinesQueue::getActualLineId([
				'LINE_ID' =>  $configId,
				'USER_CODE' => $userCodeSession
			]);
			$operator = BitrixImOpenLinesQueue::getUserData($actualLineId, $sessionData['CHAT_OPERATOR_ID']);
		}

		$operatorChatId = (int)$sessionData['OPERATOR_CHAT_ID'];
	}

	$userConsent = false;
	if ($config['AGREEMENT_MESSAGE'] == 'Y')
	{
		$userConsent = Consent::getByContext((int)$config['AGREEMENT_ID'], 'imopenlines/livechat', $chatId);
	}

	return [
		'DIALOG_ID' => 'chat'.$chatId,
		'CHAT_ID' => (int)$chatId,
		'DISK_FOLDER_ID' => (int)$diskFolderId,
		'SESSION_ID' => (int)$sessionId,
		'SESSION_CLOSE' => $sessionClosed,
		'SESSION_STATUS' => $sessionStatus,
		'USER_VOTE' => $userVote,
		'DATE_CLOSE_VOTE' => $dateCloseVote,
		'USER_CONSENT' => (bool)$userConsent,
		'OPERATOR' => $operator,
		'OPERATOR_CHAT_ID' => $operatorChatId
	];
}