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