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'],
);
}