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'],
);
}