• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/subscription.php
  • Класс: CAllSocNetSubscription
  • Вызов: CAllSocNetSubscription::NotifyGroup
static function NotifyGroup($arFields): array
{
	$arUserIDSent = array();

	if (!CModule::IncludeModule("im"))
	{
		return $arUserIDSent;
	}

	if (!is_array($arFields["GROUP_ID"] ?? null))
	{
		$arFields["GROUP_ID"] = array($arFields["GROUP_ID"] ?? null);
	}

	if (empty($arFields["GROUP_ID"]))
	{
		return $arUserIDSent;
	}

	if (empty($arFields["EXCLUDE_USERS"]))
	{
		$arFields["EXCLUDE_USERS"] = array();
	}

	if (intval($arFields["LOG_ID"] ?? null) > 0)
	{
		$rsUnFollower = CSocNetLogFollow::GetList(
			array(
				"CODE" => "L".intval($arFields["LOG_ID"]),
				"TYPE" => "N"
			),
			array("USER_ID")
		);

		while ($arUnFollower = $rsUnFollower->Fetch())
		{
			$arFields["EXCLUDE_USERS"][] = $arUnFollower["USER_ID"];
		}

		$arFields["EXCLUDE_USERS"] = array_unique($arFields["EXCLUDE_USERS"], SORT_REGULAR);
	}

	$roleList = array();

	if (
		!empty($arFields['PERMISSION'])
		&& !empty($arFields['PERMISSION']['FEATURE'])
		&& !empty($arFields['PERMISSION']['OPERATION'])
	)
	{
		$roleList = CSocNetFeaturesPerms::getOperationPerm(SONET_ENTITY_GROUP, $arFields["GROUP_ID"], $arFields['PERMISSION']['FEATURE'], $arFields['PERMISSION']['OPERATION']);
	}

	$chatData = [];
	if (!empty($arFields["MESSAGE_CHAT"]))
	{
		$chatData = IntegrationImChatWorkgroup::getChatData(array(
			'group_id' => $arFields["GROUP_ID"]
		));
	}

	if (!empty($chatData))
	{
		$arFields["GROUP_ID"] = array_diff($arFields["GROUP_ID"], array_unique(array_keys($chatData)));

		$tmp = CSocNetLogTools::processPath(
			array(
				"URL" => $arFields["URL"],
			),
			(intval($arFields["FROM_USER_ID"]) > 0 ? $arFields["FROM_USER_ID"] : 1),
			SITE_ID
		);
		$chatUrl = $tmp["URLS"]["URL"];

		$chatMessageFields = array(
			"MESSAGE" => str_replace(
				array("#URL#", "#url#"),
				$chatUrl,
				$arFields["MESSAGE_CHAT"]
			),
		);

		if (intval($arFields["FROM_USER_ID"]) > 0)
		{
			$chatMessageFields["FROM_USER_ID"] = intval($arFields["FROM_USER_ID"]);
		}

		foreach($chatData as $groupId => $chatId)
		{
			// don't send message to chat if it's unavailable for all members
			if (
				isset($roleList[$groupId])
				&& $roleList[$groupId] < UserToGroupTable::ROLE_USER
			)
			{
				continue;
			}

			CIMChat::addMessage(array_merge(
				$chatMessageFields, array(
					"TO_CHAT_ID" => $chatId
				)
			));
		}
	}

	// if all groups processed by chats
	if (empty($arFields["GROUP_ID"]))
	{
		return $arUserIDSent;
	}

	$arMessageFields = array(
		"MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
		"NOTIFY_TYPE" => IM_NOTIFY_FROM,
		"NOTIFY_MODULE" => "socialnetwork",
		"NOTIFY_EVENT" => "sonet_group_event",
		"NOTIFY_TAG" => ""
	);

	if (intval($arFields["FROM_USER_ID"] ?? null) > 0)
	{
		$arMessageFields["FROM_USER_ID"] = $arFields["FROM_USER_ID"];
	}

	if (!empty($arFields["NOTIFY_TAG"]))
	{
		$arMessageFields["NOTIFY_TAG"] = $arFields["NOTIFY_TAG"];
		CIMNotify::DeleteByTag(
			$arFields["NOTIFY_TAG"],
			(intval($arFields["FROM_USER_ID"]) > 0 ? intval($arFields["FROM_USER_ID"]) : false)
		);
	}
	elseif (intval($arFields["LOG_ID"] ?? null) > 0)
	{
		$arMessageFields["NOTIFY_TAG"] = "SONET|EVENT|".intval($arFields["LOG_ID"]);
	}

	$arUserToSend = array();
	$arUserIDToSend = array();
	$arGroupID = array();
	$arCodes = array();

	foreach ($arFields["GROUP_ID"] as $group_id)
	{
		$arCodes[] = "SG".$group_id;
	}

	$rsSubscriber = CSocNetSubscription::GetList(
		array(),
		array(
			"CODE" => $arCodes
		),
		false,
		false,
		array("USER_ID", "CODE")
	);

	while($arSubscriber = $rsSubscriber->Fetch())
	{
		if (
			!in_array($arSubscriber["USER_ID"], $arFields["EXCLUDE_USERS"])
			&& !in_array($arSubscriber["USER_ID"], $arUserIDToSend)
		)
		{
			if (preg_match('/^SG(d+)$/', $arSubscriber["CODE"], $matches))
			{
				$arUserToSend[] = array(
					"USER_ID" => $arSubscriber["USER_ID"],
					"GROUP_ID" => $matches[1]
				);
				$arUserIDToSend[] = $arSubscriber["USER_ID"];
				$arGroupID[] = $matches[1];
			}
		}
	}

	$arGroups = array();

	$rsGroup = CSocNetGroup::GetList(
		array(),
		array("ID" => $arGroupID),
		false,
		false,
		array("ID", "NAME", "OWNER_ID")
	);

	while($arGroup = $rsGroup->GetNext())
	{
		if (!empty($arGroup['NAME']))
		{
			$arGroup['NAME'] = Emoji::decode($arGroup['NAME']);
		}
		$arGroups[$arGroup["ID"]] = $arGroup;
	}

	$workgroupsPage = COption::GetOptionString("socialnetwork", "workgroups_page", "/workgroups/", SITE_ID);
	$groupUrlTemplate = BitrixSocialnetworkHelperPath::get('group_path_template');
	$groupUrlTemplate = "#GROUPS_PATH#".mb_substr($groupUrlTemplate, mb_strlen($workgroupsPage), mb_strlen($groupUrlTemplate) - mb_strlen($workgroupsPage));

	$canViewUserIdList = array();

	foreach($arUserToSend as $arUser)
	{
		$groupId = $arUser['GROUP_ID'];

		if (isset($roleList[$groupId]))
		{
			if (!isset($canViewUserIdList[$groupId]))
			{
				$canViewUserIdList[$groupId] = array();
				$res = UserToGroupTable::getList(array(
					'filter' => array(
						'=GROUP_ID' => $groupId,
						'<=ROLE' => $roleList[$groupId]
					),
					'select' => array('USER_ID')
				));
				while($relation = $res->fetch())
				{
					$canViewUserIdList[$groupId][] = $relation['USER_ID'];
				}
			}

			if (!in_array($arUser["USER_ID"], $canViewUserIdList[$groupId]))
			{
				continue;
			}
		}

		$arMessageFields["TO_USER_ID"] = $arUser["USER_ID"];
		if (intval($arFields["LOG_ID"] ?? null) > 0)
		{
			$arMessageFields["NOTIFY_SUB_TAG"] = "SONET|EVENT|".intval($arFields["LOG_ID"])."|".intval($arUser["USER_ID"]);
		}

		$arTmp = CSocNetLogTools::ProcessPath(
			array(
				"URL" => $arFields["URL"] ?? null,
				"GROUP_URL" => str_replace(array("#group_id#", "#GROUP_ID#"), $arUser["GROUP_ID"], $groupUrlTemplate)
			),
			$arUser["USER_ID"],
			SITE_ID
		);
		$url = $arTmp["URLS"]["URL"];

		$serverName = (
		mb_strpos($url, "http://") === 0
			|| mb_strpos($url, "https://") === 0
				? ""
				: $arTmp["SERVER_NAME"]
		);

		$groupUrl = $serverName.$arTmp["URLS"]["GROUP_URL"];

		$group_name = (array_key_exists($arUser["GROUP_ID"], $arGroups) ? $arGroups[$arUser["GROUP_ID"]]["NAME"] : "");
		$arMessageFields["NOTIFY_MESSAGE"] = str_replace(
			array("#URL#", "#url#", "#group_name#", "#GROUP_ID#", "#group_id#"),
			array($url, $url, "".$group_name."", $arUser["GROUP_ID"], $arUser["GROUP_ID"]),
			$arFields["MESSAGE"] ?? ''
		);
		$arMessageFields["NOTIFY_MESSAGE_OUT"] = str_replace(
			array("#URL#", "#url#", "#group_name#"),
			array($serverName.$url, $serverName.$url, $group_name),
			$arFields["MESSAGE_OUT"] ?? ''
		);

		$arMessageFields["PUSH_PARAMS"] = array(
			"ACTION" => "sonet_group_event",
			"TAG" => $arMessageFields["NOTIFY_TAG"]
		);

		if (intval($arFields["FROM_USER_ID"] ?? null) > 0)
		{
			$dbAuthor = CUser::getByID($arFields["FROM_USER_ID"]);
			if($arAuthor = $dbAuthor->fetch())
			{
				if (!empty($arAuthor["PERSONAL_PHOTO"]))
				{
					$imageResized = CFile::resizeImageGet(
						$arAuthor["PERSONAL_PHOTO"],
						array(
							"width" => 100,
							"height" => 100
						),
						BX_RESIZE_IMAGE_EXACT
					);
					if ($imageResized)
					{
						$authorAvatarUrl = BitrixImCommon::getPublicDomain().$imageResized["src"];
					}
				}

				$authorName = CUser::formatName(CSite::getNameFormat(), $arAuthor, true);
			}
		}

		if (empty($authorName))
		{
			$authorName = Loc::getMessage("SONET_SS_PUSH_USER");
		}

		$arMessageFields["PUSH_PARAMS"]["ADVANCED_PARAMS"] = array(
			'senderName' => $authorName
		);

		if (!empty($authorAvatarUrl))
		{
			$arMessageFields["PUSH_PARAMS"]["ADVANCED_PARAMS"]["avatarUrl"] = $authorAvatarUrl;
		}

		$arMessageFields["PUSH_MESSAGE"] = str_replace(
			array("[URL=#URL#]", "[URL=#url#]", "[/URL]", "#group_name#", "#GROUP_ID#", "#group_id#"),
			array('', '', '', $group_name, $arUser["GROUP_ID"], $arUser["GROUP_ID"]),
			$arFields["MESSAGE"] ?? ''
		);

		$arMessageFields2Send = $arMessageFields;
		if (
			!is_set($arMessageFields2Send["FROM_USER_ID"])
			|| intval($arMessageFields2Send["FROM_USER_ID"]) <= 0
		)
		{
			$arMessageFields2Send["NOTIFY_TYPE"] = IM_NOTIFY_SYSTEM;
			$arMessageFields2Send["FROM_USER_ID"] = 0;
		}

		CIMNotify::Add($arMessageFields2Send);

		$arUserIDSent[] = $arUser["USER_ID"];
	}

	return $arUserIDSent;
}