• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_message.php
  • Класс: CIMMessage
  • Вызов: CIMMessage::GetLastMessage
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; }