• Модуль: 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;
}