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

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

		if (ToolsLock::getInstance()->set($keyLock))
		{
			$session = new Session();
			$session->setChat($this);

			$resultLoad = $session->load([
				'USER_CODE' => $this->chat['ENTITY_ID']
			]);
			if (
				$resultLoad
				&& $this->validationAction($session->getData('CHAT_ID'))
			)
			{
				$message = CIMMessenger::GetById($messageId);
				if ($message['CHAT_ID'] == $this->chat['ID'])
				{
					$user = User::getInstance($userId);
					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]',
						]),
					]);

					$configId = $session->getData('CONFIG_ID');
					$sessionId = $session->getData('SESSION_ID');
					$dateFirstLastUserAction = $session->getData('DATE_FIRST_LAST_USER_ACTION');

					$session->finish(false, true, false);

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

					$newSession->load([
						'USER_CODE' => $this->chat['ENTITY_ID'],
						'MODE' => Session::MODE_OUTPUT,
						'OPERATOR_ID' => $userId,
						'CONFIG_ID' => $configId,
						'PARENT_ID' => $sessionId,
					]);

					if ($this->chat['AUTHOR_ID'] == $userId)
					{
						$resultAnswer = true;
					}
					else
					{
						$resultAnswer = $this->answer($userId, false, true)->isSuccess();
					}
					if ($resultAnswer)
					{
						Im::addMessage([
							'TO_CHAT_ID' => $this->chat['ID'],
							'FROM_USER_ID' => $message['AUTHOR_ID'],
							'MESSAGE' => $message['MESSAGE'],
							'PARAMS' => $message['PARAMS'],
							'SKIP_CONNECTOR' => 'Y',
						]);

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

						$sessionUpdate = [
							'CHECK_DATE_CLOSE' => $dateClose,
							'DATE_FIRST_LAST_USER_ACTION' => $dateFirstLastUserAction
						];

						if ($session->getData('EXTRA_TARIFF'))
						{
							$sessionUpdate['EXTRA_TARIFF'] = $session->getData('EXTRA_TARIFF');
						}

						$newSession->update($sessionUpdate);

						$result = true;
					}
				}
			}
			ToolsLock::getInstance()->delete($keyLock);
		}
	}

	return $result;
}