• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_messenger.php
  • Класс: CIMMessenger
  • Вызов: CIMMessenger::CheckPossibilityUpdateMessage
static function CheckPossibilityUpdateMessage($type, $id, $userId = null)
{
	$id = intval($id);
	if ($id <= 0)
		return false;

	$enableCheck = self::IsEnabledMessageCheck();
	if ($enableCheck)
	{
		global $USER;
		$userId = is_null($userId)? $USER->GetId(): intval($userId);
		if ($userId <= 0)
			return false;
	}

	$result = false;
	if (CModule::IncludeModule('pull') && CPullOptions::GetNginxStatus())
	{
		$message = self::GetById($id);
		$skipUserCheck = false;
		if ($message !== false)
		{
			$isMessageDeleted = $message['PARAMS']['IS_DELETED'] ?? null;
			if
			(
				$type == IM_CHECK_DELETE
				&& (
					$message['AUTHOR_ID'] == 0 && $message['CHAT_ENTITY_TYPE'] === 'LINES'
					|| !BitrixImUser::getInstance($message['AUTHOR_ID'])->isActive() && !BitrixImUser::getInstance($message['AUTHOR_ID'])->isExtranet()
					|| BitrixImUser::getInstance($message['AUTHOR_ID'])->isConnector()
					|| $message['CHAT_ID'] == CIMChat::GetGeneralChatId()
				)
				&& self::IsAdmin()
			)
			{
				$skipUserCheck = true;
			}
			else if (
				BitrixImUser::getInstance($userId)->isBot()
				&& ($message['AUTHOR_ID'] == 0 || $isMessageDeleted === 'Y')
			)
			{}
			else if (
				$isMessageDeleted === 'Y'
				|| $type != IM_CHECK_DELETE
				&& $message['DATE_CREATE'] + 259200 < time())
			{
				return false;
			}
		}
		else
		{
			return false;
		}

		if ($enableCheck)
		{
			if ($message['CHAT_ENTITY_TYPE'] == 'LINES' && CModule::IncludeModule('imopenlines'))
			{
				[$connectorType] = explode("|", $message['CHAT_ENTITY_ID']);
				if (BitrixImUser::getInstance($userId)->isBot())
				{
					if ($message['AUTHOR_ID'] != $userId)
					{
						$relation = CIMMessenger::GetRelationById($id);
						if (!isset($relation[$userId]))
						{
							return false;
						}
					}
				}
				else if ($message['AUTHOR_ID'] == $userId)
				{
					if (!($type == IM_CHECK_UPDATE && in_array($connectorType, BitrixImOpenlinesConnector::getListCanUpdateOwnMessage()))
						&& !($type == IM_CHECK_DELETE && in_array($connectorType, BitrixImOpenlinesConnector::getListCanDeleteOwnMessage())))
					{
						return false;
					}
				}
				else
				{
					if ($type == IM_CHECK_UPDATE || !$skipUserCheck && !in_array($connectorType, BitrixImOpenlinesConnector::getListCanDeleteMessage()))
					{
						return false;
					}
				}
			}
			else if (!$skipUserCheck && $message['AUTHOR_ID'] != $userId)
			{
				return false;
			}
		}

		$result = $message;
	}

	return $result;
}