• Модуль: imbot
  • Путь к файлу: ~/bitrix/modules/imbot/lib/bot/network.php
  • Класс: BitrixImBotBotNetwork
  • Вызов: Network::onMessageAdd
static function onMessageAdd($messageId, $messageFields)
{
	if (isset($messageFields['SYSTEM']) && $messageFields['SYSTEM'] === 'Y')
	{
		return false;
	}

	if (!static::checkMembershipRestriction($messageFields))
	{
		(new CIMChat($messageFields['BOT_ID']))->deleteUser($messageFields['CHAT_ID'], $messageFields['BOT_ID']);
		return false;
	}

	if (!static::checkMessageRestriction($messageFields))
	{
		return false;
	}

	self::instanceDialogSession((int)$messageFields['BOT_ID'], $messageFields['DIALOG_ID'])->start();

	// check user vote for session by direct text input '1' or '0'
	if (self::checkSessionVoteMessage($messageFields))
	{
		return true;
	}

	$files = [];
	if (isset($messageFields['FILES']) && MainLoader::includeModule('disk'))
	{
		foreach ($messageFields['FILES'] as $file)
		{
			$fileModel = BitrixDiskFile::loadById($file['id']);
			if (!$fileModel)
			{
				continue;
			}

			$file['link'] = CIMDisk::getFileLink($fileModel);
			if (!$file['link'])
			{
				continue;
			}

			$merged = false;
			if (BitrixDiskTypeFile::isImage($fileModel))
			{
				$source = $fileModel->getFile();
				if ($source)
				{
					$files[] = [
						'name' => $file['name'],
						'type' => $file['type'],
						'link' => $file['link'],
						'width' => (int)$source["WIDTH"],
						'height' => (int)$source["HEIGHT"],
						'size' => $file['size']
					];
					$merged = true;
				}
			}

			if (!$merged)
			{
				$files[] = [
					'name' => $file['name'],
					'type' => $file['type'],
					'link' => $file['link'],
					'size' => $file['size']
				];
			}
		}
	}

	$messageFields['MESSAGE'] = self::removeMentions($messageFields['MESSAGE'] ?? '');

	$messageParams = $messageFields['PARAMS'] ?? [];

	if ($relatedMessages = (new CIMHistory)->getRelatedMessages($messageId, 1, 0, false, false))
	{
		foreach ($relatedMessages['message'] as $message)
		{
			if (
				$message['system'] != 'Y'
				&& isset($message['params'][self::MESSAGE_PARAM_ALLOW_QUOTE])
				&& $message['params'][self::MESSAGE_PARAM_ALLOW_QUOTE] === 'Y'
			)
			{
				$messageFields['MESSAGE'] =
					str_repeat("-", 54)."n".
					$message['text']. "n".
					str_repeat("-", 54)."n".
					$messageFields['MESSAGE'];
				break;
			}
		}
	}

	CIMMessageParam::set($messageId, [
		self::MESSAGE_PARAM_SENDING => 'Y',
		self::MESSAGE_PARAM_SENDING_TIME => time()
	]);

	$isSuccessful = true;

	$result = self::clientMessageAdd([
		'BOT_ID' => $messageFields['BOT_ID'],
		'USER_ID' => $messageFields['FROM_USER_ID'],
		'DIALOG_ID' => $messageFields['DIALOG_ID'],
		'MESSAGE' => [
			'ID' => $messageId,
			'TYPE' => $messageFields['MESSAGE_TYPE'],
			'TEXT' => $messageFields['MESSAGE'],
		],
		'FILES' => $files,
		'PARAMS' => $messageParams,
	]);
	if (isset($result['error']))
	{
		$isSuccessful = false;
		self::$lastError = new ImBotError(__METHOD__, $result['error']['code'], $result['error']['msg']);

		$message = '';

		if (self::getError()->code == 'LINE_DISABLED')
		{
			if (class_exists('BitrixImBotBotSupport24'))
			{
				$message = ImBotBotSupport24::replacePlaceholders(
					ImBotBotSupport24::getMessage('LINE_DISABLED'),
					$messageFields['FROM_USER_ID']
				);
			}

			if (empty($message))
			{
				$message = Loc::getMessage('IMBOT_NETWORK_ERROR_LINE_DISABLED');
			}
		}
		else
		{
			$message = Loc::getMessage('IMBOT_NETWORK_ERROR_NOT_FOUND');
		}

		ImBot::addMessage(['BOT_ID' => $messageFields['BOT_ID']], [
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'MESSAGE' => $message,
			'SYSTEM' => 'Y'
		]);

		CIMMessageParam::set($messageId, [
			self::MESSAGE_PARAM_DELIVERED => 'N',
			self::MESSAGE_PARAM_SENDING => 'N',
			self::MESSAGE_PARAM_SENDING_TIME => 0
		]);
	}

	CIMMessageParam::sendPull($messageId, [
		self::MESSAGE_PARAM_DELIVERED,
		self::MESSAGE_PARAM_SENDING,
		self::MESSAGE_PARAM_SENDING_TIME
	]);

	return $isSuccessful;
}