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;
}