- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/classes/general/im_chat.php
- Класс: CIMChat
- Вызов: CIMChat::GetLastMessageLimit
function GetLastMessageLimit($chatId, $messageStartId, $messageEndId = 0, $loadExtraData = false, $bTimeZone = true, $order = 'DESC')
{
$messageStartId = intval($messageStartId);
$messageEndId = intval($messageEndId);
$chatId = intval($chatId);
if ($chatId <= 0)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_CHAT_ID"), "ERROR_TO_CHAT_ID");
return false;
}
$orm = IMModelChatTable::getById($chatId);
if (!($chatData = $orm->fetch()))
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_CHAT_NOT_EXISTS"), "ERROR_CHAT_NOT_EXISTS");
return false;
}
global $DB;
if (!$bTimeZone)
CTimeZone::Disable();
$strSql = "
SELECT
M.ID,
M.CHAT_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
C.TYPE CHAT_TYPE
FROM b_im_message M
INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
WHERE
M.CHAT_ID = ".$chatId."
AND M.ID >= ".$messageStartId."
".($messageEndId > 0? "AND M.ID <= ".$messageEndId: "")."
ORDER BY M.DATE_CREATE ".($order == 'ASC'? 'ASC': 'DESC')."
";
if (!$bTimeZone)
CTimeZone::Enable();
$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
$arMessages = Array();
$arMessageId = Array();
$arUsers = Array();
$arUsersMessage = Array();
while ($arRes = $dbRes->Fetch())
{
$arMessages[$arRes['ID']] = Array(
'id' => $arRes['ID'],
'chatId' => $arRes['CHAT_ID'],
'senderId' => $arRes['AUTHOR_ID'],
'recipientId' => $arRes['CHAT_ID'],
'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['DATE_CREATE']),
'text' => BitrixImText::parse($arRes['MESSAGE']),
'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE']),
);
$arMessageId[] = $arRes['ID'];
$arUsersMessage[$arRes['CHAT_ID']][] = $arRes['ID'];
$arUsers[$arRes['CHAT_ID']][] = $arRes['AUTHOR_ID'];
}
if ($chatData['TYPE'] == IM_MESSAGE_OPEN_LINE)
{
BitrixImDiskNoRelationPermission::add($chatId, $this->user_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;
}
}
}
$arChatFiles = CIMDisk::GetFiles($chatId, $arFiles); // TODO get files for sessions
$arMessages = CIMMessageLink::prepareShow($arMessages, $params);
$arResult = Array(
'chatId' => $chatId,
'message' => $arMessages,
'usersMessage' => $arUsersMessage,
'users' => Array(),
'userInGroup' => Array(),
'files' => $arChatFiles
);
if (is_array($loadExtraData) || is_bool($loadExtraData) && $loadExtraData == true)
{
$bDepartment = true;
if (is_array($loadExtraData) && $loadExtraData['DEPARTMENT'] == 'N')
$bDepartment = false;
$arChat = self::GetChatData(array(
'ID' => $chatId,
'USE_CACHE' => 'N'
));
$arResult['lines'] = $arChat['lines'];
$arResult['userInChat'] = $arChat['userInChat'];
$arResult['userChatBlockStatus'] = $arChat['userChatBlockStatus'];
$ar = CIMContactList::GetUserData(array(
'ID' => $arUsers[$chatId],
'DEPARTMENT' => ($bDepartment? 'Y': 'N'),
'USE_CACHE' => 'N'
)
);
$arResult['users'] = $ar['users'];
$arResult['userInGroup'] = $ar['userInGroup'];
$arResult['chat'] = $arChat['chat'];
}
return $arResult;
}