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