static function send($params): bool
{
if (
!Loader::includeModule('intranet')
|| !Loader::includeModule('pull')
)
{
return false;
}
if (
empty($params['ENTITY_TYPE'])
|| $params['ENTITY_TYPE'] !== 'POST'
|| empty($params['ENTITY_ID'])
|| empty($params['AUTHOR_ID'])
|| empty($params['URL'])
|| empty($params['SOCNET_RIGHTS'])
|| !is_array($params['SOCNET_RIGHTS'])
)
{
return false;
}
if (empty($params['SITE_ID']))
{
$params['SITE_ID'] = SITE_ID;
}
$res = MainUserTable::getList([
'filter' => [
'=ID' => (int)$params['AUTHOR_ID'],
],
'select' => [ 'ID', 'PERSONAL_GENDER', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'LOGIN' ],
]);
if ($author = $res->fetch())
{
$author['NAME_FORMATTED'] = CUser::formatName(CSite::getNameFormat(null, $params['SITE_ID']), $author, true);
switch($author['PERSONAL_GENDER'])
{
case 'M':
$authorSuffix = '_M';
break;
case 'F':
$authorSuffix = '_F';
break;
default:
$authorSuffix = '';
}
}
else
{
return false;
}
$params['SOCNET_RIGHTS'] = array_map(static function ($right) {
return ($right === 'G2' ? 'UA' : $right);
}, $params['SOCNET_RIGHTS']);
if (
!empty($params['SOCNET_RIGHTS_OLD'])
&& is_array($params['SOCNET_RIGHTS_OLD'])
)
{
$rightsOld = [];
foreach ($params['SOCNET_RIGHTS_OLD'] as $entities)
{
foreach ($entities as $rightsList)
{
foreach ($rightsList as $right)
{
$rightsOld[] = ($right === 'G2' ? 'UA' : $right);
}
}
}
$params['SOCNET_RIGHTS'] = array_diff($params['SOCNET_RIGHTS'], $rightsOld);
}
$found = false;
$userListParams = [
'SKIP' => (int)$params['AUTHOR_ID'],
'DEPARTMENTS' => [],
];
foreach ($params['SOCNET_RIGHTS'] as $right)
{
if (
$right === 'UA'
|| $right === 'G2'
)
{
$userListParams['SITE_ID'] = $params['SITE_ID'];
$found = true;
}
elseif (preg_match('/^DR(d+)$/', $right, $matches))
{
$userListParams['DEPARTMENTS'][] = $matches[1];
$found = true;
}
}
if ($found)
{
$userList = BitrixIntranetUtil::getEmployeesList($userListParams);
}
if (empty($userList))
{
return false;
}
if (
$params['ENTITY_TYPE'] === 'POST'
&& ($post = CBlogPost::getById($params['ENTITY_ID']))
&& !empty($post['PUBLISH_STATUS'])
&& ($post['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_PUBLISH)
)
{
$titleTmp = str_replace([ "rn", "n" ], ' ', $post['TITLE']);
$title = truncateText($titleTmp, 100);
$titleEmail = ($post['MICRO'] !== 'Y' ? truncateText($titleTmp, 255) : '');
$titleEmpty = (trim($title, " tnr x0BxA0" ) === '');
$message = Loc::getMessage(
'BLOG_BROADCAST_PUSH_POST' . ($titleEmpty ? 'A' : '') . $authorSuffix,
[
'#author#' => $author['NAME_FORMATTED'],
'#title#' => $title,
]
);
$userIdList = array_keys($userList);
if (
!empty($params['EXCLUDE_USERS'])
&& is_array($params['EXCLUDE_USERS'])
)
{
$userIdList = array_diff($userIdList, $params['EXCLUDE_USERS']);
}
if (!empty($userIdList))
{
$userIdListPush = self::filterRecipients($userIdList, CIMSettings::CLIENT_PUSH);
BitrixPullPush::add($userIdListPush, [
'module_id' => 'blog',
'push' => [
'message' => $message,
'params' => [
'ACTION' => 'post',
'TAG' => 'BLOG|POST|' . $params['ENTITY_ID']
],
'tag' => 'BLOG|POST|' . $params['ENTITY_ID'],
'send_immediately' => 'Y',
]
]);
$offlineUserIdList = [];
$mailRecipients = self::filterRecipients($userIdList, CIMSettings::CLIENT_MAIL);
$deviceInfo = CPushManager::getDeviceInfo($mailRecipients);
if (is_array($deviceInfo))
{
foreach ($deviceInfo as $userId => $info)
{
if (in_array(
$info['mode'],
[
CPushManager::SEND_DEFERRED,
CPushManager::RECORD_NOT_FOUND,
],
true
))
{
$offlineUserIdList[] = $userId;
}
}
}
if (!empty($offlineUserIdList))
{
$res = MainUserTable::getList([
'filter' => [
'=SEND_EMAIL' => 'Y',
'@ID' => $offlineUserIdList,
],
'runtime' => [
new MainEntityExpressionField('SEND_EMAIL', 'CASE WHEN LAST_ACTIVITY_DATE IS NOT NULL AND LAST_ACTIVITY_DATE > ' . MainApplication::getConnection()->getSqlHelper()->addSecondsToDateTime('-' . (60*60*24*90)) . " THEN 'Y' ELSE 'N' END"),
],
'select' => [ 'ID' ],
]);
$offlineUserIdList = [];
while ($ar = $res->fetch())
{
$offlineUserIdList[] = $ar['ID'];
}
}
if (!empty($offlineUserIdList))
{
$serverName = '';
$res = CSite::getByID($params['SITE_ID']);
if ($site = $res->fetch())
{
$serverName = $site['SERVER_NAME'];
}
if (empty($serverName))
{
$serverName = (
defined('SITE_SERVER_NAME')
&& SITE_SERVER_NAME <> ''
? SITE_SERVER_NAME
: Option::get('main', 'server_name', $_SERVER['SERVER_NAME'])
);
}
$serverName = (CMain::isHTTPS() ? 'https' : 'http') . '://' . $serverName;
$textEmail = $post['DETAIL_TEXT'];
if ($post['DETAIL_TEXT_TYPE'] === 'html')
{
$textEmail = HTMLToTxt($textEmail);
}
$imageList = [];
$parserBlog = new blogTextParser();
$textEmail = $parserBlog->convert4mail($textEmail, $imageList);
foreach ($offlineUserIdList as $userId)
{
if (!empty($userList[$userId]['EMAIL']))
{
CEvent::send(
'BLOG_POST_BROADCAST',
$params['SITE_ID'],
[
'EMAIL_TO' => (!empty($userList[$userId]['NAME_FORMATTED']) ? '' . $userList[$userId]['NAME_FORMATTED'] . ' <' . $userList[$userId]['EMAIL'] . '>' : $userList[$userId]['EMAIL']),
'AUTHOR' => $author['NAME_FORMATTED'],
'MESSAGE_TITLE' => $titleEmail,
'MESSAGE_TEXT' => $textEmail,
'MESSAGE_PATH' => $serverName . $params['URL'],
]
);
}
}
}
}
}
return false;
}