• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_message.php
  • Класс: CIMMessage
  • Вызов: CIMMessage::GetLastSendMessage
function GetLastSendMessage($arParams)
{
	global $DB;

	if (!isset($arParams['TO_USER_ID']))
		return false;

	$toUserId = $arParams['TO_USER_ID'];
	$fromUserId = isset($arParams['FROM_USER_ID']) && intval($arParams['FROM_USER_ID'])>0? intval($arParams['FROM_USER_ID']): $this->user_id;
	$limit = isset($arParams['LIMIT']) && intval($arParams['LIMIT'])>0? intval($arParams['LIMIT']): false;
	$order = isset($arParams['ORDER']) && $arParams['ORDER'] == 'ASC'? 'ASC': 'DESC';
	$bTimeZone = isset($arParams['USE_TIME_ZONE']) && $arParams['USE_TIME_ZONE'] == 'N'? false: true;

	$arToUserId = Array();
	if (is_array($toUserId))
	{
		foreach ($toUserId as $userId)
			$arToUserId[] = intval($userId);
	}
	else
	{
		$arToUserId[] = intval($toUserId);
	}
	if (empty($arToUserId))
		return Array();

	$sqlLimit = '';
	if ($limit)
	{
		if ($DB->type == "MYSQL")
			$sqlLimit = " AND M.DATE_CREATE > DATE_SUB(NOW(), INTERVAL ".$limit." DAY)";
		elseif ($DB->type == "MSSQL")
			$sqlLimit = " AND M.DATE_CREATE > dateadd(day, -".$limit.", getdate())";
		elseif ($DB->type == "ORACLE")
			$sqlLimit = " AND M.DATE_CREATE > SYSDATE-".$limit;
	}

	if (!$bTimeZone)
		CTimeZone::Disable();
	$strSql = "
		SELECT
			M.ID,
			M.CHAT_ID,
			M.MESSAGE,
			".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
			M.AUTHOR_ID,
			R1.USER_ID R1_USER_ID,
			R2.USER_ID R2_USER_ID
		FROM b_im_relation R1
		INNER JOIN b_im_relation R2 on R2.CHAT_ID = R1.CHAT_ID
		INNER JOIN b_im_message M ON M.ID >= R1.START_ID
						AND M.ID >= R1.LAST_ID
						AND M.ID >= R2.LAST_ID
						AND M.CHAT_ID = R1.CHAT_ID
						".$sqlLimit."
		WHERE
			R1.USER_ID = ".$fromUserId."
		AND R2.USER_ID IN (".implode(",",$arToUserId).")
		AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
		".($order == 'DESC'? "ORDER BY M.DATE_CREATE DESC, M.ID DESC": "");
	if (!$bTimeZone)
		CTimeZone::Enable();

	$arMessages = Array();
	$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); while ($arRes = $dbRes->Fetch()) { if ($fromUserId == $arRes['AUTHOR_ID']) { $arRes['TO_USER_ID'] = $arRes['R2_USER_ID']; $arRes['FROM_USER_ID'] = $arRes['R1_USER_ID']; $convId = $arRes['TO_USER_ID']; } else { $arRes['TO_USER_ID'] = $arRes['R1_USER_ID']; $arRes['FROM_USER_ID'] = $arRes['R2_USER_ID']; $convId = $arRes['FROM_USER_ID']; } if (!isset($arMessages[$convId]) || (isset($arMessages[$convId]) && $arMessages[$convId]['date'] < $arRes['DATE_CREATE'])) { $arMessages[$convId] = Array( 'id' => $arRes['ID'], 'senderId' => $arRes['FROM_USER_ID'], 'recipientId' => $arRes['TO_USER_ID'], 'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['DATE_CREATE']), 'text' => $arRes['MESSAGE'] ); } } foreach ($arMessages as $key => $value) { $value['text'] = BitrixImText::parse($value['text']); $arMessages[$key] = $value; } return $arMessages; }