• Модуль: xmpp
  • Путь к файлу: ~/bitrix/modules/xmpp/classes/factory_classes/roster.php
  • Класс: CXMPPReceiveIQRoster
  • Вызов: CXMPPReceiveIQRoster::ReceiveMessage
public function ReceiveMessage($senderJId, array $arMessage, CXMPPClient $senderClient)
	{
		if (!$senderClient->IsAuthenticated())
			return false;
		if ($senderJId == '')
			return false;

		if (!array_key_exists("iq", $arMessage))
			return false;

		if ($arMessage['iq']['query']['.']['xmlns'] != 'jabber:iq:roster'
			&& ($arMessage['iq']['query']['.']['xmlns'] != 'jabber:iq:private' || $arMessage['iq']['query']['roster']['.']['xmlns'] != 'roster:delimiter'))
			return false;

		if ($arMessage['iq']['query']['.']['xmlns'] == 'jabber:iq:roster')
		{
			$arResult = array(
				"iq" => array(
					"." => array(
						"type" => "result",
						"to" => $senderJId,
						"id" => $arMessage['iq']['.']['id'],
					),
					"query" => array(
						"." => array(
							"xmlns" => $arMessage['iq']['query']['.']['xmlns'],
						),
					),
				),
			);

			if ($this->intranet)
			{
				$clientDomain = $senderClient->GetClientDomain();
				if (!array_key_exists($clientDomain, $this->rosterCache))
					$this->rosterCache[$clientDomain] = array();
				if (!array_key_exists($clientDomain, $this->rosterCacheAlt))
					$this->rosterCacheAlt[$clientDomain] = array();

				if ($senderClient->IsSubGroupsSupported() && count($this->rosterCache[$clientDomain]) <= 0
					|| !$senderClient->IsSubGroupsSupported() && count($this->rosterCacheAlt[$clientDomain]) <= 0)
				{
					$arDepCache = array();
					$arDepCacheValue = array();

					$dbUsers = CUser::GetList("LAST_NAME", "asc", array("ACTIVE" => "Y", "!UF_DEPARTMENT"=>false), array('SELECT' => array('UF_*')));
					while ($arUser = $dbUsers->Fetch())
					{
						$arT = array(
							"." => array(
								"subscription" => "both",
								"name" => CUser::FormatName($this->nameTemplate, $arUser),
								"jid" => CXMPPUtility::GetJId($arUser, $clientDomain),
							),
						);

						if (is_array($arUser['UF_DEPARTMENT']) && count($arUser['UF_DEPARTMENT']) > 0)
						{
							$arNewDep = array_diff($arUser['UF_DEPARTMENT'], $arDepCache);

							if (count($arNewDep) > 0)
							{
								$dbRes = CIBlockSection::GetList(array('SORT' => 'ASC'), array('ID' => $arNewDep));
								while ($arSect = $dbRes->Fetch())
								{
									$arDepCache[] = $arSect['ID'];

									$dbRes1 = CIBlockSection::GetNavChain($arSect['IBLOCK_ID'], $arSect['ID']);
									while ($arSect1 = $dbRes1->Fetch())
									{
										if ($senderClient->IsSubGroupsSupported())
										{
											if ($arDepCacheValue[$arSect['ID']] <> '')
												$arDepCacheValue[$arSect['ID']] .= "/";
											$arDepCacheValue[$arSect['ID']] .= htmlspecialcharsbx($arSect1['NAME']);
										}
										else
										{
											if ($arDepCacheValue[$arSect['ID']] <> '')
												$arDepCacheValue[$arSect['ID']] = "/".$arDepCacheValue[$arSect['ID']];
											$arDepCacheValue[$arSect['ID']] = htmlspecialcharsbx($arSect1['NAME']).$arDepCacheValue[$arSect['ID']];
										}
									}
								}
							}

							foreach ($arUser['UF_DEPARTMENT'] as $key => $sect)
							{
								if ($arDepCacheValue[$sect] <> '')
								{
									$arT["group"][] = array("#" => $arDepCacheValue[$sect]);
									if (!is_array($GLOBALS["BX_JHGDHGFJKDFSDG67"]))
										$GLOBALS["BX_JHGDHGFJKDFSDG67"] = array();
									if (!is_array($GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain]))
										$GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain] = array();
									if (!in_array($arDepCacheValue[$sect], $GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain]))
										$GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain][] = $arDepCacheValue[$sect];
								}
							}
						}

						if ($senderClient->IsSubGroupsSupported())
							$this->rosterCache[$clientDomain][] = $arT;
						else
							$this->rosterCacheAlt[$clientDomain][] = $arT;
					}
				}

				if ($senderClient->IsSubGroupsSupported())
				{
					foreach ($this->rosterCache[$clientDomain] as $ar)
					{
						if ($senderClient->GetJId() != $ar["."]["jid"])
							$arResult["iq"]["query"]["item"][] = $ar;
					}
				}
				else
				{
					foreach ($this->rosterCacheAlt[$clientDomain] as $ar)
					{
						if ($senderClient->GetJId() != $ar["."]["jid"])
							$arResult["iq"]["query"]["item"][] = $ar;
					}
				}
			}
			else
			{
				$ar = array();

				$dbFriends = CSocNetUserRelations::GetRelatedUsers($senderClient->GetId(), SONET_RELATIONS_FRIEND);
				while ($arFriends = $dbFriends->GetNext())
				{
					$pref = (($senderClient->GetId() == $arFriends["FIRST_USER_ID"]) ? "SECOND" : "FIRST");

					$name = CUser::FormatName($this->nameTemplate, 
						array("NAME" 		=> $arFriends[$pref."_USER_NAME"],
							"LAST_NAME" 	=> $arFriends[$pref."_USER_LAST_NAME"],
							"SECOND_NAME" 	=> $arFriends[$pref."_USER_SECOND_NAME"],
							"LOGIN" 		=> $arFriends[$pref."_USER_LOGIN"],
							), true);

					$arT = array(
						"." => array(
							"subscription" => "both",
							"name" => $name,
							"jid" => CXMPPUtility::GetJId(array("LOGIN" => $arFriends[$pref."_USER_LOGIN"]), $senderClient->GetClientDomain()),
						),
					);

					$ar[] = $arT;
				}

				$arResult["iq"]["query"]["item"] = $ar;
			}

			$senderClient->Send($arResult);

			$server = CXMPPServer::GetServer();
			$server->SendPresenceMessages($senderJId, $senderClient->GetClientDomain());
			$server->SendPresenceMessages2($senderJId, $senderClient->GetClientDomain());
		}
		elseif ($arMessage['iq']['query']['.']['xmlns'] == 'jabber:iq:private' && $arMessage['iq']['query']['roster']['.']['xmlns'] == 'roster:delimiter')
		{
			$arResult = array(
				"iq" => array(
					"." => array(
						"type" => "result",
						"to" => $senderJId,
						"id" => $arMessage['iq']['.']['id'],
					),
					"query" => array(
						"." => array("xmlns" => 'jabber:iq:private',),
						"roster" => array(
							"." => array("xmlns" => 'roster:delimiter',),
							"#" => "/",
						),
					),
				),
			);

			$senderClient->SetSubGroupsSupport(true);

			$senderClient->Send($arResult);
		}

		return true;
	}