• Модуль: xmpp
  • Путь к файлу: ~/bitrix/modules/xmpp/classes/server.php
  • Класс: CXMPPServer
  • Вызов: CXMPPServer::__ReportKernel
private function __ReportKernel()
{
	foreach ($this->arClientsIndex as $clientDomain	=> $arDomainClientsIndex)
	{
		if (!CXMPPUtility::SelectDatabase($clientDomain))
			continue;
		if (count($arDomainClientsIndex) <= 0)
			continue;

		foreach ($arDomainClientsIndex as $jid => $arId)
		{
			foreach ($arId as $id)
			{
				if (array_key_exists($id, $this->arClients))
				{
					if ($this->arClients[$id]->IsConnected() && $this->arClients[$id]->IsAuthenticated())
					{
						$idTmp = $this->arClients[$id]->GetId();
						CUser::SetLastActivityDate($idTmp);
						CXMPPClient::SetLastActivityDate($idTmp);
					}
				}
			}
		}

		$arOnlineOnSiteTmp = array();

		$dbUsers = CUser::GetList(
			"LOGIN",
			"DESC",
			array(
				"ACTIVE" => "Y",
				"LAST_ACTIVITY" => 600,
				"!UF_DEPARTMENT" => false
			),
			array('FIELDS' => array('ID', 'LOGIN'))
		);
		while ($arUser = $dbUsers->Fetch())
			$arOnlineOnSiteTmp[] = CXMPPUtility::GetJId($arUser, $clientDomain);

		if (!is_array($this->arOnlineOnSite[$clientDomain]))
			$this->arOnlineOnSite[$clientDomain] = array();

		$arOffline = array_diff($this->arOnlineOnSite[$clientDomain], $arOnlineOnSiteTmp);

		foreach ($arOffline as $jid)
		{
			if (!array_key_exists($jid, $this->arClientsIndex[$clientDomain])
				 || array_key_exists($jid, $this->arClientsIndex[$clientDomain]) && count($this->arClientsIndex[$clientDomain][$jid]) <= 0)
			{
				$this->SendAll(
					array(
						"presence" => array(
							"." => array(
								"type" => "unavailable",
								"from" => $jid,
							),
						),
					)
				);
			}
		}

		$arOnline = array_diff($arOnlineOnSiteTmp, $this->arOnlineOnSite[$clientDomain]);

		foreach ($arOnline as $jid)
		{
			if (!array_key_exists($jid, $this->arClientsIndex[$clientDomain])
				 || array_key_exists($jid, $this->arClientsIndex[$clientDomain]) && count($this->arClientsIndex[$clientDomain][$jid]) <= 0)
				$this->SendAll(
					array(
						"presence" => array(
							"." => array(
								"from" => $jid,
							),
						),
					)
				);
		}

		$this->arOnlineOnSite[$clientDomain] = $arOnlineOnSiteTmp;
	}
}