• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_messenger.php
  • Класс: CIMMessenger
  • Вызов: CIMMessenger::Delete
static function Delete($id, $userId = null, $completeDelete = false, $byEvent = false)
{
	$deleteFlags = Array(
		'ID' => $id,
		'USER_ID' => $userId,
		'COMPLETE_DELETE' => $completeDelete,
		'BY_EVENT' => $byEvent
	);

	$message = self::CheckPossibilityUpdateMessage(IM_CHECK_DELETE, $id, $userId);
	if (!$message)
		return false;

	$deleteFlags['COMPLETE_DELETE'] = $completeDelete = $message['CHAT_ID'] == CIMChat::GetGeneralChatId() && self::IsAdmin()? true: $completeDelete;

	$params = CIMMessageParam::Get($message['ID']);
	if (!empty($params['FILE_ID']))
	{
		foreach ($params['FILE_ID'] as $fileId)
		{
			CIMDisk::DeleteFile($message['CHAT_ID'], $fileId);
		}
	}

	$date = FormatDate("FULL", $message['DATE_CREATE']+CTimeZone::GetOffset());
	if (!$completeDelete)
	{
		BitrixImModelMessageTable::update($message['ID'], array(
			"MESSAGE" => GetMessage('IM_MESSAGE_DELETED'),
			"MESSAGE_OUT" => GetMessage('IM_MESSAGE_DELETED_OUT', Array('#DATE#' => $date)),
		));
		CIMMessageParam::Set($message['ID'], Array('IS_DELETED' => 'Y', 'URL_ID' => Array(), 'FILE_ID' => Array(), 'KEYBOARD' => 'N', 'ATTACH' => Array()));
	}

	$arFields = $message;
	$arFields['MESSAGE'] = GetMessage('IM_MESSAGE_DELETED_OUT', Array('#DATE#' => $date));
	$arFields['DATE_MODIFY'] = new BitrixMainTypeDateTime();

	$relations = CIMMessenger::GetRelationById($message['ID']);
	$arPullMessage = Array(
		'id' => (int)$arFields['ID'],
		'type' => $arFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE? 'private': 'chat',
		'text' => GetMessage('IM_MESSAGE_DELETED'),
		'params' => Array('IS_DELETED' => 'Y', 'URL_ID' => Array(), 'FILE_ID' => Array(), 'KEYBOARD' => 'N', 'ATTACH' => Array())
	);
	$arBotInChat = Array();
	if ($message['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
	{
		$arFields['FROM_USER_ID'] = $arFields['AUTHOR_ID'];
		$arFields['TO_USER_ID'] = $arFields['AUTHOR_ID'];
		foreach ($relations as $rel)
		{
			if ($rel['USER_ID'] != $arFields['AUTHOR_ID'])
				$arFields['TO_USER_ID'] = $rel['USER_ID'];
		}

		$arPullMessage['fromUserId'] = (int)$arFields['FROM_USER_ID'];
		$arPullMessage['toUserId'] = (int)$arFields['TO_USER_ID'];
		$arPullMessage['senderId'] = (int)$arFields['FROM_USER_ID'];
		$arPullMessage['chatId'] = (int)$arFields['CHAT_ID'];
	}
	else
	{
		$arPullMessage['chatId'] = (int)$arFields['CHAT_ID'];
		$arPullMessage['senderId'] = (int)$arFields['AUTHOR_ID'];

		foreach ($relations as $relation)
		{
			if ($message['CHAT_ENTITY_TYPE'] == 'LINES')
			{
				if ($relation["EXTERNAL_AUTH_ID"] == 'imconnector')
				{
					unset($relations[$relation["USER_ID"]]);
					continue;
				}
			}
			if ($relation["EXTERNAL_AUTH_ID"] == BitrixImBot::EXTERNAL_AUTH_ID)
			{
				$arBotInChat[$relation["USER_ID"]] = $relation["USER_ID"];
				unset($relations[$relation["USER_ID"]]);
				continue;
			}
		}
	}

	if ($message['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
	{
		$arFields['BOT_IN_CHAT'] = $arBotInChat;
	}

	BitrixImBot::onMessageDelete(intval($id), $arFields);

	if ($completeDelete)
	{
		BitrixImModelChatTable::update($message['CHAT_ID'], Array(
			'MESSAGE_COUNT' => new BitrixMainDBSqlExpression('?# - 1', 'MESSAGE_COUNT'),
		));

		if ($message['CHAT_PARENT_MID'])
		{
			$chatData = BitrixImModelChatTable::getById($message['CHAT_ID'])->fetch();
			CIMMessageParam::set($chatData['PARENT_MID'], Array(
				'CHAT_MESSAGE' => $chatData['MESSAGE_COUNT'],
				'CHAT_LAST_DATE' => new BitrixMainTypeDateTime()
			));
			CIMMessageParam::SendPull($chatData['PARENT_MID'], Array('CHAT_MESSAGE', 'CHAT_LAST_DATE'));
		}

		$messageObject = new BitrixImV2Message((int)$id);
		(new BitrixImV2LinkFavoriteFavoriteService())->unmarkMessageAsFavoriteForAll($messageObject);
		(new BitrixImV2MessageReadService())->deleteByMessageId(
			$id,
			BitrixImV2Chat::getInstance((int)$message['CHAT_ID'])->getRelations()->getUserIds()
		);
		$completeDelete = true;
		CIMMessageParam::DeleteAll($message['ID']);
		BitrixImModelMessageTable::delete($message['ID']);

		/*$relationCounters = BitrixImChat::getRelation($message['CHAT_ID'], Array(
			'SELECT' => Array('ID', 'USER_ID'),
			'REAL_COUNTERS' => 'Y',
			'USER_DATA' => 'Y',
			'SKIP_RELATION_WITH_UNMODIFIED_COUNTERS' => 'Y'
		));
		foreach ($relationCounters as $relation)
		{
			if (
				$relation['USER_DATA']["EXTERNAL_AUTH_ID"] == BitrixImBot::EXTERNAL_AUTH_ID
				|| $relation['USER_DATA']['ACTIVE'] == 'N'
			)
			{
				continue;
			}
			//BitrixImModelRelationTable::update($relation['ID'], Array('COUNTER' => $relation['COUNTER']));
			BitrixImCounter::clearCache($relation['USER_ID']);
		}*/

		$result = BitrixImModelRecentTable::getList(Array('filter' => Array('=ITEM_MID' => $message['ID'])))->fetchAll();
		if (!empty($result))
		{
			$message = BitrixImModelMessageTable::getList([
				'filter' => ['=CHAT_ID' => $message['CHAT_ID']],
				'limit' => 1,
				'order' => [
					'DATE_CREATE' => 'DESC',
					'ID' => 'DESC'
				]
			])->fetch();
			if ($message)
			{
				foreach ($result as $recent)
				{
					BitrixImModelRecentTable::update(Array(
						'USER_ID' => $recent['USER_ID'],
						'ITEM_TYPE' => $recent['ITEM_TYPE'],
						'ITEM_ID' => $recent['ITEM_ID'],
					), Array('ITEM_MID' => $message['ID']));

					if ($recent['ITEM_TYPE'] == IM_MESSAGE_PRIVATE)
						CIMMessenger::SpeedFileDelete($recent['USER_ID'], IM_SPEED_GROUP);
					else
						CIMMessenger::SpeedFileDelete($recent['USER_ID'], IM_SPEED_MESSAGE);
				}
			}
		}
	}

	if ($message['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
	{
		$arPullMessage['dialogId'] = (int)$arFields['FROM_USER_ID'];
		$arPullMessage['chatId'] = (int)$message['CHAT_ID'];
		$arPullMessage['fromUserId'] = (int)$arFields['FROM_USER_ID'];
		$arPullMessage['toUserId'] = (int)$arFields['TO_USER_ID'];

		BitrixPullEvent::add($arPullMessage['toUserId'], Array(
			'module_id' => 'im',
			'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
			'params' => $arPullMessage,
			'push' => $completeDelete? Array('badge' => 'Y'): Array(),
			'extra' => BitrixImCommon::getPullExtra()
		));

		$arPullMessage['dialogId'] = (int)$arFields['TO_USER_ID'];
		$arPullMessage['fromUserId'] = (int)$arFields['TO_USER_ID'];
		$arPullMessage['toUserId'] = (int)$arFields['FROM_USER_ID'];

		BitrixPullEvent::add($arPullMessage['toUserId'], Array(
			'module_id' => 'im',
			'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
			'params' => $arPullMessage,
			'push' => $completeDelete? Array('badge' => 'Y'): Array(),
			'extra' => BitrixImCommon::getPullExtra()
		));
	}
	else
	{
		$arPullMessage['dialogId'] = 'chat'.$arPullMessage['chatId'];
		$arPullMessage['chatId'] = (int)$message['CHAT_ID'];

		BitrixPullEvent::add(array_keys($relations), Array(
			'module_id' => 'im',
			'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
			'params' => $arPullMessage,
			'push' => $completeDelete? Array('badge' => 'Y'): Array(),
			'extra' => BitrixImCommon::getPullExtra()
		));
	}

	if ($message['MESSAGE_TYPE'] == IM_MESSAGE_OPEN || $message['MESSAGE_TYPE'] == IM_MESSAGE_OPEN_LINE)
	{
		CPullWatch::AddToStack('IM_PUBLIC_'.$message['CHAT_ID'], Array(
			'module_id' => 'im',
			'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
			'params' => $arPullMessage,
			'push' => $completeDelete? Array('badge' => 'Y'): Array(),
			'extra' => BitrixImCommon::getPullExtra()
		));
	}

	$indexEnabled = BitrixMainConfigOption::get('im', 'message_history_index');

	if ($indexEnabled)
	{
		BitrixImModelMessageIndexTable::delete($id);
	}

	$messageObject = new BitrixImV2Message(
		[
			'ID' => (int)$id,
			'CHAT_ID' => (int)$message['CHAT_ID'],
			'AUTHOR_ID' => (int)$arFields['AUTHOR_ID']
		]
	);
	(new BitrixImV2LinkUrlUrlService())->deleteUrlsByMessage($messageObject);
	(new BitrixImV2LinkPinPinService())->unpinMessage($messageObject);

	foreach(GetModuleEvents("im", "OnAfterMessagesDelete", true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array(intval($id), $arFields, $deleteFlags));

	return true;
}