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