- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/classes/general/im_message.php
- Класс: CIMMessage
- Вызов: CIMMessage::GetUnreadMessage
public function GetUnreadMessage($arParams = Array())
{
global $DB;
$bSpeedCheck = isset($arParams['SPEED_CHECK']) && $arParams['SPEED_CHECK'] == 'N'? false: true;
//$lastId = !isset($arParams['LAST_ID']) || $arParams['LAST_ID'] == null? null: intval($arParams['LAST_ID']);
$loadDepartment = isset($arParams['LOAD_DEPARTMENT']) && $arParams['LOAD_DEPARTMENT'] == 'N'? false: true;
$bTimeZone = isset($arParams['USE_TIME_ZONE']) && $arParams['USE_TIME_ZONE'] == 'N'? false: true;
$bGroupByChat = isset($arParams['GROUP_BY_CHAT']) && $arParams['GROUP_BY_CHAT'] == 'Y'? true: false;
$bUserLoad = isset($arParams['USER_LOAD']) && $arParams['USER_LOAD'] == 'N'? false: true;
$bFileLoad = isset($arParams['FILE_LOAD']) && $arParams['FILE_LOAD'] == 'N'? false: true;
$arExistUserData = isset($arParams['EXIST_USER_DATA']) && is_array($arParams['EXIST_USER_DATA'])? $arParams['EXIST_USER_DATA']: Array();
$arMessages = Array();
$arUnreadMessage = Array();
$arUsersMessage = Array();
$arResult = Array(
'message' => Array(),
'unreadMessage' => Array(),
'usersMessage' => Array(),
'users' => Array(),
'files' => Array(),
'userInGroup' => Array(),
'countMessage' => 0,
'result' => false
);
$bLoadMessage = $bSpeedCheck? CIMMessenger::SpeedFileExists($this->user_id, IM_SPEED_MESSAGE): false;
$count = CIMMessenger::SpeedFileGet($this->user_id, IM_SPEED_MESSAGE);
if (!$bLoadMessage || ($bLoadMessage && intval($count) > 0))
{
/*$ssqlLastId = "R1.LAST_ID";
$ssqlStatus = " AND R1.STATUS < ".IM_STATUS_READ;
if (!is_null($lastId) && intval($lastId) > 0 && !CIMMessenger::CheckXmppStatusOnline())
{
$ssqlLastId = intval($lastId);
$ssqlStatus = "";
}
$arRelations = Array();
if ($ssqlStatus <> '')
{
$strSql ="
SELECT
R1.USER_ID,
R1.CHAT_ID,
R1.LAST_ID
FROM
b_im_relation R1
WHERE
R1.USER_ID = ".$this->user_id." AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."' ".$ssqlStatus."
";
$dbSubRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
while ($arRes = $dbSubRes->Fetch())
{
$arRelations[] = $arRes;
}
}*/
$arLastMessage = Array();
$arMark = Array();
$arMessageId = Array();
$arMessageChatId = Array();
$diskFolderId = 0;
if (!$bTimeZone)
CTimeZone::Disable();
$strSql ="
SELECT
M.ID,
M.CHAT_ID,
C.TYPE CHAT_TYPE,
C.DISK_FOLDER_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
M.NOTIFY_EVENT,
R1.USER_ID R1_USER_ID,
M.AUTHOR_ID R2_USER_ID
FROM b_im_message M
LEFT JOIN b_im_chat C ON C.ID = M.CHAT_ID
INNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID AND R1.USER_ID != M.AUTHOR_ID
INNER JOIN b_im_message_unread MU ON M.ID = MU.MESSAGE_ID AND MU.USER_ID = " . $this->user_id . "
WHERE R1.USER_ID = ".$this->user_id." AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
";
if (!$bTimeZone)
CTimeZone::Enable();
$strSql = $DB->TopSql($strSql, 500);
$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
while ($arRes = $dbRes->Fetch())
{
if ($arRes['CHAT_TYPE'] && $arRes['CHAT_TYPE'] != IM_MESSAGE_PRIVATE)
continue;
$diskFolderId = $arRes['DISK_FOLDER_ID'];
$arUsers[] = $arRes['R1_USER_ID'];
$arUsers[] = $arRes['R2_USER_ID'];
if ($this->user_id == $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'];
}
$arMessages[$arRes['ID']] = Array(
'id' => $arRes['ID'],
'chatId' => $arRes['CHAT_ID'],
'senderId' => $arRes['FROM_USER_ID'],
'recipientId' => $arRes['TO_USER_ID'],
'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['DATE_CREATE']),
'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
'text' => $arRes['MESSAGE'],
);
if ($bGroupByChat)
{
$arMessages[$arRes['ID']]['conversation'] = $convId;
$arMessages[$arRes['ID']]['unread'] = $this->user_id != $arRes['AUTHOR_ID']? 'Y': 'N';
}
else
{
$arMessages[$arRes['ID']]['conversation'] = $convId;
$arUsersMessage[$convId][] = $arRes['ID'];
}
/*if ($arRes['R1_STATUS'] == IM_STATUS_UNREAD && (!isset($arMark[$arRes["CHAT_ID"]]) || $arMark[$arRes["CHAT_ID"]] < $arRes["ID"]))
$arMark[$arRes["CHAT_ID"]] = $arRes["ID"];*/
if (!isset($arLastMessage[$convId]) || $arLastMessage[$convId] < $arRes["ID"])
$arLastMessage[$convId] = $arRes["ID"];
$arMessageId[] = $arRes['ID'];
$arMessageChatId[$arRes['CHAT_ID']][$arRes["ID"]] = $arRes["ID"];
}
$params = CIMMessageParam::Get($arMessageId);
if ($bFileLoad)
{
foreach ($arMessageChatId as $chatId => $messages)
{
$files = Array();
foreach ($messages as $messageId)
{
$arMessages[$messageId]['params'] = $params[$messageId];
if (isset($params[$messageId]['FILE_ID']))
{
foreach ($params[$messageId]['FILE_ID'] as $fileId)
{
$files[$fileId] = $fileId;
}
}
}
$arMessageFiles = CIMDisk::GetFiles($chatId, $files);
foreach ($arMessageFiles as $key => $value)
{
$arResult['files'][$chatId][$key] = $value;
}
}
}
else
{
foreach ($params as $messageId => $param)
{
$arMessages[$messageId]['params'] = $param;
}
}
if (!empty($arMessages))
{
foreach ($arMark as $chatId => $lastSendId)
self::SetLastSendId($chatId, $this->user_id, $lastSendId);
}
if ($bGroupByChat)
{
foreach ($arMessages as $key => $value)
{
$arMessages[$arLastMessage[$value['conversation']]]['counter']++;
if ($arLastMessage[$value['conversation']] != $value['id'])
{
unset($arMessages[$key]);
}
else
{
$arMessages[$key]['text'] = BitrixImText::parse($value['text']);
$arMessages[$key]['textLegacy'] = BitrixImText::parseLegacyFormat($value['text']);
$arUsersMessage[$value['conversation']][] = $value['id'];
if ($value['unread'] == 'Y')
$arUnreadMessage[$value['conversation']][] = $value['id'];
unset($arMessages[$key]['conversation']);
unset($arMessages[$key]['unread']);
}
}
}
else
{
foreach ($arMessages as $key => $value)
{
$arMessages[$key]['text'] = BitrixImText::parse($value['text']);
$arMessages[$key]['textLegacy'] = BitrixImText::parseLegacyFormat($value['text']);
if ($value['params']['NOTIFY'] === 'N' || is_array($value['params']['NOTIFY']) && !in_array($this->user_id, $value['params']['NOTIFY']))
{
// skip unread
}
else if ($this->user_id != $value['senderId'])
{
$arUnreadMessage[$value['conversation']][] = $value['id'];
}
unset($arMessages[$key]['conversation']);
}
}
$arResult['message'] = $diskFolderId;
$arResult['message'] = $arMessages;
$arResult['unreadMessage'] = $arUnreadMessage;
$arResult['usersMessage'] = $arUsersMessage;
if ($bUserLoad && !empty($arUsers))
{
$arUserData = CIMContactList::GetUserData(Array('ID' => array_diff(array_unique($arUsers), $arExistUserData), 'DEPARTMENT' => ($loadDepartment? 'Y': 'N')));
$arResult['users'] = $arUserData['users'];
$arResult['userInGroup'] = $arUserData['userInGroup'];
}
else
{
$arResult['users'] = Array();
$arResult['userInGroup'] = Array();
$arResult['userInGroup'] = Array();
}
$arResult['countMessage'] = CIMMessenger::GetMessageCounter($this->user_id, $arResult);
if (!$bGroupByChat)
CIMMessenger::SpeedFileCreate($this->user_id, $arResult['countMessage'], IM_SPEED_MESSAGE);
$arResult['result'] = true;
}
else
{
$arResult['countMessage'] = CIMMessenger::GetMessageCounter($this->user_id, $arResult);
}
return $arResult;
}