• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_contact_list.php
  • Класс: CAllIMContactList
  • Вызов: CAllIMContactList::GetList
function GetList($arParams = Array())
{
	global $USER, $CACHE_MANAGER;

	$bLoadUsers = isset($arParams['LOAD_USERS']) && $arParams['LOAD_USERS'] == 'N'? false: true;
	$bLoadChats = isset($arParams['LOAD_CHATS']) && $arParams['LOAD_CHATS'] == 'N'? false: true;

	$arGroups = array();
	if(defined("BX_COMP_MANAGED_CACHE"))
		$ttl = 2592000;
	else
		$ttl = 600;

	$bBusShowAll = !IsModuleInstalled('intranet') && COption::GetOptionInt('im', 'contact_list_show_all_bus');

	$bIntranetEnable = false;
	if(CModule::IncludeModule('intranet') && CModule::IncludeModule('iblock'))
	{
		$bIntranetEnable = true;
		if (!(CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser()))
		{
			if(($iblock_id = COption::GetOptionInt('intranet', 'iblock_structure', 0)) > 0)
			{
				$cache_id = 'im_structure_'.$iblock_id;
				$obIMCache = new CPHPCache;
				$cache_dir = '/bx/imc/structure';

				if($obIMCache->InitCache($ttl, $cache_id, $cache_dir))
				{
					$tmpVal = $obIMCache->GetVars();
					$arStructureName = $tmpVal['STRUCTURE_NAME'];
					unset($tmpVal);
				}
				else
				{
					if(defined("BX_COMP_MANAGED_CACHE"))
						$CACHE_MANAGER->StartTagCache($cache_dir);

					$arResult["Structure"] = array();
					$sec = CIBlockSection::GetList(
						Array("left_margin"=>"asc","SORT"=>"ASC"),
						Array("ACTIVE"=>"Y","IBLOCK_ID"=>$iblock_id),
						false,
						Array('ID', 'NAME', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID')
					);
					$arStructureName = Array();
					while($ar = $sec->GetNext(true, false))
					{
						if ($ar['DEPTH_LEVEL'] > 1)
							$ar['NAME'] .= ' / '.$arStructureName[$ar['IBLOCK_SECTION_ID']];
						$arStructureName[$ar['ID']] = $ar['NAME'];
					}

					if(defined("BX_COMP_MANAGED_CACHE"))
					{
						$CACHE_MANAGER->RegisterTag('iblock_id_'.$iblock_id);
						$CACHE_MANAGER->EndTagCache();
					}

					if($obIMCache->StartDataCache())
					{
						$obIMCache->EndDataCache(array(
							'STRUCTURE_NAME' => $arStructureName
						));
					}
				}

				unset($obIMCache);

				foreach ($arStructureName as $key => $value)
				{
					if ($value <> '')
					{
						$arGroups[$key] = Array('id' => $key, 'name' => $value);
					}
				}
			}
		}
	}

	$arUserSG = array();
	$arUsers = array();
	$arUserInGroup = array();
	$arExtranetUsers = array();

	$groups = BitrixImIntegrationSocialnetworkExtranet::getGroup(Array(), $this->user_id);
	if (is_array($groups))
	{
		foreach ($groups as $groupId => $group)
		{
			$arUserInGroup[$groupId] = Array('id' => $groupId, 'users' => $group['USERS']);
			foreach ($group['USERS'] as $groupUserId)
			{
				$arExtranetUsers[$groupUserId] = $groupUserId;
			}
			$arUserSG[$groupId] = array(
				'id' => $groupId,
				'status' => 'open',
				'name' => $group['NAME']
			);
			$arGroups[$groupId] = $arUserSG[$groupId];
		}
	}

	$bFriendEnable = false;
	if ((!CModule::IncludeModule('extranet') || !CExtranet::IsExtranetSite()) && CModule::IncludeModule('socialnetwork') && CSocNetUser::IsFriendsAllowed())
	{
		$bFriendEnable = true;
		$dbFriends = CSocNetUserRelations::GetList(array(),array("USER_ID" => $USER->GetID(), "RELATION" => SONET_RELATIONS_FRIEND), false, false, array("ID", "FIRST_USER_ID", "SECOND_USER_ID", "DATE_CREATE", "DATE_UPDATE", "INITIATED_BY"));
		if ($dbFriends)
		{
			while ($arFriends = $dbFriends->GetNext(true, false))
			{
				$friendId = $pref = (intval($USER->GetID()) == $arFriends["FIRST_USER_ID"]) ? $arFriends["SECOND_USER_ID"] : $arFriends["FIRST_USER_ID"];
				$arFriendUsers[$friendId] = $friendId;

				/*
				if (isset($arUserInGroup["friends"]))
					$arUserInGroup["friends"]['users'][] = $friendId;
				else
					$arUserInGroup["friends"] = Array('id' => "friends", 'users' => Array($friendId));
				*/
			}
		}
		/*
		$arGroups['friends'] = array(
			'id' => 'friends',
			'status' => (isset($arGroupStatus['friends']) && $arGroupStatus['friends'] == 'close'? 'close': 'open'),
			'name' => GetMessage('IM_CL_GROUP_FRIENDS')
		);
		*/
	}

	$filter = array(
		'=ACTIVE' => 'Y',
		'=CONFIRM_CODE' => false,
		'!=EXTERNAL_AUTH_ID' => BitrixImModelUserTable::filterExternalUserTypes([BitrixImBot::EXTERNAL_AUTH_ID])
	);
	if (CModule::IncludeModule('extranet'))
	{
		if(!CExtranet::IsIntranetUser())
		{
			$filter['=ID'] = array_merge(Array($USER->GetId()), $arExtranetUsers);
		}
	}

	if ($bLoadUsers)
	{
		if ($bFriendEnable)
		{
			if (!$bIntranetEnable && !$bBusShowAll)
			{
				$filter['=ID'][] = $USER->GetId();
				if (!empty($arFriendUsers))
				{
					$filter['=ID'] =  array_merge($filter['=ID'], $arFriendUsers);
				}
				if (!empty($arExtranetUsers))
				{
					$filter['=ID'] =  array_merge($filter['=ID'], $arExtranetUsers);
				}
			}
		}

		$bCLCacheEnable = false;
		if ($bIntranetEnable && (!$bFriendEnable || $bBusShowAll))
			$bCLCacheEnable = true;

		if ($bCLCacheEnable && CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser())
			$bCLCacheEnable = false;

		$bVoximplantEnable = CModule::IncludeModule('voximplant');
		$bColorEnabled = IMColor::isEnabled();
		$bOpenChatEnabled = CIMMessenger::CheckEnableOpenChat();

		$nameTemplate = self::GetUserNameTemplate(SITE_ID);
		$nameTemplateSite = CSite::GetNameFormat(false);
		$cache_id = 'im_contact_list_v29_'.$nameTemplate.'_'.$nameTemplateSite.(!empty($arExtranetUsers)? '_'.$USER->GetID(): '').$bVoximplantEnable.$bColorEnabled.$bOpenChatEnabled;
		$obCLCache = new CPHPCache;
		$cache_dir = '/bx/imc/contact';

		$arUsersToGroup = array();
		$arUserInGroupStructure = array();
		$arPhones = Array();

		if($bCLCacheEnable && $obCLCache->InitCache($ttl, $cache_id, $cache_dir))
		{
			$tmpVal = $obCLCache->GetVars();
			$arUsers = $tmpVal['USERS'];
			$arPhones = $tmpVal['PHONES'];
			$arUsersToGroup = $tmpVal['USER_TO_GROUP'];
			$arUserInGroupStructure = $tmpVal['USER_IN_GROUP'];
			unset($tmpVal);

			$arOnline = CIMStatus::GetList();
			foreach ($arUsers as $userId => $value)
			{
				$arUsers[$userId]['status'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['status']: 'offline';
				$arUsers[$userId]['idle'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['idle']: false;
				$arUsers[$userId]['mobile_last_date'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['mobile_last_date']: false;
				$arUsers[$userId]['desktop_last_date'] = $arOnline['users'][$userId]['desktop_last_date'] ?? false;
				$arUsers[$userId]['last_activity_date'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['last_activity_date']: false;
				$arUsers[$userId]['absent'] = self::formatAbsentResult($userId);
				if (isset($arOnline['users'][$userId]['color']) && $arOnline['users'][$userId]['color'])
				{
					$arUsers[$userId]['color'] = $arOnline['users'][$userId]['color'];
				}
			}
		}
		else
		{
			$select = array(
				"ID", "LAST_NAME", "NAME", "LOGIN", "PERSONAL_PHOTO", "SECOND_NAME", "PERSONAL_BIRTHDAY", "WORK_POSITION", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", "WORK_PHONE", "PERSONAL_PHONE", "PERSONAL_MOBILE", "TIME_ZONE_OFFSET", "ACTIVE", "LAST_ACTIVITY_DATE",
				"COLOR" => "ST.COLOR", "STATUS" =>	"ST.STATUS", "IDLE" => "ST.IDLE", "MOBILE_LAST_DATE" => "ST.MOBILE_LAST_DATE", "DESKTOP_LAST_DATE" => "ST.DESKTOP_LAST_DATE",
			);
			if($bIntranetEnable)
			{
				$select[] = 'UF_ZOOM';
				$select[] = 'UF_SKYPE';
				$select[] = 'UF_SKYPE_LINK';
				$select[] = 'UF_PHONE_INNER';
				$select[] = 'UF_DEPARTMENT';
			}
			if ($bVoximplantEnable)
			{
				$select[] = 'UF_VI_PHONE';
			}

			$orm = BitrixMainUserTable::getList(Array(
				'select' => $select,
				'filter' => $filter,
				'runtime' => Array(
					new BitrixMainEntityReferenceField(
						'ST',
						'BitrixImModelStatusTable',
						array(
							"=ref.USER_ID" => "this.ID",
						),
						array("join_type"=>"LEFT")
					)
				),
				'order' => Array('LAST_NAME' => 'ASC')
			));

			$bots = BitrixImBot::getListCache();

			while ($arUser = $orm->fetch())
			{
				$arUser = CIMStatus::prepareLastDate($arUser);

				$skipUser = false;
				if(is_array($arUser["UF_DEPARTMENT"]) && !empty($arUser["UF_DEPARTMENT"]))
				{
					foreach($arUser["UF_DEPARTMENT"] as $dep_id)
					{
						if (isset($arUserInGroupStructure[$dep_id]))
							$arUserInGroupStructure[$dep_id]['users'][] = $arUser["ID"];
						else
							$arUserInGroupStructure[$dep_id] = Array('id' => $dep_id, 'users' => Array($arUser["ID"]));
					}
				}
				/*
				else if ($bBusShowAll)
				{
					$skipUser = false;

					if (isset($arUserInGroup['all']))
						$arUserInGroup['all']['users'][] = $arUser["ID"];
					else
						$arUserInGroup['all'] = Array('id' => 'all', 'users' => Array($arUser["ID"]));
				}*/
				else
				{
					$skipUser = true;
					if ($arUser['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID)
						$skipUser = false;
					else if (isset($arExtranetUsers[$arUser["ID"]]))
						$skipUser = false;
					elseif (isset($arFriendUsers[$arUser["ID"]]))
						$skipUser = false;
					elseif ($arUser["ID"] == $USER->GetID())
						$skipUser = false;
				}

				if (!$skipUser)
				{
					foreach ($arUser as $key => $value)
					{
						$arUser[$key] = !is_array($value) && !is_object($value)? htmlspecialcharsEx($value): $value;
					}

					$color = self::GetUserColor($arUser["ID"], $arUser['PERSONAL_GENDER'] == 'M'? 'M': 'F');
					if (isset($arUser['COLOR']) && $arUser['COLOR'] <> '')
					{
						$color = IMColor::getColor($arUser['COLOR']);
					}
					if (!$color)
					{
						$color = self::GetUserColor($arUser["ID"], $arUser['PERSONAL_GENDER'] == 'M'? 'M': 'F');
					}

					$arUsersToGroup[$arUser['ID']] = $arUser["UF_DEPARTMENT"];
					$arUser['PERSONAL_BIRTHDAY'] = $arUser['PERSONAL_BIRTHDAY'] instanceof BitrixMainTypeDate? $arUser['PERSONAL_BIRTHDAY']->format('d-m'): false;
					$arUser['LAST_ACTIVITY_DATE'] = $arUser['LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime? $arUser['LAST_ACTIVITY_DATE']: false;

					$userExternalAuthId = $arUser['EXTERNAL_AUTH_ID'] ?? 'default';
					$userItemId = $arUser["ITEM_ID"] ?? null;
					$userById = $arUser["ID"] ?? null;

					$botByUserItemId = $bots[$userItemId] ?? null;
					$botByUserId = $bots[$userById] ?? null;

					$botClassName = $botByUserItemId['CLASS'] ?? null;
					$botType = $botByUserId['TYPE'] ?? null;
					if (
						$userExternalAuthId == BitrixImBot::EXTERNAL_AUTH_ID
						&& $botType == BitrixImBot::TYPE_NETWORK
						&& (
							$botClassName === BitrixImBotBotSupport24::class
							|| $botClassName === BitrixImBotBotPartner24::class
							|| $botClassName === BitrixImBotBotSaleSupport24::class
						)
					)
					{
						$userExternalAuthId = 'support24';
					}

					$arUsers[$arUser["ID"]] = Array(
						'id' => $arUser["ID"],
						'name' => BitrixImUser::formatFullNameFromDatabase($arUser),
						'active' => $arUser['ACTIVE'] == 'Y',
						'first_name' => BitrixImUser::formatNameFromDatabase($arUser),
						'last_name' => $arUser['LAST_NAME'],
						'work_position' => $arUser['WORK_POSITION'],
						'color' => $color,
						'avatar' => CIMChat::GetAvatarImage($arUser["PERSONAL_PHOTO"]),
						'birthday' => $arUser['PERSONAL_BIRTHDAY'],
						'gender' => $arUser['PERSONAL_GENDER'] == 'F'? 'F': 'M',
						'phone_device' => $bVoximplantEnable && $arUser['UF_VI_PHONE'] == 'Y',
						'extranet' => self::IsExtranet($arUser),
						'tz_offset' => intval($arUser['TIME_ZONE_OFFSET']),
						'network' => ($userExternalAuthId === self::NETWORK_AUTH_ID) || ($userExternalAuthId === BitrixImBot::EXTERNAL_AUTH_ID) && ($botType === BitrixImBot::TYPE_NETWORK),
						'bot' => $userExternalAuthId === BitrixImBot::EXTERNAL_AUTH_ID,
						'profile' => CIMContactList::GetUserPath($arUser["ID"]),
						'external_auth_id' => $userExternalAuthId,
						'status' => $arUser['STATUS'],
						'idle' => $arUser['IDLE'],
						'last_activity_date' => $arUser['LAST_ACTIVITY_DATE'],
						'mobile_last_date' => $arUser['MOBILE_LAST_DATE'],
						'desktop_last_date' => $arUser['DESKTOP_LAST_DATE'],
						'absent' => self::formatAbsentResult($arUser["ID"]),
					);

					$services = [];
					if (!empty($arUser['UF_ZOOM']))
					{
						$services['zoom'] = $arUser['UF_ZOOM'];
					}
					if (!empty($arUser['UF_SKYPE_LINK']))
					{
						$services['skype'] = $arUser['UF_SKYPE_LINK'];
					}
					else if (!empty($arUser['UF_SKYPE']))
					{
						$services['skype'] = 'skype://'.$arUser['UF_SKYPE'];
					}

					$arUsers[$arUser["ID"]]['services'] = empty($services)? null: array_change_key_case($services, CASE_LOWER);

					if ($bVoximplantEnable)
					{
						$result = CVoxImplantPhone::Normalize($arUser["WORK_PHONE"]);
						if ($result)
						{
							$arPhones[$arUser["ID"]]['WORK_PHONE'] = $arUser['WORK_PHONE'];
						}
						$result = CVoxImplantPhone::Normalize($arUser["PERSONAL_MOBILE"]);
						if ($result)
						{
							$arPhones[$arUser["ID"]]['PERSONAL_MOBILE'] = $arUser['PERSONAL_MOBILE'];
						}
						$result = CVoxImplantPhone::Normalize($arUser["PERSONAL_PHONE"]);
						if ($result)
						{
							$arPhones[$arUser["ID"]]['PERSONAL_PHONE'] = $arUser['PERSONAL_PHONE'];
						}
						$result = preg_replace("/[^0-9#*]/i", "", $arUser["UF_PHONE_INNER"]);
						if ($result)
						{
							$arPhones[$arUser["ID"]]['INNER_PHONE'] = $result;
						}
					}
					else
					{
						$arPhones[$arUser["ID"]]['WORK_PHONE'] = $arUser['WORK_PHONE'];
						$arPhones[$arUser["ID"]]['PERSONAL_MOBILE'] = $arUser['PERSONAL_MOBILE'];
						$arPhones[$arUser["ID"]]['PERSONAL_PHONE'] = $arUser['PERSONAL_PHONE'];
						$arPhones[$arUser["ID"]]['INNER_PHONE'] = $arUser['UF_PHONE_INNER'];
					}
				}
			}
			if ($bCLCacheEnable)
			{
				if(defined("BX_COMP_MANAGED_CACHE"))
				{
					$CACHE_MANAGER->StartTagCache($cache_dir);
					$CACHE_MANAGER->RegisterTag("IM_CONTACT_LIST");
					$CACHE_MANAGER->RegisterTag($bVoximplantEnable? "USER_CARD": "USER_NAME");
					$CACHE_MANAGER->EndTagCache();
				}
				if($obCLCache->StartDataCache())
				{
					$obCLCache->EndDataCache(array(
							'USERS' => $arUsers,
							'USER_TO_GROUP' => $arUsersToGroup,
							'USER_IN_GROUP' => $arUserInGroupStructure,
							'PHONES' => $arPhones
						)
					);
				}
			}
		}

		if (is_array($arUsersToGroup[$USER->GetID()]))
		{
			foreach($arUsersToGroup[$USER->GetID()] as $dep_id)
			{
				if (isset($arGroups[$dep_id]))
				{
					$arGroups[$dep_id]['status'] = 'open';
				}
			}
		}
		foreach ($arUserInGroupStructure as $key => $val)
		{
			$arUserInGroup[$key] = $val;
		}
		unset($arUsersToGroup, $arUserInGroupStructure);
	}

	$arChats = Array();
	if ($bLoadChats)
	{
		$bColorEnabled = IMColor::isEnabled();
		$bOpenChatEnabled = CIMMessenger::CheckEnableOpenChat();
		$cache_id = 'im_chats_v10_'.$USER->GetID().'_'.$bColorEnabled.'_'.$bOpenChatEnabled;
		$obCLCache = new CPHPCache;
		$cache_dir = '/bx/imc/chats';

		if($obCLCache->InitCache($ttl, $cache_id, $cache_dir))
		{
			$tmpVal = $obCLCache->GetVars();
			$arChats = $tmpVal['CHATS'];
			unset($tmpVal);
		}
		else
		{
			$arChats = CIMChat::GetChatData(Array(
				'SKIP_PRIVATE' => 'Y',
				'GET_LIST' => 'Y',
				'USER_ID' => $USER->GetID()
			));

			if (CIMMessenger::CheckEnableOpenChat() && !IMUser::getInstance($USER->GetID())->isExtranet())
			{
				$chatsOpen = CIMChat::GetOpenChatData(Array(
					'USER_ID' => $USER->GetID()
				));

				foreach ($chatsOpen['chat'] as $key => $value)
				{
					$arChats['chat'][$key] = $value;
				}
				foreach ($chatsOpen['userInChat'] as $key => $value)
				{
					$arChats['userInChat'][$key] = $value;
				}
				foreach ($chatsOpen['userCallStatus'] as $key => $value)
				{
					$arChats['userCallStatus'][$key] = $value;
				}
				foreach ($chatsOpen['userChatBlockStatus'] as $key => $value)
				{
					$arChats['userChatBlockStatus'][$key] = $value;
				}
			}

			if($obCLCache->StartDataCache())
			{
				$obCLCache->EndDataCache(array(
					'CHATS' => $arChats,
				));
			}
		}
	}

	$arContactList = Array('users' => $arUsers, 'groups' => $arGroups, 'chats' => $arChats['chat'], 'lines' => $arChats['lines'], 'phones' => $arPhones, 'userInGroup' => $arUserInGroup);

	foreach(GetModuleEvents("im", "OnAfterContactListGetList", true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array(&$arContactList));

	return $arContactList;
}