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;
}