- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/connector.php
- Класс: BitrixImOpenLinesConnector
- Вызов: Connector::sendMessage
public function sendMessage($params): Result
{
$result = clone $this->result;
if ($result->isSuccess())
{
Log::write($params, 'SEND MESSAGE');
$fields = [
'im' => [
'chat_id' => $params['message']['chat_id'],
'message_id' => $params['message']['id']
],
'message' => [
'user_id' => $params['message']['user_id'],
'text' => $params['message']['text'],
'files' => $params['message']['files'],
'attachments' => $params['message']['attachments'],
'params' => $params['message']['params'],
],
'chat' => [
'id' => $params['connector']['chat_id']
],
];
$actualLineId = $params['connector']['line_id'];
$allowTouchSession = empty($params['no_session']) || $params['no_session'] !== 'Y';
if ($allowTouchSession)
{
$session = new Session();
$resultLoadSession = $session->load([
'USER_CODE' => self::getUserCode($params['connector']),
'MODE' => Session::MODE_OUTPUT,
'OPERATOR_ID' => $params['message']['user_id']
]);
if (!$resultLoadSession)
{
$result->addError(new Error('Failed to load session', 'IMOPENLINES_ERROR_LOAD_SESSION', __METHOD__));
}
if (
$result->isSuccess()
&& ReplyBlock::isBlocked($session)
)
{
$result->addError(new Error('This chat is blocked for sending outgoing messages', 'IMOPENLINES_ERROR_SESSION_BLOCKED', __METHOD__));
}
if (
$result->isSuccess()
&& $session->getConfig('ACTIVE') !== 'Y'
)
{
$result->addError(new Error('The open line is deactivated', 'IMOPENLINES_ERROR_LINE_DEACTIVATED', __METHOD__));
}
if ($result->isSuccess())
{
if ($params['message']['system'] !== 'Y')
{
$updateSession = [
'DATE_MODIFY' => new DateTime,
'MESSAGE_COUNT' => true,
'DATE_LAST_MESSAGE' => new DateTime
];
if (
!$session->getData('DATE_FIRST_ANSWER')
&& !empty($session->getData('OPERATOR_ID'))
&& Queue::isRealOperator($session->getData('OPERATOR_ID'))
)
{
$currentTime = new DateTime();
$updateSession['DATE_FIRST_ANSWER'] = $currentTime;
$updateSession['TIME_FIRST_ANSWER'] = $currentTime->getTimestamp()
- $session->getData('DATE_CREATE')->getTimestamp();
}
$eventData = [
'STATUS_BEFORE' => $session->getData('STATUS'),
'CHAT_ENTITY_ID' => self::getUserCode($params['connector']),
'AUTHOR_ID' => $params['message']['user_id']
];
$session->update($updateSession);
$eventData['STATUS_AFTER'] = $session->getData('STATUS');
QueueEvent::checkFreeSlotBySendMessage($eventData);
}
$actualLineId = Queue::getActualLineId([
'LINE_ID' => $params['connector']['line_id'],
'USER_CODE' => $session->getData('USER_CODE')
]);
//Automatic messages
(new AutomaticAction($session))->automaticSendMessage($params['message']['id']);
if (
$params['message']['system'] !== 'Y'
&& !User::getInstance($session->getData('OPERATOR_ID'))->isBot()
)
{
KpiManager::setSessionLastKpiMessageAnswered($session->getData('ID'));
}
}
}
if ($result->isSuccess())
{
if (!empty($fields['message']['user_id']))
{
$fields['user'] = Queue::getUserData($actualLineId, $fields['message']['user_id']);
}
$connector = new Output($params['connector']['connector_id'], $params['connector']['line_id']);
$resultSendMessage = $connector->sendMessage([$fields]);
if (!$resultSendMessage->isSuccess())
{
$result->addErrors($resultSendMessage->getErrors());
}
}
}
return $result;
}