- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/lib/recent.php
- Класс: BitrixImRecent
- Вызов: Recent::pin
static function pin($dialogId, $pin, $userId = null)
{
$userId = BitrixImCommon::getUserId($userId);
if (!$userId)
{
return false;
}
$ormParams = [];
$ormParams['select'] = ["CNT" => new BitrixMainEntityExpressionField('CNT', 'COUNT(1)')];
$ormParams['filter'] = ['=USER_ID' => $userId, '=PINNED' => 'Y'];
$pinnedCount = BitrixImModelRecentTable::getRow($ormParams)['CNT'];
if ($pin && (int)$pinnedCount > self::PINNED_CHATS_LIMIT)
{
//TODO: Explain what went wrong
return false;
}
$pin = $pin === true? 'Y': 'N';
$id = $dialogId;
if (mb_substr($dialogId, 0, 4) == 'chat')
{
$itemTypes = BitrixImChat::getTypes();
$id = mb_substr($dialogId, 4);
}
else
{
$itemTypes = IM_MESSAGE_PRIVATE;
}
$element = BitrixImModelRecentTable::getList(
[
'select' => ['USER_ID', 'ITEM_TYPE', 'ITEM_ID', 'PINNED'],
'filter' => [
'=USER_ID' => $userId,
'=ITEM_TYPE' => $itemTypes,
'=ITEM_ID' => $id
]
]
)->fetch();
if (!$element)
{
return false;
// if (mb_substr($dialogId, 0, 4) == 'chat')
// {
// if (!BitrixImDialog::hasAccess($dialogId))
// {
// return false;
// }
//
// $missingChat = BitrixImModelChatTable::getRowById($id);
// $itemTypes = $missingChat['TYPE'];
// }
// $messageId = 0;
// $relationId = 0;
// if ($itemTypes !== IM_MESSAGE_OPEN)
// {
// }
$chatId = BitrixImDialog::getChatId($id);
$relationData = BitrixImModelRelationTable::getList(
[
'select' => ['ID', 'LAST_MESSAGE_ID' => 'CHAT.LAST_MESSAGE_ID'],
'filter' => [
'=CHAT_ID' => $chatId,
'=USER_ID' => $userId,
]
]
)->fetchAll()[0];
$messageId = $relationData['LAST_MESSAGE_ID'];
$relationId = $relationData['ID'];
$addResult = BitrixImModelRecentTable::add(
[
'USER_ID' => $userId,
'ITEM_TYPE' => $itemTypes,
'ITEM_ID' => $id,
'ITEM_MID' => $messageId,
'ITEM_RID' => $relationId,
'ITEM_CID' => $chatId,
'DATE_UPDATE' => new BitrixMainTypeDateTime()
]
);
if (!$addResult->isSuccess())
{
return false;
}
// self::show($id);
$element['USER_ID'] = $userId;
$element['ITEM_TYPE'] = $itemTypes;
$element['ITEM_ID'] = $id;
}
if ($element['PINNED'] == $pin)
{
return true;
}
BitrixImModelRecentTable::update(
[
'USER_ID' => $element['USER_ID'],
'ITEM_TYPE' => $element['ITEM_TYPE'],
'ITEM_ID' => $element['ITEM_ID'],
],
[
'PINNED' => $pin,
'DATE_UPDATE' => new BitrixMainTypeDateTime()
]
);
self::clearCache($element['USER_ID']);
$pullInclude = BitrixMainLoader::includeModule("pull");
if ($pullInclude)
{
BitrixPullEvent::add(
$userId,
[
'module_id' => 'im',
'command' => 'chatPin',
'expiry' => 3600,
'params' => [
'dialogId' => $dialogId,
'active' => $pin == 'Y'
],
'extra' => BitrixImCommon::getPullExtra()
]
);
}
return true;
}