• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_history.php
  • Класс: CIMHistory
  • Вызов: CIMHistory::GetMessagesByDate
public function GetMessagesByDate($chatId, $date, $messageStart = 0, $timezone = true)
{
	$chatId = intval($chatId);
	$messageStart = intval($messageStart);

	if ($date instanceof BitrixMainTypeDateTime)
	{
		$checkDate = $date;
		$dateSql = $checkDate->format("Y-m-d H:i:s");
	}
	else
	{
		$checkDate = new BitrixMainTypeDateTime($date, "Y-m-d H:i:s");
		$dateSql = $checkDate->format("Y-m-d H:i:s");
		if ($dateSql != $date)
		{
			return false;
		}
	}

	$chatData = CIMChat::GetChatData(Array('ID' => $chatId, 'USER_ID' => $this->user_id));
	if (empty($chatData['chat']))
		return false;

	$dialogId = 0;
	$chatType = IM_MESSAGE_CHAT;
	if ($chatData['chat'][$chatId]['type'] == 'private')
	{
		$chatType = IM_MESSAGE_PRIVATE;
		foreach ($chatData['userInChat'][$chatId] as $userId)
		{
			if ($userId != $this->user_id)
			{
				$dialogId = $userId;
				break;
			}
		}
		if (!$dialogId)
		{
			return false;
		}
	}
	else
	{
		$dialogId = 'chat'.$chatId;
	}

	$chatSql = str_pad($chatId, 11, '0', STR_PAD_LEFT);

	global $DB;

	if (!$timezone)
		CTimeZone::Disable();

	$sql = "
		SELECT 
			IF (M.ID > 0, 'Y', 'N') MESSAGE_EXISTS, 
			IF (M.ID > R.LAST_ID, 'N', 'Y') MESSAGE_READ,
			C.TYPE CHAT_TYPE,
			MS.MESSAGE_ID ID,
			M.CHAT_ID,
			M.MESSAGE,
			".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
			M.AUTHOR_ID
		FROM b_im_message_param MS
		LEFT JOIN b_im_message M ON M.ID = MS.MESSAGE_ID
		LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID and R.USER_ID = ".$this->user_id."
		LEFT JOIN b_im_chat C ON C.ID = M.CHAT_ID
		WHERE 
			MS.PARAM_NAME='TS' and 
			MS.PARAM_VALUE between '".$chatSql." ".$dateSql."' and '".$chatSql." 9999-99-99 99:99:99'
			".($messageStart > 0? 'MS.MESSAGE_ID >= '.$messageStart: "")."
	";

	if (!$timezone)
		CTimeZone::Enable();

	$result = $DB->Query($sql, false, "File: ".__FILE__."
Line: ".__LINE__); $arMessages = Array(); $arMessageUnread = Array(); $arMessageDelete = Array(); $arMessageId = Array(); $usersMessage = Array(); $arUsersIds = Array(); while ($message = $result->Fetch()) { if ($message['MESSAGE_EXISTS'] == 'N') { $arMessageDelete[] = $message['ID']; continue; } if ($message['MESSAGE_READ'] == 'N') { $arMessageUnread[$dialogId][] = $message['ID']; } if ($message['CHAT_TYPE'] == IM_MESSAGE_PRIVATE) { $recipientId = $message['AUTHOR_ID'] == $this->user_id? $dialogId: $this->user_id; } else { $recipientId = $message['CHAT_ID']; } $arMessages[$message['ID']] = Array( 'id' => $message['ID'], 'chatId' => $message['CHAT_ID'], 'senderId' => $message['AUTHOR_ID'], 'recipientId' => $recipientId, 'date' => BitrixMainTypeDateTime::createFromTimestamp($message['DATE_CREATE']), 'system' => $message['AUTHOR_ID'] > 0? 'N': 'Y', 'text' => BitrixImText::parse($message['MESSAGE']), 'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE']) ); $usersMessage[$dialogId][] = $message['ID']; $arMessageId[] = $message['ID']; $arUsersIds[] = $message['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, 'unreadMessage' => $arMessageUnread, 'messageDelete' => $arMessageDelete, 'files' => $arMessageFiles, 'users' => $users['users'], 'userInGroup' => $users['userInGroup'], 'phones' => $users['phones'], 'lines' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['lines'], 'chat' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['chat'], 'userInChat' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['userInChat'], 'userCallStatus' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['userCallStatus'], 'userChatBlockStatus' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['userChatBlockStatus'], ); }