- Модуль: 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;
}