• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_status.php
  • Класс: CIMStatus
  • Вызов: CIMStatus::GetList
static function GetList($params = Array())
{
	if (!is_array($params))
		$params = Array();

	$userIds = Array();
	if (isset($params['ID']) && is_array($params['ID']) && !empty($params['ID']))
	{
		foreach ($params['ID'] as $key => $value)
		{
			$userIds[] = intval($value);
		}
	}
	else if (isset($params['ID']) && intval($params['ID']) > 0)
	{
		$userIds[] = intval($params['ID']);
	}

	if (isset($params['CLEAR_CACHE']) && $params['CLEAR_CACHE'] == 'Y')
	{
		$obCache = new CPHPCache();
		$obCache->CleanDir(self::CACHE_ONLINE_PATH);
	}

	global $USER;
	$userId = is_object($USER)? intval($USER->GetID()): 0;

	$users = Array();
	$loadFromDb = true;
	$loadRecent = false;
	if (empty($userIds))
	{
		$loadRecent = true;
		if (!is_null(self::$CACHE_RECENT))
		{
			$loadFromDb = false;
			$users = self::$CACHE_RECENT;
		}
	}
	else if (!empty($userIds))
	{
		foreach($userIds as $id => $uid)
		{
			if (isset(self::$CACHE_USERS[$uid]))
			{
				unset($userIds[$id]);
				$users[$uid] = self::$CACHE_USERS[$uid];
			}
		}
		if (empty($userIds))
		{
			$loadFromDb = false;
		}
	}

	if ($loadFromDb)
	{
		if ($loadRecent)
		{
			$orm = BitrixImModelRecentTable::getList(array(
				'select' => Array(
					'ID' => 'U.ID',
					'EXTERNAL_AUTH_ID' => 'U.EXTERNAL_AUTH_ID',
					'LAST_ACTIVITY_DATE' => 'U.LAST_ACTIVITY_DATE',
					'PERSONAL_GENDER' => 'U.PERSONAL_GENDER',
					'COLOR' => 'ST.COLOR',
					'STATUS' =>	'ST.STATUS',
					'IDLE' => 'ST.IDLE',
					'MOBILE_LAST_DATE' => 'ST.MOBILE_LAST_DATE',
					'DESKTOP_LAST_DATE' => 'ST.DESKTOP_LAST_DATE',
				 ),
				'runtime' => Array(
					new BitrixMainEntityReferenceField(
						'ST',
						'BitrixImModelStatusTable',
						array("=ref.USER_ID" => "this.ITEM_ID",),
						array("join_type"=>"LEFT")
					),
					new BitrixMainEntityReferenceField(
						'U',
						'BitrixMainUserTable',
						array("=ref.ID" => "this.ITEM_ID",),
						array("join_type"=>"LEFT")
					)
				),
				'filter' => Array(
					'=USER_ID' => $userId,
					"=ITEM_TYPE" => IM_MESSAGE_PRIVATE,
				)
			));
		}
		else
		{
			$orm = BitrixMainUserTable::getList(array(
				'select' => Array(
					'ID',
					'EXTERNAL_AUTH_ID',
					'LAST_ACTIVITY_DATE',
					'PERSONAL_GENDER',
					'COLOR' => 'ST.COLOR',
					'STATUS' =>	'ST.STATUS',
					'IDLE' => 'ST.IDLE',
					'MOBILE_LAST_DATE' => 'ST.MOBILE_LAST_DATE',
					'DESKTOP_LAST_DATE' => 'ST.DESKTOP_LAST_DATE',
				 ),
				'runtime' => Array(
					new BitrixMainEntityReferenceField(
						'ST',
						'BitrixImModelStatusTable',
						array(
							"=ref.USER_ID" => "this.ID",
						),
						array("join_type"=>"LEFT")
					)
				),
				'filter' => Array(
					'=ID' => $userIds,
				)
			));
		}

		while ($user = $orm->fetch())
		{
			$color = null;
			if (isset($user['COLOR']) && $user['COLOR'] <> '')
			{
				$color = IMColor::getColor($user['COLOR']);
			}
			if (!$color)
			{
				$color = CIMContactList::GetUserColor($user["ID"], $user['PERSONAL_GENDER'] == 'M'? 'M': 'F');
			}

			$user['LAST_ACTIVITY_DATE'] = $user['LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime? $user['LAST_ACTIVITY_DATE']: false;
			$user = CIMStatus::prepareLastDate($user);

			$users[$user["ID"]] = Array(
				'id' => $user["ID"],
				'status' => in_array($user['STATUS'], self::$AVAILABLE_STATUSES)? $user['STATUS']: 'online',
				'color' => $color,
				'idle' => $user['IDLE']?: false,
				'last_activity_date' => $user['LAST_ACTIVITY_DATE']?: false,
				'mobile_last_date' => $user['MOBILE_LAST_DATE']?: false,
				'absent' => CIMContactList::formatAbsentResult($user["ID"]),
			);

			self::$CACHE_USERS[$user["ID"]] = $users[$user["ID"]];
		}

		if ($loadRecent)
		{
			self::$CACHE_RECENT = self::$CACHE_USERS;
		}
	}

	return Array('users' => $users);
}