- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
- Класс: BitrixImOpenLinesChat
- Вызов: Chat::continueSession
public function continueSession($userId, $message = ''): Result
{
$result = new Result();
if ($this->isDataLoaded())
{
$keyLock = self::PREFIX_KEY_LOCK_NEW_SESSION . $this->chat['ENTITY_ID'];
$iteration = 0;
$isAddMessage = false;
do
{
$iteration++;
if (
$iteration > Connector::LOCK_MAX_ITERATIONS
|| ToolsLock::getInstance()->set($keyLock)
)
{
$session = new Session();
$session->setChat($this);
$resultLoadSession = $session->load([
'USER_CODE' => $this->chat['ENTITY_ID'],
'SKIP_CREATE' => 'Y'
]);
if ($resultLoadSession)
{
global $USER;
if (
$userId > 0
&& !$USER->IsAuthorized()
&& User::getInstance($userId)->isConnector()
)
{
if ($USER->Authorize($userId, false, false))
{
setSessionExpired(true);
}
}
$messageId = Im::addMessage([
'TO_CHAT_ID' => $this->chat['ID'],
'MESSAGE' => $message,
'SYSTEM' => 'Y',
'IMPORTANT_CONNECTOR' => 'Y',
'NO_SESSION_OL' => 'Y',
'RECENT_ADD' => 'N',
'PARAMS' => [
'CLASS' => 'bx-messenger-content-item-ol-output',
'IMOL_FORM' => 'offline',
'TYPE' => 'lines',
'COMPONENT_ID' => 'bx-imopenlines-message',
'NOTIFY' => 'N',
],
]);
if (!empty($messageId))
{
(new AutomaticAction($session))->automaticAddMessage($messageId);
$session->update([
'DATE_FIRST_LAST_USER_ACTION' => new DateTime(),
'MESSAGE_COUNT' => true,
'DATE_LAST_MESSAGE' => new DateTime(),
'DATE_MODIFY' => new DateTime(),//this will change status!
'USER_ID' => $userId,
]);
$queueManager = Queue::initialization($session);
if ($queueManager)
{
$queueManager->automaticActionAddMessage();
}
$result->setResult(true);
}
else
{
$result->addError(new Error(
'Failed to add message',
'IMOL_INTERACTIVE_MESSAGE_ERROR_NOT_ADD_MESSAGE',
__METHOD__
));
}
}
else
{
$result->addError(new Error(
'Failed to load session',
'IMOL_INTERACTIVE_MESSAGE_ERROR_NOT_LOAD_SESSION',
__METHOD__
));
}
$isAddMessage = true;
ToolsLock::getInstance()->delete($keyLock);
}
else
{
sleep($iteration);
}
}
while ($isAddMessage === false);
}
else
{
$result->addError(new Error(
'Chat failed to load',
'NOT_LOAD_CHAT',
__METHOD__,
['chat' => $this->chat, 'userId' => $userId, 'message' => $message]
));
}
return $result;
}