• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/im.php
  • Класс: BitrixImOpenLinesIm
  • Вызов: Im::userIsOnline
static function userIsOnline($id)
{
	$result = false;

	if(Loader::includeModule('im'))
	{
		$id = intval($id);
		if ($id > 0)
		{
			$cache = Cache::createInstance();

			if ($cache->initCache(self::CACHE_TIME_IM_USER_ONLINE, $id, self::CACHE_DIR_IM_USER_ONLINE))
			{
				$result = $cache->getVars();
			}
			elseif ($cache->startDataCache())
			{
				$lastActivityDate = Queue::getTimeLastActivityOperator();
				$timeHelper = Application::getConnection()->getSqlHelper()->addSecondsToDateTime('(-'.$lastActivityDate.')');

				$query = new Query(UserTable::getEntity());

				$query->setSelect(['IS_ONLINE_CUSTOM']);

				$query->registerRuntimeField('', new ReferenceField(
					'IM_STATUS',
					'BitrixImModelStatusTable',
					['=ref.USER_ID' => 'this.ID'],
					['join_type'=>'left']
				));

				$query->registerRuntimeField('',
					new ExpressionField(
						'IS_ONLINE_CUSTOM',
						'CASE WHEN %1$s > '.$timeHelper.' && (%2$s IS NULL || %1$s > %2$s) THEN 'Y' ELSE 'N' END',
						['LAST_ACTIVITY_DATE', 'IM_STATUS.IDLE'])
				);

				$query->setFilter(['ID' => $id]);

				$resultQuery = $query->exec();

				if ($resultQuery->fetch()['IS_ONLINE_CUSTOM'] == 'Y')
				{
					$result = true;
				}

				$cache->endDataCache($result);
			}
		}
	}

	return $result;
}