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