• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_history.php
  • Класс: CIMHistory
  • Вызов: CIMHistory::GetRelatedMessages
public function GetRelatedMessages($messageId, $previous = 10, $next = 10, $timezone = true, $textParser = true)
{
	$message = BitrixImModelMessageTable::getList(Array(
		'select' => Array(
			'ID','DATE_CREATE', 'CHAT_ID', 'AUTHOR_ID',
			'CHAT_TYPE' => 'CHAT.TYPE',
			'CHAT_ENTITY_TYPE' => 'CHAT.ENTITY_TYPE',
			'CHAT_ENTITY_ID' => 'CHAT.ENTITY_ID',
			'CHAT_ENTITY_DATA_1' => 'CHAT.ENTITY_DATA_1',
		),
		'filter' => Array(
			'=ID' => $messageId
		))
	)->fetch();
	if (!$message)
	{
		return false;
	}

	$relations = CIMChat::GetRelationById($message['CHAT_ID'], false, true, false);
	if (!isset($relations[$this->user_id]))
	{
		if (
			$message['CHAT_ENTITY_TYPE'] == 'LINES'
			&& BitrixMainLoader::includeModule('imopenlines')
		)
		{
			$explodeData = explode('|', $message['CHAT_ENTITY_DATA_1']);
			$crmEntityType = ($explodeData[0] == 'Y') ? $explodeData[1] : null;
			$crmEntityId = ($explodeData[0] == 'Y') ? intval($explodeData[2]) : null;

			$lineId = BitrixImOpenLinesChat::parseLinesChatEntityId($message['CHAT_ENTITY_ID'])['lineId'];

			if (!BitrixImOpenLinesConfig::canJoin($lineId, $crmEntityType, $crmEntityId))
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}
	elseif ((int)$messageId < (int)$relations[$this->user_id]['START_ID'])
	{
		return false;
	}

	$dialogId = 0;
	if ($message['CHAT_TYPE'] == IM_MESSAGE_PRIVATE)
	{
		if($message['CHAT_ENTITY_TYPE'] == IM_CHAT_TYPE_PERSONAL)
		{
			$dialogId = $this->user_id;
		}
		if ($message['AUTHOR_ID'] != $this->user_id)
		{
			$dialogId = $message['AUTHOR_ID'];
		}
		else
		{
			foreach ($relations as $userId => $data)
			{
				if ($userId != $this->user_id)
				{
					$dialogId = $userId;
					break;
				}
			}
			if (!$dialogId)
			{
				return false;
			}
		}
	}
	else
	{
		$dialogId = 'chat'.$message['CHAT_ID'];
	}

	$previousMessages = $this->GetPreviousMessages($messageId, $message['CHAT_ID'], $message['DATE_CREATE'], $previous, $timezone);
	$nextMessages = $this->GetNextMessages($messageId, $message['CHAT_ID'], $message['DATE_CREATE'], $next, $timezone);

	$startId = (int)($relations[$this->user_id]['START_ID'] ?? 0);
	if ($startId > 0)
	{
		$previousMessages = array_filter($previousMessages, static fn (array $message) => (int)$message['ID'] >= $startId);
	}

	$messages = array_replace($previousMessages, $nextMessages);

	$chatId = $message['CHAT_ID'];

	$arMessages = Array();
	$arMessageFiles = Array();
	$arMessageId = Array();
	$usersMessage = Array();
	$arUsersIds = Array();

	foreach ($messages as $mess)
	{
		if ($message['CHAT_TYPE'] == IM_MESSAGE_PRIVATE)
		{
			$recipientId = $mess['AUTHOR_ID'] == $this->user_id? $dialogId: $this->user_id;
		}
		else
		{
			$recipientId = $mess['CHAT_ID'];
		}
		$arMessages[$mess['ID']] = Array(
			'id' => $mess['ID'],
			'chatId' => $mess['CHAT_ID'],
			'senderId' => $mess['AUTHOR_ID'],
			'recipientId' => $recipientId,
			'date' => BitrixMainTypeDateTime::createFromTimestamp($mess['DATE_CREATE']),
			'system' => $mess['AUTHOR_ID'] > 0? 'N': 'Y',
			'text' => $textParser? BitrixImText::parse($mess['MESSAGE']): $mess['MESSAGE'],
			'textLegacy' => $textParser? BitrixImText::parseLegacyFormat($mess['MESSAGE']): $mess['MESSAGE']
		);

		$usersMessage[$dialogId][] = $mess['ID'];
		$arMessageId[] = $mess['ID'];
		$arUsersIds[] = $mess['AUTHOR_ID'];
	}

	$params = CIMMessageParam::Get($arMessageId);
	$arFiles = Array();
	foreach ($params as $messageId => $param)
	{
		$arMessages[$messageId]['params'] = $param;
		if (isset($param['FILE_ID']))
		{
			foreach ($param['FILE_ID'] as $fileId)
			{
				$arFiles[$fileId] = $fileId;
			}
		}
	}
	$arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
	$arMessages = CIMMessageLink::prepareShow($arMessages, $params);

	$users = CIMContactList::GetUserData(array(
											 'ID' => $arUsersIds,
											 'DEPARTMENT' => 'Y',
											 'USE_CACHE' => 'N',
											 'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
										 ));

	return Array(
		'chatId' => $chatId,
		'dialogId' => $dialogId,
		'message' => $arMessages,
		'usersMessage' => $usersMessage,
		'files' => $arMessageFiles,
		'users' => $users['users'],
		'userInGroup' => $users['userInGroup'],
		'phones' => $users['phones'],
	);
}