• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_messenger.php
  • Класс: CIMMessenger
  • Вызов: CIMMessenger::Update
static function Update($id, $text, $urlPreview = true, $editFlag = true, $userId = null, $byEvent = false, $convert = false)
{
	if (mb_strlen($text) > self::MESSAGE_LIMIT + 6)
	{
		$text = mb_substr($text, 0, self::MESSAGE_LIMIT).' (...)';
	}

	$updateFlags = Array(
		'ID' => $id,
		'TEXT' => $text,
		'URL_PREVIEW' => $urlPreview,
		'EDIT_FLAG' => $editFlag,
		'USER_ID' => $userId,
		'BY_EVENT' => $byEvent,
	);

	$text = trim(str_replace(Array('[BR]', '[br]'), "n", $text));
	if ($text == '')
	{
		return self::Delete($id, $userId, false, $byEvent);
	}

	$message =
		!$convert
			? self::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $id, $userId)
			: self::GetById((int)$id)
	;
	if (!$message)
		return false;


	$dateText = Array();
	$dateTs = Array();

	if ($urlPreview)
	{
		$results = BitrixImText::getDateConverterParams($text);
		foreach ($results as $result)
		{
			$dateText[] = $result->getText();
			$dateTs[] = $result->getDate()->getTimestamp();
		}
	}

	$arUpdate = Array('MESSAGE' => $text, 'MESSAGE_OUT' => '');
	$urlId = Array();
	$urlOnly = false;
	if ($urlPreview)
	{
		$link = new CIMMessageLink();
		$urlPrepare = $link->prepareInsert($text);
		if ($urlPrepare['RESULT'])
		{
			$arUpdate['MESSAGE_OUT'] = $text;
			$arUpdate['MESSAGE'] = $urlPrepare['MESSAGE'];
			$urlId = $urlPrepare['URL_ID'];
			if ($urlPrepare['MESSAGE_IS_LINK'])
			{
				$urlOnly = true;
			}
		}
	}

	$isOnlyEmoji = BitrixImText::isOnlyEmoji($arUpdate['MESSAGE']);
	$newParams = [
		'IS_EDITED' => $editFlag ?'Y' : 'N',
		'URL_ID' => $urlId,
		'URL_ONLY' => $urlOnly ? 'Y' : 'N',
		'LARGE_FONT' => $isOnlyEmoji ? 'Y' : 'N',
		'DATE_TEXT' => $dateText,
		'DATE_TS' => $dateTs,
	];

	$uploadResult = self::UploadFileFromText(['MESSAGE' => $arUpdate['MESSAGE'], 'CHAT_ID' => (int)$message['CHAT_ID']]);
	$arUpdate['MESSAGE'] = $uploadResult['MESSAGE'];
	$fileIds = [];
	if (!empty($uploadResult['PARAMS']['FILE_ID']))
	{
		$newParams['FILE_ID'] = array_merge($message['PARAMS']['FILE_ID'] ?? [], $uploadResult['PARAMS']['FILE_ID'] ?? []);
	}

	BitrixImModelMessageTable::update($message['ID'], $arUpdate);
	CIMMessageParam::Set($message['ID'], $newParams);

	if (!$convert)
	{
		$arFields = $message;
		$arFields['MESSAGE'] = $arUpdate['MESSAGE'];
		$arFields['DATE_MODIFY'] = new BitrixMainTypeDateTime();

		$pullMessage = BitrixImText::parse($arFields['MESSAGE']);

		$relations = CIMMessenger::GetRelationById($message['ID']);

		$arPullMessage = Array(
			'id' => (int)$arFields['ID'],
			'type' => $arFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE? 'private': 'chat',
			'text' => $pullMessage,
			'textLegacy' => BitrixImText::parseLegacyFormat($arFields['MESSAGE']),
		);
		$arBotInChat = Array();

		if ($message['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
		{
			$arFields['FROM_USER_ID'] = $arFields['AUTHOR_ID'];
			$arFields['TO_USER_ID'] = $arFields['AUTHOR_ID'];
			foreach ($relations as $rel)
			{
				if ($rel['USER_ID'] != $arFields['AUTHOR_ID'])
				{
					$arFields['TO_USER_ID'] = $rel['USER_ID'];
				}
			}

			$arPullMessage['fromUserId'] = (int)$arFields['FROM_USER_ID'];
			$arPullMessage['toUserId'] = (int)$arFields['TO_USER_ID'];
			$arPullMessage['senderId'] = (int)$arFields['FROM_USER_ID'];
			$arPullMessage['chatId'] = (int)$arFields['CHAT_ID'];
		}
		else
		{
			$arPullMessage['chatId'] = (int)$arFields['CHAT_ID'];
			$arPullMessage['senderId'] = (int)$arFields['AUTHOR_ID'];

			foreach ($relations as $relation)
			{
				if ($message['CHAT_ENTITY_TYPE'] == 'LINES')
				{
					if ($relation["EXTERNAL_AUTH_ID"] == 'imconnector')
					{
						unset($relations[$relation["USER_ID"]]);
						continue;
					}
				}
				if ($relation["EXTERNAL_AUTH_ID"] == BitrixImBot::EXTERNAL_AUTH_ID)
				{
					$arBotInChat[$relation["USER_ID"]] = $relation["USER_ID"];
					unset($relations[$relation["USER_ID"]]);
					continue;
				}
			}
		}

		$arMessages[$message['ID']] = [];

		$params = CIMMessageParam::Get([$message['ID']], false);
		$arMessages[$message['ID']]['params'] = $params[$message['ID']];

		$arDefault = CIMMessageParam::GetDefault();
		if (!isset($arMessages[$message['ID']]['params']['IS_EDITED']))
		{
			$arMessages[$message['ID']]['params']['IS_EDITED'] = $arDefault['IS_EDITED'];
		}
		if (!isset($arMessages[$message['ID']]['params']['URL_ID']))
		{
			$arMessages[$message['ID']]['params']['URL_ID'] = $arDefault['URL_ID'];
		}
		if (!isset($arMessages[$message['ID']]['params']['ATTACH']))
		{
			$arMessages[$message['ID']]['params']['ATTACH'] = $arDefault['ATTACH'];
		}
		if (!isset($arMessages[$message['ID']]['params']['DATE_TEXT']))
		{
			$arMessages[$message['ID']]['params']['DATE_TEXT'] = $arDefault['DATE_TEXT'];
		}
		if (!isset($arMessages[$message['ID']]['params']['DATE_TS']))
		{
			$arMessages[$message['ID']]['params']['DATE_TS'] = $arDefault['DATE_TS'];
		}

		$arMessages = CIMMessageLink::prepareShow($arMessages, $params);
		$arPullMessage['params'] = CIMMessenger::PrepareParamsForPull($arMessages[$message['ID']]['params']);

		if ($message['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
		{
			$arPullMessage['dialogId'] = (int)$arFields['FROM_USER_ID'];
			$arPullMessage['fromUserId'] = (int)$arFields['FROM_USER_ID'];
			$arPullMessage['toUserId'] = (int)$arFields['TO_USER_ID'];

			BitrixPullEvent::add($arPullMessage['toUserId'], [
				'module_id' => 'im',
				'command' => 'messageUpdate',
				'params' => $arPullMessage,
				'extra' => BitrixImCommon::getPullExtra()
			]);

			$arPullMessage['dialogId'] = (int)$arFields['TO_USER_ID'];
			$arPullMessage['fromUserId'] = (int)$arFields['TO_USER_ID'];
			$arPullMessage['toUserId'] = (int)$arFields['FROM_USER_ID'];

			BitrixPullEvent::add($arPullMessage['toUserId'], [
				'module_id' => 'im',
				'command' => 'messageUpdate',
				'params' => $arPullMessage,
				'extra' => BitrixImCommon::getPullExtra()
			]);
		}
		else
		{
			$arPullMessage['dialogId'] = 'chat' . $arPullMessage['chatId'];

			BitrixPullEvent::add(array_keys($relations), [
				'module_id' => 'im',
				'command' => 'messageUpdate',
				'params' => $arPullMessage,
				'extra' => BitrixImCommon::getPullExtra()
			]);
		}

		if ($message['MESSAGE_TYPE'] == IM_MESSAGE_OPEN || $message['MESSAGE_TYPE'] == IM_MESSAGE_OPEN_LINE)
		{
			CPullWatch::AddToStack('IM_PUBLIC_' . $message['CHAT_ID'], [
				'module_id' => 'im',
				'command' => 'messageUpdate',
				'params' => $arPullMessage,
				'extra' => BitrixImCommon::getPullExtra()
			]);
		}
		if ($message['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
		{
			$arFields['BOT_IN_CHAT'] = $arBotInChat;
		}

		BitrixMainApplication::getConnection()->query(
			"UPDATE b_im_recent SET DATE_UPDATE = NOW() WHERE ITEM_MID = " . intval($id)
		);

		foreach (GetModuleEvents("im", "OnAfterMessagesUpdate", true) as $arEvent)
		{
			ExecuteModuleEventEx($arEvent, [intval($id), $arFields, $updateFlags]);
		}

		BitrixImBot::onMessageUpdate(intval($id), $arFields);

		$message = (new BitrixImV2Message())
			->setMessageId((int)$id)
			->setMessage($arFields['MESSAGE'])
			->setChatId((int)$arFields['CHAT_ID'])
			->setAuthorId((int)$arFields['AUTHOR_ID'])
		;
		(new BitrixImV2LinkUrlUrlService())->updateUrlsFromMessage($message);
		(new BitrixImV2LinkFileFileService())->saveFilesFromMessage($uploadResult['FILES_FROM_TEXT'] ?? [], $message);
	}

	BitrixImModelMessageTable::indexRecord($id);

	return true;
}