function GetLastMessage($toUserId, $fromUserId = false, $loadUserData = false, $bTimeZone = true, $limit = true)
{
global $DB;
$fromUserId = intval($fromUserId);
if ($fromUserId <= 0)
$fromUserId = $this->user_id;
$toUserId = intval($toUserId);
if ($toUserId <= 0)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_USER_ID"), "ERROR_TO_USER_ID");
return false;
}
$chatId = 0;
$startId = 0;
$lastId = 0;
$lastReadId = 0;
$limitFetchMessages = 30;
$blockNotify = false;
$lastRead = false;
$arMessages = Array();
$arUsersMessage = Array();
$arMessageId = Array();
$arUnreadMessages = Array();
$blockNotify = null;
$lastRead = null;
if (!$bTimeZone)
CTimeZone::Disable();
if ($toUserId == $fromUserId)
{
$chat = new CIMChat();
$chatId = (int)$chat->GetPersonalChat();
}
else
{
$strSql ="
SELECT R1.CHAT_ID, R1.START_ID, R1.LAST_ID, R2.LAST_ID LAST_READ_ID, R1.NOTIFY_BLOCK
FROM b_im_relation R1
INNER JOIN b_im_relation R2 on R2.CHAT_ID = R1.CHAT_ID
WHERE
R1.USER_ID = ".$fromUserId."
AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
AND R2.USER_ID = ".$toUserId."
AND R2.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
";
if (!$bTimeZone)
CTimeZone::Enable();
$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
if ($arRes = $dbRes->Fetch())
{
$chatId = intval($arRes['CHAT_ID']);
$startId = intval($arRes['START_ID']);
$readService = new BitrixImV2MessageReadService($fromUserId);
$opponentReadService = new BitrixImV2MessageReadService($toUserId);
$lastId = (int)$arRes['LAST_ID'];
//$count = $readService->getCounterService()->getByChat($chatId);
$lastIdInChat = $readService->getLastMessageIdInChat($chatId);
$messageCountFilter = BitrixMainORMQueryQuery::filter()
->where('ID', '>=', $startId)
->where('ID', '>=', $lastId)
->where('ID', '<=', $lastIdInChat)
->where('CHAT_ID', $chatId)
;
$messageCount = BitrixImModelMessageTable::getCount($messageCountFilter);
$lastReadId = (int)$arRes['LAST_READ_ID'];
$lastRead = $opponentReadService->getViewedService()->getDateViewedByMessageId($lastReadId ?? 0);
$limitFetchMessages = max($messageCount, 30);
$blockNotify = $arRes['NOTIFY_BLOCK'] !== 'N';
}
}
if ($chatId > 0)
{
if ($limit)
{
if ($DB->type == "MYSQL")
$sqlLimit = " AND M.DATE_CREATE > DATE_SUB(NOW(), INTERVAL 30 DAY)";
elseif ($DB->type == "MSSQL")
$sqlLimit = " AND M.DATE_CREATE > dateadd(day, -30, getdate())";
elseif ($DB->type == "ORACLE")
$sqlLimit = " AND M.DATE_CREATE > SYSDATE-30";
}
if (!$bTimeZone)
CTimeZone::Disable();
$strSql ="
SELECT
M.ID,
M.CHAT_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
M.NOTIFY_EVENT
FROM b_im_message M
WHERE M.CHAT_ID = ".$chatId." #LIMIT#
ORDER BY M.DATE_CREATE DESC, M.ID DESC
";
$strSql = $DB->TopSql($strSql, $limitFetchMessages);
if (!$bTimeZone)
CTimeZone::Enable();
if ($limit)
{
$dbRes = $DB->Query(str_replace("#LIMIT#", $sqlLimit, $strSql), false, "File: ".__FILE__."
Line: ".__LINE__);
}
else
{
$dbRes = $DB->Query(str_replace("#LIMIT#", "", $strSql), false, "File: ".__FILE__."
Line: ".__LINE__);
}
while ($arRes = $dbRes->Fetch())
{
if ($arRes['ID'] < $startId)
continue;
if ($fromUserId == $arRes['AUTHOR_ID'])
{
$arRes['TO_USER_ID'] = $toUserId;
$arRes['FROM_USER_ID'] = $fromUserId;
$convId = $arRes['TO_USER_ID'];
}
else
{
$arRes['TO_USER_ID'] = $fromUserId;
$arRes['FROM_USER_ID'] = $toUserId;
$convId = $arRes['FROM_USER_ID'];
}
$arMessages[$arRes['ID']] = Array(
'id' => $arRes['ID'],
'chatId' => $arRes['CHAT_ID'],
'senderId' => $arRes['FROM_USER_ID'],
'recipientId' => $arRes['TO_USER_ID'],
'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['DATE_CREATE']),
'text' => BitrixImText::parse($arRes['MESSAGE']),
'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE']),
);
$arMessageId[] = $arRes['ID'];
$arUsersMessage[$convId][] = $arRes['ID'];
if ($lastId < $arRes['ID'])
{
$arUnreadMessages[$convId][] = $arRes['ID'];
}
}
}
$params = CIMMessageParam::Get($arMessageId);
$arFiles = Array();
foreach ($params as $messageId => $param)
{
$arMessages[$messageId]['params'] = $param;
if (
mb_strlen($arMessages[$messageId]['text']) <= 0
&& !isset($param['FILE_ID'])
&& !isset($param['KEYBOARD'])
&& !isset($param['ATTACH'])
)
{
$arMessages[$messageId]['text'] = GetMessage('IM_MESSAGE_DELETED');
$arMessages[$messageId]['params']['IS_DELETED'] = 'Y';
}
if (isset($param['FILE_ID']))
{
foreach ($param['FILE_ID'] as $fileId)
{
$arFiles[$fileId] = $fileId;
}
}
}
$arChatFiles = CIMDisk::GetFiles($chatId, $arFiles);
$arMessages = CIMMessageLink::prepareShow($arMessages, $params);
$arUserChatBlockStatus = Array();
if ($blockNotify)
$arUserChatBlockStatus[$chatId][$fromUserId] = 'Y';
$arResult = Array(
'chatId' => $chatId,
'message' => $arMessages,
'usersMessage' => $arUsersMessage,
'unreadMessage' => $arUnreadMessages,
'users' => Array(),
'userInGroup' => Array(),
'files' => $arChatFiles,
'userChatBlockStatus' => $arUserChatBlockStatus
);
if ($lastRead)
{
$arResult['readedList'][$toUserId] = Array(
'messageId' => $lastReadId,
'date' => $lastRead,
);
}
if (is_array($loadUserData) || is_bool($loadUserData) && $loadUserData == true)
{
$bDepartment = true;
if (is_array($loadUserData) && $loadUserData['DEPARTMENT'] == 'N')
$bDepartment = false;
$ar = CIMContactList::GetUserData(array(
'ID' => Array($fromUserId, $toUserId),
'DEPARTMENT' => ($bDepartment? 'Y': 'N'),
'USE_CACHE' => 'N',
'SHOW_ONLINE' => 'Y',
'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
)
);
$arResult['users'] = $ar['users'];
$arResult['userInGroup'] = $ar['userInGroup'];
$arResult['phones'] = $ar['phones'];
}
return $arResult;
}