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
];
}