function GetMoreChatMessage($pageId, $chatId, $bTimeZone = true)
{
global $DB;
$iNumPage = 1;
if (intval($pageId) > 0)
$iNumPage = intval($pageId);
$chatId = intval($chatId);
$orm = IMModelChatTable::getById($chatId);
if (!($chatData = $orm->fetch()))
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_CHAT_NOT_EXISTS"), "ERROR_CHAT_NOT_EXISTS");
return false;
}
$limitById = '';
$ar = CIMChat::GetRelationById($chatId, $this->user_id, true, false);
if ($ar && $ar['START_ID'] > 0)
{
$limitById = 'AND M.ID >= '.intval($ar['START_ID']);
}
if (!$bTimeZone)
{
CTimeZone::Disable();
}
$lineId = 0;
if (
$chatData['TYPE'] == IM_MESSAGE_OPEN_LINE
&& BitrixMainLoader::includeModule('imopenlines')
)
{
$lineId = BitrixImOpenLinesChat::parseLinesChatEntityId($chatData['ENTITY_ID'])['lineId'];
}
if ($chatData['TYPE'] == IM_MESSAGE_OPEN)
{
$strCountSql ="
SELECT COUNT(M.ID) as CNT
FROM b_im_message M
INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN."'
WHERE M.CHAT_ID = ".$chatId." ".$limitById."
";
$strResultSql ="
SELECT
M.ID,
M.CHAT_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
C.ENTITY_TYPE CHAT_ENTITY_TYPE
FROM b_im_message M
INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN."'
LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
WHERE
M.CHAT_ID = ".$chatId."
".$limitById."
ORDER BY M.DATE_CREATE DESC, M.ID DESC
";
}
elseif (
$chatData['TYPE'] == IM_MESSAGE_OPEN_LINE
&& BitrixMainLoader::includeModule('imopenlines')
&& BitrixImOpenLinesConfig::canJoin($lineId)
)
{
$strCountSql ="
SELECT COUNT(M.ID) as CNT
FROM b_im_message M
INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN_LINE."'
WHERE M.CHAT_ID = ".$chatId." ".$limitById."
";
$strResultSql ="
SELECT
M.ID,
M.CHAT_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
C.ENTITY_TYPE CHAT_ENTITY_TYPE
FROM b_im_message M
INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN_LINE."'
LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
WHERE
M.CHAT_ID = ".$chatId."
".$limitById."
ORDER BY M.DATE_CREATE DESC, M.ID DESC
";
}
else
{
$strCountSql ="
SELECT COUNT(M.ID) as CNT
FROM b_im_message M
INNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID
WHERE R1.CHAT_ID = ".$chatId." AND R1.USER_ID = ".$this->user_id." ".$limitById."
";
$strResultSql ="
SELECT
M.ID,
M.CHAT_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
C.ENTITY_TYPE CHAT_ENTITY_TYPE
FROM b_im_message M
LEFT JOIN b_im_chat C ON M.CHAT_ID = C.ID
WHERE
M.CHAT_ID = ".$chatId."
".$limitById."
ORDER BY M.DATE_CREATE DESC, M.ID DESC
";
}
if (!$bTimeZone)
CTimeZone::Enable();
$res_cnt = $DB->Query($strCountSql);
$res_cnt = $res_cnt->Fetch();
$cnt = $res_cnt["CNT"];
$arMessages = Array();
$arMessageFiles = Array();
$arMessageId = Array();
$usersMessage = Array();
if ($cnt > 0 && ceil($cnt/30) >= $iNumPage)
{
$dbRes = new CDBResult();
$dbRes->NavQuery($strResultSql, $cnt, Array('iNumPage' => $iNumPage, 'nPageSize' => 30));
while ($arRes = $dbRes->Fetch())
{
if ($arRes['CHAT_ENTITY_TYPE'] != 'LIVECHAT' && BitrixImUser::getInstance($this->user_id)->isConnector())
{
return false;
}
$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']),
'system' => $arRes['AUTHOR_ID'] > 0? 'N': 'Y',
'text' => BitrixImText::parse($arRes['MESSAGE']),
'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE'])
);
$usersMessage[$arRes['CHAT_ID']][] = $arRes['ID'];
$arMessageId[] = $arRes['ID'];
$arUsersIds[] = $arRes['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,
'message' => $arMessages,
'usersMessage' => $usersMessage,
'users' => $users['users'],
'userInGroup' => $users['userInGroup'],
'phones' => $users['phones'],
'files' => $arMessageFiles
);
}