• Модуль: 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; }