• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_notify.php
  • Класс: CIMNotify
  • Вызов: CIMNotify::GetUnreadNotify
public function GetUnreadNotify($arParams = Array())
{
	global $DB;

	$order = isset($arParams['ORDER']) && $arParams['ORDER'] == 'ASC'? 'ASC': 'DESC';
	$bSpeedCheck = isset($arParams['SPEED_CHECK']) && $arParams['SPEED_CHECK'] == 'N'? false: true;
	$bTimeZone = isset($arParams['USE_TIME_ZONE']) && $arParams['USE_TIME_ZONE'] == 'N'? false: true;
	$bGetOnlyFlash = isset($arParams['GET_ONLY_FLASH']) && $arParams['GET_ONLY_FLASH'] == 'Y'? true: false;

	$arNotify['result'] = false;
	$arNotify['notify'] = Array();
	$arNotify['unreadNotify'] = Array();
	$arNotify['loadNotify'] = false;
	$arNotify['countNotify'] = 0;
	$arNotify['maxNotify'] = 0;

	$bLoadNotify = $bSpeedCheck? !CIMMessenger::SpeedFileExists($this->user_id, IM_SPEED_NOTIFY): true;
	if ($bLoadNotify)
	{
		/*$strSql =
			"SELECT
				CHAT_ID,
				STATUS
			FROM
				b_im_relation
			WHERE
				USER_ID = ".$this->user_id."
				AND MESSAGE_TYPE = '".IM_MESSAGE_SYSTEM."'
			ORDER BY ID ASC";
		$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); if ($arRes = $dbRes->Fetch()) { $chatId = intval($arRes['CHAT_ID']); $chatStatus = $arRes['STATUS']; } else return $arNotify;*/ $result = IMModelMessageUnreadTable::query() ->setSelect(['MESSAGE_ID']) ->where('USER_ID', $this->user_id) ->where('CHAT_TYPE', IM_MESSAGE_SYSTEM) //todo add index ->setLimit(100) ->fetchAll() ; $messageIds = array_column($result, 'MESSAGE_ID'); if (empty($messageIds)) { return $arNotify; } $implodeMessageIds = implode(',', $messageIds); if (!$bTimeZone) CTimeZone::Disable(); $strSql =" SELECT M.ID, M.CHAT_ID, M.MESSAGE, M.MESSAGE_OUT, ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE, M.NOTIFY_TYPE, M.NOTIFY_MODULE, M.NOTIFY_EVENT, M.NOTIFY_TITLE, M.NOTIFY_BUTTONS, M.NOTIFY_TAG, M.NOTIFY_SUB_TAG, M.NOTIFY_READ, $this->user_id TO_USER_ID, M.AUTHOR_ID FROM_USER_ID FROM b_im_message M WHERE M.ID IN ({$implodeMessageIds}) ORDER BY ID DESC "; if (!$bTimeZone) CTimeZone::Enable(); $strSql = $DB->TopSql($strSql, 100); $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); //$arMark = Array(); $arGetUsers = Array(); $arNotifyId = Array(); $arChatId = Array(); while ($arRes = $dbRes->Fetch()) { if ($this->bHideLink) $arRes['HIDE_LINK'] = 'Y'; $arNotifyId[$arRes['ID']] = $arRes['ID']; $arNotify['original_notify'][$arRes['ID']] = $arRes; $arNotify['notify'][$arRes['ID']] = $arRes; $arNotify['unreadNotify'][$arRes['ID']] = $arRes['ID']; /*if ($chatStatus == IM_STATUS_UNREAD && (!isset($arMark[$arRes["CHAT_ID"]]) || $arMark[$arRes["CHAT_ID"]] < $arRes["ID"])) $arMark[$arRes["CHAT_ID"]] = $arRes["ID"];*/ if ($arNotify['maxNotify'] < $arRes['ID']) $arNotify['maxNotify'] = $arRes['ID']; $arGetUsers[] = $arRes['FROM_USER_ID']; $arChatId[$arRes["CHAT_ID"]] = $arRes["CHAT_ID"]; } $params = CIMMessageParam::Get(array_keys($arNotifyId)); foreach ($params as $notifyId => $param) { $arNotify['notify'][$notifyId]['PARAMS'] = $param; } /*foreach ($arMark as $chatId => $lastSendId) CIMNotify::SetLastSendId($chatId, $lastSendId);*/ $arNotify['countNotify'] = $this->GetNotifyCounter($arNotify); CIMMessenger::SpeedFileCreate($this->user_id, array('counter' => $arNotify['countNotify'], 'maxId' => $arNotify['maxNotify']), IM_SPEED_NOTIFY); $arUsers = CIMContactList::GetUserData(Array('ID' => $arGetUsers, 'DEPARTMENT' => 'N', 'USE_CACHE' => 'Y', 'CACHE_TTL' => 86400)); $arGetUsers = $arUsers['users'] ?? null; $counters = self::GetCounters($arChatId); $arNotify['notify'] = $this->fillReadStatuses($arNotify['notify']); foreach ($arNotify['notify'] as $id => $value) { $value['FROM_USER_DATA'] = $arGetUsers; $value['COUNTER'] = $counters[$value['CHAT_ID']]; if (!$bTimeZone) { $dateTime = BitrixMainTypeDateTime::createFromTimestamp($value['DATE_CREATE']); $value['DATE_CREATE'] = $dateTime->toUserTime()->getTimestamp(); } $arNotify['notify'][$id] = self::GetFormatNotify($value); } $arNotify['result'] = true; } else { $cache = CIMMessenger::SpeedFileGet($this->user_id, IM_SPEED_NOTIFY); $arNotify['countNotify'] = $cache? $cache['counter']: 0; $arNotify['maxNotify'] = $cache? $cache['maxId']: 0; if ($arNotify['countNotify'] > 0) $arNotify['loadNotify'] = true; } return $arNotify; }