• Модуль: imconnector
  • Путь к файлу: ~/bitrix/modules/imconnector/lib/interactivemessage/input.php
  • Класс: BitrixImConnectorInteractiveMessageInput
  • Вызов: Input::runCommand
protected function runCommand($params): Result
{
	$result = new Result();

	if (!Loader::includeModule('imopenlines'))
	{
		return $result->addError(new Error(
			'Failed to load the open lines module',
			'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_NOT_LOAD_MODULES_IMOPENLINES',
			__METHOD__
		));
	}

	if (
		!empty($params['COMMAND'])
		&&
		(
			$params['COMMAND'] === self::COMMAND_SESSION_NEW
			|| $params['COMMAND'] === self::COMMAND_SESSION_CLOSE
			|| $params['COMMAND'] === self::COMMAND_SESSION_CONTINUE
		)
		&& !empty($params['CHAT_ID'])
		&& !empty($params['SESSION_ID'])
		&& !empty($params['TASK_ID'])
		&& !empty($params['CONFIG_TASK_ID'])
	)
	{
		$configTask = [];

		$querySession = ImConnectorDataSession::getInstance()->query();
		$rawSession = $querySession
			->setSelect([
				'STATUS',
				'SOURCE',
				'CONFIG_ID',
				'OPERATOR_ID',
				'USER_ID',
				'CHAT_ID',
				'CLOSED'
			])
			->setFilter([
				'=ID' => $params['SESSION_ID']
			])
			->exec()
		;
		if ($sessionData = $rawSession->fetch())
		{
			if (
				$sessionData['CLOSED'] === 'Y' ||
				$sessionData['STATUS'] >= Session::STATUS_CLOSE
			)
			{
				$result->addError(new Error(
					'You can't perform actions in a closed session',
					'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_SESSION_CLOSED',
					__METHOD__,
					['command' => $params['COMMAND'], 'data' => $params]
				));
			}
			elseif ($sessionData['SOURCE'] !== $this->idConnector)
			{
				$result->addError(new Error(
					'The connector ID in the session does not match the connector ID in the request',
					'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_CONNECTORS_DIVERGE',
					__METHOD__,
					['command' => $params['COMMAND'], 'data' => $params]
				));
			}
		}
		else
		{
			$result->addError(new Error(
				'Session failed to load',
				'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_NOT_LOAD_CORRECT_DATA',
				__METHOD__,
				['command' => $params['COMMAND'], 'data' => $params]
			));
		}

		if ($result->isSuccess())
		{
			/** @var BitrixImOpenLinesConfig $configManager */
			$configManager = ServiceLocator::getInstance()->get('ImOpenLines.Config');

			$automaticMessagesThisConfig = $configManager->getAutomaticMessage($sessionData['CONFIG_ID']);

			foreach ($automaticMessagesThisConfig as $value)
			{
				if ($value['ID'] === $params['CONFIG_TASK_ID'])
				{
					$configTask = $value;
				}
			}

			if (empty($configTask))
			{
				$result->addError(new Error(
					'Failed to load automatic message task configuration',
					'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_NOT_LOAD_DATA_AUTOMATIC_MESSAGE_TASK',
					__METHOD__,
					['command' => $params['COMMAND'], 'data' => $params]
				));
			}
		}

		if ($result->isSuccess())
		{
			switch ($params['COMMAND'])
			{
				case self::COMMAND_SESSION_CLOSE:
					$resultCommand = $this->sessionClose(
						$params['CHAT_ID'],
						$sessionData['USER_ID'],
						$configTask['AUTOMATIC_TEXT_CLOSE'] ?? ''
					);
					break;

				case self::COMMAND_SESSION_CONTINUE:
					$resultCommand = $this->sessionContinue(
						$params['CHAT_ID'],
						$sessionData['USER_ID'],
						$configTask['AUTOMATIC_TEXT_CONTINUE'] ?? ''
					);
					break;

				case self::COMMAND_SESSION_NEW:
					$resultCommand = $this->sessionNew(
						$params['CHAT_ID'],
						$sessionData['USER_ID'],
						$configTask['AUTOMATIC_TEXT_NEW'] ?? ''
					);
					break;

				default:
					$resultCommand = new Result();
					$resultCommand->addError(new Error(
						'An unsupported command was passed',
						'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_COMMAND_NOT_SUPPORTED',
						__METHOD__,
						['command' => $params['COMMAND'], 'data' => $params]
					));
					break;
			}

			if ($resultCommand->isSuccess())
			{
				$result->setResult($resultCommand->getResult());
			}
			else
			{
				$result->addErrors($resultCommand->getErrors());
			}
		}
		else
		{
			$result->addError(new Error(
				'Invalid data was transmitted',
				'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_NOT_LOAD_CORRECT_DATA',
 					__METHOD__,
				['command' => $params['COMMAND'], 'data' => $params]
			));
		}
	}
	else
	{
		$result->addError(new Error(
			'Invalid data was transmitted',
			'IMCONNECTOR_INTERACTIVE_MESSAGE_ERROR_NOT_LOAD_CORRECT_DATA',
			__METHOD__,
			['command' => $params['COMMAND'], 'data' => $params]
		));
	}

	return $result;
}