• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/chat.php
  • Класс: BitrixImChat
  • Вызов: Chat::mute
static function mute($chatId, $action, $userId = null)
{
	$userId = BitrixImCommon::getUserId($userId);
	if (!$userId)
	{
		return false;
	}

	$chatId = intval($chatId);
	if (!$chatId)
	{
		return false;
	}

	$action = $action === true? 'Y': 'N';

	(new CounterService())->withContextUser($userId)->updateIsMuted($chatId, $action);

	$relation = self::getRelation($chatId, Array(
		'SELECT' => Array('ID', 'MESSAGE_TYPE', 'NOTIFY_BLOCK', 'COUNTER'),
		'FILTER' => Array(
			'USER_ID' => $userId
		),
	));
	if (!$relation)
	{
		return false;
	}

	if ($relation[$userId]['NOTIFY_BLOCK'] == $action)
	{
		return true;
	}

	BitrixImModelRelationTable::update($relation[$userId]['ID'], array('NOTIFY_BLOCK' => $action));

	Recent::clearCache($userId);
	//Counter::clearCache($userId);

	if (BitrixMainLoader::includeModule('pull'))
	{
		$element = BitrixImModelRecentTable::getList([
			'select' => ['USER_ID', 'ITEM_TYPE', 'ITEM_ID', 'UNREAD'],
			'filter' => [
				'=USER_ID' => $userId,
				'=ITEM_TYPE' => $relation[$userId]['MESSAGE_TYPE'],
				'=ITEM_ID' => $chatId
			]
		])->fetch();

		$counter = $relation[$userId]['COUNTER'];

		BitrixPullEvent::add($userId, Array(
			'module_id' => 'im',
			'command' => 'chatMuteNotify',
			'params' => Array(
				'chatId' => $chatId,
				'dialogId' => 'chat'.$chatId,
				'muted' => $action == 'Y',
				'mute' => $action == 'Y', // TODO remove this later
				'counter' => $counter,
				'lines' => $element['ITEM_TYPE'] === self::TYPE_OPEN_LINE,
				'unread' => ($element['UNREAD'] ?? 'N') === 'Y',
			),
			'extra' => BitrixImCommon::getPullExtra()
		));
	}

	$chat = BitrixImChat::getById($chatId);
	foreach(BitrixMainEventManager::getInstance()->findEventHandlers("im", "OnAfterChatMuteNotify") as $event)
	{
		ExecuteModuleEventEx($event, [[
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'MUTE' => $action == 'Y',
			'CHAT' => $chat,
		]]);
	}

	return true;
}