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