• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
  • Класс: BitrixImOpenLinesChat
  • Вызов: Chat::restartSession
public function restartSession($userId, $message = ''): Result
{
	$result = new Result();

	if ($this->isDataLoaded())
	{
		$keyLock = self::PREFIX_KEY_LOCK_NEW_SESSION . $this->chat['ENTITY_ID'];

		if (ToolsLock::getInstance()->set($keyLock))
		{
			$user = User::getInstance($userId);

			$session = new Session();
			$session->setChat($this);

			$resultLoad = $session->load([
				'USER_CODE' => $this->chat['ENTITY_ID'],
				'SKIP_CREATE' => 'Y'
			]);
			if ($resultLoad)
			{
				if ($this->validationAction($session->getData('CHAT_ID')))
				{
					Im::addMessage([
						'TO_CHAT_ID' => $this->chat['ID'],
						'SYSTEM' => 'Y',
						'MESSAGE' => Loc::getMessage('IMOL_CHAT_CLOSE_FOR_OPEN_'.$user->getGender(), [
							'#USER#' => '[USER='.$user->getId().'][/USER]',
						]),
					]);

					$session->finish(false, true, true);
					$this->close();
				}
				else
				{
					$result->addError(new Error(Loc::getMessage('IMOL_CHAT_ERROR_NOT_LOAD_DATA'), 'IMOL_CHAT_ERROR_NOT_LOAD_DATA', __METHOD__, ['chat' => $this->chat]));
				}
			}

			if ($result->isSuccess())
			{
				if (User::getInstance($userId)->isConnector())
				{
					$mode = Session::MODE_INPUT;
				}
				else
				{
					$mode = Session::MODE_OUTPUT;
				}
				$session = new Session();
				$session->setChat($this);

				$resultCreate = $session->load([
					'USER_CODE' => $this->chat['ENTITY_ID'],
					'MODE' => $mode,
				]);

				if (
					$resultCreate &&
					$session->isNowCreated()
				)
				{
					$session->joinUser();

					$dateClose = new DateTime();
					$dateClose->add('1 MONTH');

					$sessionUpdate = [
						'CHECK_DATE_CLOSE' => $dateClose
					];

					if (User::getInstance($userId)->isConnector())
					{
						$sessionUpdate['DATE_FIRST_LAST_USER_ACTION'] = new DateTime();
					}
					$session->update($sessionUpdate);

					if (
						$mode === Session::MODE_INPUT &&
						empty($message)
					)
					{
						$message = Loc::getMessage('IMOL_CHAT_NEW_QUESTION_'.$user->getGender(), [
							'#USER#' => '[USER='.$user->getId().'][/USER]',
						]);
					}
					if (!empty($message))
					{
						Im::addMessage([
							'TO_CHAT_ID' => $this->chat['ID'],
							'MESSAGE' => $message,
							'SYSTEM' => 'Y',
							'IMPORTANT_CONNECTOR' => 'Y',
							'NO_SESSION_OL' => 'Y',
							'PARAMS' => [
								'CLASS' => 'bx-messenger-content-item-ol-output',
								'IMOL_FORM' => 'offline',
								'TYPE' => 'lines',
								'COMPONENT_ID' => 'bx-imopenlines-form-offline',
							],
						]);
					}

					$result->setResult(true);
				}
			}

			ToolsLock::getInstance()->delete($keyLock);
		}
		else
		{
			$result->addError(new Error(
				'This chat is blocked for this operation. Running a parallel competitive query.',
				'IMOL_CHAT_ERROR_NOT_START_SESSION',
				__METHOD__,
				['chat' => $this->chat]
			));
		}
	}
	else
	{
		$result->addError(new Error(
			'Chat failed to load',
			'NOT_LOAD_CHAT',
			__METHOD__,
			['chat' => $this->chat, 'userId' => $userId, 'message' => $message]
		));
	}

	return $result;
}