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();
$messageType = isset($arParams['MESSAGE_TYPE']) && in_array($arParams['MESSAGE_TYPE'], Array(IM_MESSAGE_OPEN, IM_MESSAGE_CHAT, IM_MESSAGE_OPEN_LINE))? $arParams['MESSAGE_TYPE']: 'ALL';
$arMessages = Array();
$arUnreadMessage = Array();
$arUsersMessage = Array();
$arResult = Array(
'message' => Array(),
'unreadMessage' => Array(),
'usersMessage' => Array(),
'users' => Array(),
'userInGroup' => Array(),
'files' => Array(),
'countMessage' => 0,
'chat' => Array(),
'userChatBlockStatus' => Array(),
'userInChat' => Array(),
'result' => false
);
$bLoadMessage = $bSpeedCheck? CIMMessenger::SpeedFileExists($this->user_id, IM_SPEED_GROUP): false;
$count = CIMMessenger::SpeedFileGet($this->user_id, IM_SPEED_GROUP);
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."
".($messageType == 'ALL'? "AND R1.MESSAGE_TYPE IN ('".IM_MESSAGE_OPEN."','".IM_MESSAGE_CHAT."','".IM_MESSAGE_OPEN_LINE."')": "AND R1.MESSAGE_TYPE = '".$messageType."'")."
".$ssqlStatus."
";
$dbSubRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
while ($arRes = $dbSubRes->Fetch())
{
//$ssqlLastId = intval($arRes['LAST_ID']);
$arRelations[] = $arRes;
}
}*/
$arMessageId = Array();
$arMessageChatId = Array();
$arLastMessage = Array();
$arMark = Array();
$arChat = Array();
$arPrepareResult = Array();
$arFilteredResult = Array();
if (!$bTimeZone)
CTimeZone::Disable();
$strSql = "
SELECT
M.ID,
M.CHAT_ID,
M.MESSAGE,
".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
M.AUTHOR_ID,
R1.MESSAGE_TYPE MESSAGE_TYPE
FROM b_im_message M
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."
".($messageType == 'ALL'? "AND R1.MESSAGE_TYPE IN ('".IM_MESSAGE_OPEN."','".IM_MESSAGE_CHAT."','".IM_MESSAGE_OPEN_LINE."')": "AND R1.MESSAGE_TYPE = '".$messageType."'")."
";
if (!$bTimeZone)
CTimeZone::Enable();
$strSql = $DB->TopSql($strSql, 1000);
$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
while ($arRes = $dbRes->Fetch())
{
$arPrepareResult[$arRes['CHAT_ID']][$arRes['ID']] = $arRes;
}
foreach ($arPrepareResult as $chatId => $arRes)
{
if (count($arPrepareResult[$chatId]) > 100)
{
$arPrepareResult[$chatId] = array_slice($arRes, -100, 100);
}
$arFilteredResult = array_merge($arFilteredResult, $arPrepareResult[$chatId]);
}
unset($arPrepareResult);
foreach ($arFilteredResult as $arRes)
{
$arUsers[] = $arRes['AUTHOR_ID'];
$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' => $arRes['MESSAGE'],
'messageType' => $arRes['MESSAGE_TYPE'],
);
if ($bGroupByChat)
{
$arMessages[$arRes['ID']]['conversation'] = $arRes['CHAT_ID'];
$arMessages[$arRes['ID']]['unread'] = $this->user_id != $arRes['AUTHOR_ID']? 'Y': 'N';
}
else
{
$arUsersMessage[$arRes['CHAT_ID']][] = $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[$arRes["CHAT_ID"]]) || $arLastMessage[$arRes["CHAT_ID"]] < $arRes["ID"])
$arLastMessage[$arRes["CHAT_ID"]] = $arRes["ID"];
$arChat[$arRes["CHAT_ID"]] = $arRes["CHAT_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)
CIMMessage::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['params']['NOTIFY'] === 'N' || is_array($value['params']['NOTIFY']) && !in_array($this->user_id, $value['params']['NOTIFY']))
{
// skip unread
}
else 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['chatId']][] = $value['id'];
}
}
}
$arResult['message'] = $arMessages;
$arResult['unreadMessage'] = $arUnreadMessage;
$arResult['usersMessage'] = $arUsersMessage;
$arChat = self::GetChatData(array(
'ID' => $arChat,
'USE_CACHE' => 'N'
));
if (!empty($arChat))
{
$arResult['lines'] = $arChat['lines'];
$arResult['chat'] = $arChat['chat'];
$arResult['userChatBlockStatus'] = $arChat['userChatBlockStatus'];
$arResult['userInChat'] = $arChat['userInChat'];
foreach ($arChat['userInChat'] as $value)
$arUsers[] = $value;
}
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_GROUP);
$arResult['result'] = true;
}
else
{
$arResult['countMessage'] = CIMMessenger::GetMessageCounter($this->user_id, $arResult);
}
return $arResult;
}