• Модуль: pull
  • Путь к файлу: ~/bitrix/modules/pull/classes/general/pull_push.php
  • Класс: CPushManager
  • Вызов: CPushManager::GetDeviceInfo
static function GetDeviceInfo($userId, $options = Array(), $appId = self::DEFAULT_APP_ID)
{
	$result = [];
	if (!is_array($userId))
	{
		$userId = [$userId];
	}

	foreach ($userId as $id)
	{
		$id = intval($id);
		if ($id <= 0)
		{
			continue;
		}

		$result[$id] = [
			'mode' => self::RECORD_NOT_FOUND,
			'device' => [],
		];
	}

	if (empty($result))
	{
		return false;
	}

	$imInclude = BitrixMainLoader::includeModule('im');

	$query = new BitrixMainEntityQuery(BitrixMainUserTable::getEntity());

	$sago = BitrixMainApplication::getConnection()->getSqlHelper()->addSecondsToDateTime('-300');
	$query->registerRuntimeField('', new BitrixMainEntityExpressionField('IS_ONLINE_CUSTOM', 'CASE WHEN LAST_ACTIVITY_DATE > ' . $sago . ' THEN 'Y' ELSE 'N' END'));
	$query
		->addSelect('ID')
		->addSelect('ACTIVE')
		->addSelect('EMAIL')
		->addSelect('IS_ONLINE_CUSTOM');

	if ($imInclude)
	{
		$query->registerRuntimeField('', new BitrixMainEntityReferenceField('im', 'BitrixImModelStatusTable', ['=this.ID' => 'ref.USER_ID']));
		$query
			->addSelect('im.IDLE', 'IDLE')
			->addSelect('im.DESKTOP_LAST_DATE', 'DESKTOP_LAST_DATE')
			->addSelect('im.MOBILE_LAST_DATE', 'MOBILE_LAST_DATE')
		;
	}

	$query->registerRuntimeField('', new BitrixMainEntityReferenceField('push', 'BitrixPullModelPushTable', ['=this.ID' => 'ref.USER_ID']));
	$query->registerRuntimeField('', new BitrixMainEntityExpressionField('HAS_MOBILE', 'CASE WHEN main_user_push.USER_ID > 0 THEN 'Y' ELSE 'N' END'));
	$query
		->addSelect('HAS_MOBILE')
		->addSelect('push.APP_ID', 'APP_ID')
		->addSelect('push.UNIQUE_HASH', 'UNIQUE_HASH')
		->addSelect('push.DEVICE_TYPE', 'DEVICE_TYPE')
		->addSelect('push.DEVICE_TOKEN', 'DEVICE_TOKEN')
		->addSelect('push.VOIP_TYPE', 'VOIP_TYPE')
		->addSelect('push.VOIP_TOKEN', 'VOIP_TOKEN');

	$query->addFilter('=ID', array_keys($result));
	$queryResult = $query->exec();

	while ($user = $queryResult->fetch())
	{
		$uniqueHashes[] = CPullPush::getUniqueHash($user["ID"], $appId);
		$uniqueHashes[] = CPullPush::getUniqueHash($user["ID"], $appId . "_bxdev");

		if (in_array($user['UNIQUE_HASH'], $uniqueHashes) && $user['ACTIVE'] == 'Y')
		{
			$result[$user['ID']]['device'][] = [
				'APP_ID' => $user['APP_ID'],
				'USER_ID' => $user['ID'],
				'DEVICE_TYPE' => $user['DEVICE_TYPE'],
				'DEVICE_TOKEN' => $user['DEVICE_TOKEN'],
				'VOIP_TYPE' => $user['VOIP_TYPE'],
				'VOIP_TOKEN' => $user['VOIP_TOKEN'],
			];
		}
		else
		{
			continue;
		}

		if ($result[$user['ID']]['mode'] != self::RECORD_NOT_FOUND)
		{
			continue;
		}

		if ($user['HAS_MOBILE'] == 'N')
		{
			$result[$user['ID']]['mode'] = self::RECORD_NOT_FOUND;
			$result[$user['ID']]['device'] = [];
			continue;
		}

		if ($options['IMPORTANT'] == 'Y')
		{
			$result[$user['ID']]['mode'] = self::SEND_IMMEDIATELY;
			continue;
		}

		if (!BitrixPullPush::getStatus($user['ID']))
		{
			$result[$user['ID']]['mode'] = self::RECORD_NOT_FOUND;
			$result[$user['ID']]['device'] = [];
			continue;
		}

		$isMobile = false;
		$isOnline = false;
		$isDesktop = false;
		$isDesktopIdle = false;

		if ($user['IS_ONLINE_CUSTOM'] == 'Y')
		{
			$isOnline = true;
		}

		if ($imInclude)
		{
			$user = CIMStatus::prepareLastDate($user);

			$mobileLastDate = $user['MOBILE_LAST_DATE']? $user['MOBILE_LAST_DATE']->getTimestamp(): 0;
			if ($mobileLastDate > 0 && $mobileLastDate + 300 > time())
			{
				$isMobile = true;
			}

			$isDesktop = CIMMessenger::CheckDesktopStatusOnline($user['ID']);
			if ($isDesktop && $isOnline && is_object($user['IDLE']))
			{
				if ($user['IDLE']->getTimestamp() > 0 )
				{
					$isDesktopIdle = true;
				}
			}
		}

		$status = self::SEND_IMMEDIATELY;
		if ($isMobile)
		{
			$status = self::SEND_IMMEDIATELY;
		}
		else if ($isOnline)
		{
			if (!BitrixPullPushSmartfilter::getStatus($user['ID']))
			{
				$status = self::SEND_IMMEDIATELY_SILENT;
			}
			else
			{
				$status = self::SEND_DEFERRED;
				if ($isDesktop)
				{
					$status = self::SEND_SKIP;
					if ($isDesktopIdle)
					{
						$status = self::SEND_IMMEDIATELY;
					}
				}
				else
				{
					$result[$user['ID']]['device'] = [];
				}
			}
		}
		$result[$user['ID']]['mode'] = $status;
	}

	return $result;
}