• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/user_group.php
  • Класс: CAllSocNetUserToGroup
  • Вызов: CAllSocNetUserToGroup::ConfirmRequestToBeMember
static function ConfirmRequestToBeMember($userId, $groupId, $relationIdList, $autoSubscribe = true): bool // request from a user confirmed by a moderator
{
	global $APPLICATION, $USER;

	$userId = (int)$userId;
	if ($userId <= 0)
	{
		$APPLICATION->ThrowException(Loc::getMessage("SONET_UR_EMPTY_USERID"), "ERROR_USERID");
		return false;
	}

	$groupId = (int)$groupId;
	if ($groupId <= 0)
	{
		$APPLICATION->ThrowException(Loc::getMessage("SONET_UR_EMPTY_GROUPID"), "ERROR_GROUPID");
		return false;
	}

	if (!is_array($relationIdList))
	{
		return true;
	}

	$arGroup = CSocNetGroup::getById($groupId);
	if (!$arGroup || !is_array($arGroup))
	{
		$APPLICATION->ThrowException(Loc::getMessage("SONET_UG_ERROR_NO_GROUP_ID"), "ERROR_NO_GROUP");
		return false;
	}

	$groupSiteIdList = array();
	$res = CSocNetGroup::GetSite($groupId);
	while ($groupSiteFields = $res->fetch())
	{
		$groupSiteIdList[] = $groupSiteFields["LID"];
	}

	$userRole = CSocNetUserToGroup::GetUserRole($userId, $groupId);
	$userIsMember = (
		$userRole
		&& in_array($userRole, UserToGroupTable::getRolesMember(), true)
	);
	$canInitiate = (
		$USER->IsAdmin()
		|| CSocNetUser::IsCurrentUserModuleAdmin($groupSiteIdList)
		|| (
			$userRole
			&& (
				(
					$arGroup["INITIATE_PERMS"] === UserToGroupTable::ROLE_OWNER
					&& $userId === (int)$arGroup["OWNER_ID"]
				)
				|| (
					$arGroup["INITIATE_PERMS"] === UserToGroupTable::ROLE_MODERATOR
					&& in_array($userRole, [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR ], true)
				)
				|| (
					$arGroup["INITIATE_PERMS"] === UserToGroupTable::ROLE_USER
					&& $userIsMember
				)
			)
		)
	);

	if (!$canInitiate)
	{
		$APPLICATION->ThrowException(Loc::getMessage("SONET_UG_ERROR_NO_PERMS"), "ERROR_NO_PERMS");
		return false;
	}

	$bSuccess = true;
	$arSuccessRelations = array();
	$chatNotificationResult = false;

	foreach ($relationIdList as $relationId)
	{
		$relationId = (int)$relationId;
		if ($relationId <= 0)
		{
			continue;
		}

		$relationFields = CSocNetUserToGroup::GetByID($relationId);
		if (!$relationFields)
		{
			continue;
		}

		if (
			(int)$relationFields["GROUP_ID"] !== $groupId
			|| $relationFields["INITIATED_BY_TYPE"] !== SONET_INITIATED_BY_USER
			|| $relationFields["ROLE"] !== UserToGroupTable::ROLE_REQUEST
		)
		{
			continue;
		}

		$arFields = array(
			"ROLE" => UserToGroupTable::ROLE_USER,
			"=DATE_UPDATE" => CDatabase::CurrentTimeFunction(),
		);
		if (CSocNetUserToGroup::Update($relationFields["ID"], $arFields))
		{
			$arSuccessRelations[] = $relationFields;

			if ($autoSubscribe)
			{
				CSocNetLogEvents::AutoSubscribe($relationFields["USER_ID"], SONET_ENTITY_GROUP, $groupId);
			}

			$chatNotificationResult = UserToGroup::addInfoToChat(array(
				'group_id' => $groupId,
				'user_id' => $relationFields["USER_ID"],
				'action' => UserToGroup::CHAT_ACTION_IN,
				'role' => $arFields['ROLE']
			));

			if (
				!$chatNotificationResult
				&& Loader::includeModule('im')
			)
			{
				$groupSiteId = CSocNetGroup::GetDefaultSiteId($groupId, $arGroup["SITE_ID"]);
				$workgroupsPage = COption::GetOptionString("socialnetwork", "workgroups_page", "/workgroups/", SITE_ID);
				$groupUrlTemplate = Path::get('group_path_template');
				$groupUrlTemplate = "#GROUPS_PATH#".mb_substr($groupUrlTemplate, mb_strlen($workgroupsPage));
				$arTmp = CSocNetLogTools::ProcessPath(
					array(
						"GROUP_URL" => str_replace(array("#group_id#", "#GROUP_ID#"), $groupId, $groupUrlTemplate)
					),
					$relationFields["USER_ID"],
					$groupSiteId
				);
				$groupUrl = $arTmp["URLS"]["GROUP_URL"];

				$serverName = (
					mb_strpos($groupUrl, "http://") === 0
					|| mb_strpos($groupUrl, "https://") === 0
						? ""
						: $arTmp["SERVER_NAME"]
				);
				$domainName = (
					mb_strpos($groupUrl, "http://") === 0
					|| mb_strpos($groupUrl, "https://") === 0
						? ""
						: (
							isset($arTmp["DOMAIN"])
							&& !empty($arTmp["DOMAIN"])
								? "//".$arTmp["DOMAIN"]
								: ""
						)
				);

				$arMessageFields = array(
					"MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
					"TO_USER_ID" => $relationFields["USER_ID"],
					"FROM_USER_ID" => $userId,
					"NOTIFY_TYPE" => IM_NOTIFY_FROM,
					"NOTIFY_MODULE" => "socialnetwork",
					"NOTIFY_EVENT" => "invite_group",
					"NOTIFY_TAG" => "SOCNET|INVITE_GROUP|" . (int)$relationFields["USER_ID"] . "|" . (int)$relationFields["ID"],
					"NOTIFY_MESSAGE" => str_replace(
						"#NAME#",
						"".$arGroup["NAME"]."",
						GetMessage("SONET_UG_CONFIRM_MEMBER_MESSAGE_G")
					),
					"NOTIFY_MESSAGE_OUT" => str_replace(
						"#NAME#",
						$arGroup["NAME"],
						GetMessage("SONET_UG_CONFIRM_MEMBER_MESSAGE_G")." (".$serverName.$groupUrl.")"
					)
				);

				CIMNotify::DeleteBySubTag("SOCNET|REQUEST_GROUP|".$relationFields["USER_ID"]."|".$relationFields["GROUP_ID"]."|".$relationFields["ID"]);
				CIMNotify::Add($arMessageFields);
			}

			if (Loader::includeModule('pull'))
			{
				BitrixPullEvent::add((int)$relationFields['USER_ID'], [
					'module_id' => 'socialnetwork',
					'command' => 'workgroup_request_accepted',
					'params' => [
						'initiatedByType' => $relationFields['INITIATED_BY_TYPE'],
					],
				]);
			}

			BitrixSocialnetworkHelperUserToGroupRequestPopup::unsetHideRequestPopup([
				'groupId' => (int)$relationFields['GROUP_ID'],
				'userId' => (int)$relationFields['USER_ID'],
			]);
		}
		else
		{
			$errorMessage = "";
			if ($e = $APPLICATION->GetException())
			{
				$errorMessage = $e->GetString();
			}

			if ($errorMessage === '')
			{
				$errorMessage = Loc::getMessage('SONET_UR_ERROR_CREATE_USER2GROUP');
			}

			$APPLICATION->ThrowException($errorMessage, "ERROR_CONFIRM_MEMBER");
			$bSuccess = false;
		}
	}

	if (
		!empty($arSuccessRelations)
		&& !$chatNotificationResult
	)
	{
		foreach ($arSuccessRelations as $arRel)
		{
			CSocNetUserToGroup::notifyImToModerators(array(
				"TYPE" => "join",
				"RELATION_ID" => $arRel["ID"],
				"USER_ID" => $arRel["USER_ID"],
				"GROUP_ID" => $arRel["GROUP_ID"],
				"GROUP_NAME" => $arRel["GROUP_NAME"],
				"EXCLUDE_USERS" => array($USER->GetID())
			));
		}
	}

	return $bSuccess;
}