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;
}