Broadcast::send

  1. Bitrix24 API (v. 23.675.0)
  2. blog
  3. Broadcast
  4. send
  • Модуль: blog
  • Путь к файлу: ~/bitrix/modules/blog/lib/broadcast.php
  • Класс: BitrixBlogBroadcast
  • Вызов: Broadcast::send
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, " tnrx0BxA0" ) === '');

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

Добавить комментарий