- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/classes/general/im_notify.php
- Класс: CIMNotify
- Вызов: CIMNotify::MarkNotifyReadBySubTag
public function MarkNotifyReadBySubTag($subTagList = array())
{
global $DB;
if (empty($subTagList))
{
return false;
}
if (!is_array($subTagList))
{
$subTagList = array($subTagList);
}
$result = IMModelMessageTable::query()
->setSelect(['ID', 'CHAT_ID', 'USER_ID' => 'RELATION.USER_ID'])
->whereIn('NOTIFY_SUB_TAG', $subTagList)
->withUnreadOnly()
->exec()
;
/*$sqlTags = Array();
foreach ($subTagList as $value)
{
$value = (string)$value;
$sqlTags[] = "'".$DB->ForSQL($value)."'";
}*/
$users = array();
$chats = array();
$messages = array();
$messagesByUser = array();
$messageCollection = new IMV2MessageCollection();
while ($row = $result->fetch())
{
$messages[] = (int)$row['ID'];
$users[$row['CHAT_ID']] = $row['USER_ID'];
$chats[$row['CHAT_ID']] = $row['CHAT_ID'];
$messagesByUser[$row['CHAT_ID']][] = $row['ID'];
$message = new IMV2Message();
$message->setMessageId((int)$row['ID'])->setChatId((int)$row['CHAT_ID']);
$messageCollection->add($message);
}
if (empty($messages))
{
return true;
}
$readService = new IMV2MessageReadService();
$counters = $readService->readNotifications($messageCollection, $users)->getResult()['COUNTERS'];
$isLoadPull = Loader::includeModule("pull");
foreach ($messagesByUser as $chatId => $messagesList)
{
//BitrixImCounter::clearCache($users[$chatId]);
CIMMessenger::SpeedFileDelete($users[$chatId], IM_SPEED_NOTIFY);
if ($isLoadPull)
{
BitrixPullEvent::add($users[$chatId], Array(
'module_id' => 'im',
'command' => 'notifyRead',
'params' => Array(
'chatId' => $chatId,
'list' => array_values($messagesList),
'counter' => (int)$counters[$chatId]
),
'extra' => BitrixImCommon::getPullExtra()
));
}
}
/*$strSql ="
SELECT M.ID, M.CHAT_ID, R.USER_ID
FROM b_im_message M
LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID
WHERE
M.NOTIFY_SUB_TAG IN (".implode(",", $sqlTags).")
AND M.NOTIFY_READ='N'";
$res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
while ($message = $res->fetch())
{
$messages[$message["ID"]] = $message;
$messagesByUser[$message["CHAT_ID"]][] = $message["ID"];
$users[$message["CHAT_ID"]] = $message["USER_ID"];
$chats[$message["CHAT_ID"]] = $message["CHAT_ID"];
}
if (!empty($messages))
{
$strSql ="UPDATE b_im_message SET NOTIFY_READ = 'Y' WHERE ID IN (".implode(",", array_keys($messages)).")";
$DB->Query($strSql);
$counters = CIMNotify::GetRealCounters($chats);
foreach ($counters as $chatId => $counter)
{
$DB->Query("UPDATE b_im_relation SET COUNTER = {$counter} WHERE CHAT_ID = {$chatId}");
}
$isLoadPull = Loader::includeModule("pull");
foreach ($messagesByUser as $chatId => $messagesList)
{
BitrixImCounter::clearCache($users[$chatId]);
CIMMessenger::SpeedFileDelete($users[$chatId], IM_SPEED_NOTIFY);
if ($isLoadPull)
{
BitrixPullEvent::add($users[$chatId], Array(
'module_id' => 'im',
'command' => 'notifyRead',
'params' => Array(
'chatId' => $chatId,
'list' => array_values($messagesList),
'counter' => (int)$counters[$chatId]
),
'extra' => BitrixImCommon::getPullExtra()
));
}
}
}*/
return true;
}