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; } $bVoximplantEnable = IsModuleInstalled('voximplant'); $bBusShowAll = !IsModuleInstalled('intranet') && COption::GetOptionInt('im', 'contact_list_show_all_bus'); $bIntranetEnable = false; $arGroupStatus = CUserOptions::GetOption('IM', 'groupStatus'); 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 (strlen($value) > 0) { $arGroups[$key] = array('id' => $key, 'status' => isset($arGroupStatus[$key]) && $arGroupStatus[$key] == 'open' ? 'open' : 'close', 'name' => $value); } } } } } else { if ($bBusShowAll) { $arGroups['all'] = array('id' => 'all', 'status' => isset($arGroupStatus['all']) && $arGroupStatus['all'] == 'close' ? 'close' : 'open', 'name' => GetMessage('IM_CL_GROUP_ALL')); } } $arGroups['chat'] = array('id' => 'chat', 'status' => isset($arGroupStatus['chat']) && $arGroupStatus['chat'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_CHATS')); $arGroups['other'] = array('id' => 'other', 'status' => isset($arGroupStatus['other']) && $arGroupStatus['other'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_OTHER_2')); $arWoGroups = array('all' => array('id' => 'all', 'status' => isset($arGroupStatus['all']) && $arGroupStatus['all'] == 'close' ? 'close' : 'open', 'name' => GetMessage('IM_CL_GROUP_ALL')), 'chat' => array('id' => 'chat', 'status' => isset($arGroupStatus['chat']) && $arGroupStatus['chat'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_CHATS')), 'other' => array('id' => 'other', 'status' => isset($arGroupStatus['other']) && $arGroupStatus['other'] == 'open' ? 'open' : 'close', 'name' => $bIntranetEnable ? GetMessage('IM_CL_GROUP_OTHER') : GetMessage('IM_CL_GROUP_OTHER_2'))); $arUserSG = array(); $arUsers = array(); $arUserInGroup = array(); $arWoUserInGroup = array(); $arExtranetUsers = array(); if (CModule::IncludeModule('extranet') && CModule::IncludeModule("socialnetwork")) { $cache_id = 'im_user_sg_' . $USER->GetID(); $obSGCache = new CPHPCache(); $cache_dir = '/bx/imc/sonet'; if ($obSGCache->InitCache($ttl, $cache_id, $cache_dir)) { $tmpVal = $obSGCache->GetVars(); $arUserSG = $tmpVal['USER_SG']; $arExtranetUsers = $tmpVal['EXTRANET_USERS']; $arUserInGroup = $tmpVal['USER_IN_GROUP']; $arWoUserInGroup = $tmpVal['WO_USER_IN_GROUP']; unset($tmpVal); } else { if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->StartTagCache($cache_dir); } $dbUsersInGroup = CSocNetUserToGroup::GetList(array(), array("USER_ID" => $USER->GetID(), "<=ROLE" => SONET_ROLES_USER, "GROUP_SITE_ID" => CExtranet::GetExtranetSiteID(), "GROUP_ACTIVE" => "Y", "GROUP_CLOSED" => "N"), false, false, array("ID", "GROUP_ID", "GROUP_NAME")); $arUserSocNetGroups = array(); while ($ar = $dbUsersInGroup->GetNext(true, false)) { $arUserSocNetGroups[] = $ar["GROUP_ID"]; $arUserSG['SG' . $ar['GROUP_ID']] = array('id' => 'SG' . $ar['GROUP_ID'], 'status' => isset($arGroupStatus['SG' . $ar['GROUP_ID']]) && $arGroupStatus['SG' . $ar['GROUP_ID']] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_SG') . $ar['GROUP_NAME']); if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->RegisterTag('sonet_group_' . $ar['GROUP_ID']); $CACHE_MANAGER->RegisterTag('sonet_user2group_G' . $ar['GROUP_ID']); } } if (count($arUserSocNetGroups) > 0) { $dbUsersInGroup = CSocNetUserToGroup::GetList(array(), array("GROUP_ID" => $arUserSocNetGroups, "<=ROLE" => SONET_ROLES_USER, "USER_ACTIVE" => "Y", "USER_CONFIRM_CODE" => false), false, false, array("ID", "USER_ID", "GROUP_ID")); while ($ar = $dbUsersInGroup->GetNext(true, false)) { if ($ar["USER_ID"] == $USER->GetID()) { continue; } $arExtranetUsers[$ar["USER_ID"]] = $ar["USER_ID"]; if (isset($arUserInGroup["SG" . $ar["GROUP_ID"]])) { $arUserInGroup["SG" . $ar["GROUP_ID"]]['users'][] = $ar["USER_ID"]; } else { $arUserInGroup["SG" . $ar["GROUP_ID"]] = array('id' => "SG" . $ar["GROUP_ID"], 'users' => array($ar["USER_ID"])); } if (isset($arWoUserInGroup["extranet"])) { $arWoUserInGroup["extranet"]['users'][] = $ar["USER_ID"]; } else { $arWoUserInGroup["extranet"] = array('id' => "extranet", 'users' => array($ar["USER_ID"])); } } if (isset($arWoUserInGroup['extranet']) && isset($arWoUserInGroup['extranet']['users'])) { $arWoUserInGroup['extranet']['users'] = array_values(array_unique($arWoUserInGroup['extranet']['users'])); } } if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->EndTagCache(); } if ($obSGCache->StartDataCache()) { $obSGCache->EndDataCache(array('USER_SG' => $arUserSG, 'EXTRANET_USERS' => $arExtranetUsers, 'USER_IN_GROUP' => $arUserInGroup, 'WO_USER_IN_GROUP' => $arWoUserInGroup)); } } unset($obSGCache); if (is_array($arUserSG)) { $arGroups = $arGroups + $arUserSG; } } $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)); } if (isset($arWoUserInGroup["all"])) { $arWoUserInGroup["all"]['users'][] = $friendId; } else { $arWoUserInGroup["all"] = array('id' => "all", 'users' => array($friendId)); } } } $arGroups['friends'] = array('id' => 'friends', 'status' => isset($arGroupStatus['friends']) && $arGroupStatus['friends'] == 'close' ? 'close' : 'open', 'name' => GetMessage('IM_CL_GROUP_FRIENDS')); } $arFilter = array('=ACTIVE' => 'Y', '=CONFIRM_CODE' => false); if (CModule::IncludeModule('extranet')) { if (!CExtranet::IsIntranetUser()) { $arFilter['=ID'] = array_merge(array($USER->GetId()), $arExtranetUsers); } $arWoGroups['extranet'] = array('id' => 'extranet', 'status' => isset($arGroupStatus['extranet']) && $arGroupStatus['extranet'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_EXTRANET')); } $arGroups['search'] = array('id' => 'search', 'status' => isset($arGroupStatus['search']) && $arGroupStatus['search'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_SEARCH')); $arWoGroups['search'] = array('id' => 'search', 'status' => isset($arGroupStatus['search']) && $arGroupStatus['search'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_SEARCH')); if ($bLoadUsers) { if ($bFriendEnable) { if (!$bIntranetEnable && !$bBusShowAll) { $arFilter['=ID'][] = $USER->GetId(); if (!empty($arFriendUsers)) { $arFilter['=ID'] = array_merge($arFilter['=ID'], $arFriendUsers); } if (!empty($arExtranetUsers)) { $arFilter['=ID'] = array_merge($arFilter['=ID'], $arExtranetUsers); } } } $bCLCacheEnable = false; if ($bIntranetEnable && (!$bFriendEnable || $bBusShowAll)) { $bCLCacheEnable = true; } if ($bCLCacheEnable && CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser()) { $bCLCacheEnable = false; } $bVoximplantEnable = IsModuleInstalled('voximplant'); $bColorEnabled = IM\Color::isEnabled(); $bOpenChatEnabled = CIMMessenger::CheckEnableOpenChat(); $nameTemplate = self::GetUserNameTemplate(SITE_ID); $nameTemplateSite = CSite::GetNameFormat(false); $cache_id = 'im_contact_list_v11_' . $nameTemplate . '_' . $nameTemplateSite . (!empty($arExtranetUsers) ? '_' . $USER->GetID() : '') . $bVoximplantEnable . $bColorEnabled . $bOpenChatEnabled; $obCLCache = new CPHPCache(); $cache_dir = '/bx/imc/contact'; $arUsersToGroup = array(); $arUserInGroupStructure = array(); if ($bCLCacheEnable && $obCLCache->InitCache($ttl, $cache_id, $cache_dir)) { $tmpVal = $obCLCache->GetVars(); $arUsers = $tmpVal['USERS']; $arWoUserInGroup['all'] = $tmpVal['WO_USER_IN_GROUP_ALL']; $arUsersToGroup = $tmpVal['USER_TO_GROUP']; $arUserInGroupStructure = $tmpVal['USER_IN_GROUP']; unset($tmpVal); $arOnline = CIMStatus::GetList(); foreach ($arUsers as $userId => $value) { $arUsers[$userId]['birthday'] = $bIntranetEnable ? CIntranetUtils::IsToday($arUsers[$userId]['birthday']) : false; $arUsers[$userId]['status'] = isset($arOnline['users'][$userId]) ? $arOnline['users'][$userId]['status'] : 'offline'; $arUsers[$userId]['idle'] = isset($arOnline['users'][$userId]) ? $arOnline['users'][$userId]['idle'] : 0; $arUsers[$userId]['mobileLastDate'] = isset($arOnline['users'][$userId]) ? $arOnline['users'][$userId]['mobileLastDate'] : 0; if ($arOnline['users'][$userId]['color']) { $arUsers[$userId]['color'] = $arOnline['users'][$userId]['color']; } } } else { $arSelect = array("ID", "LAST_NAME", "NAME", "LOGIN", "PERSONAL_PHOTO", "SECOND_NAME", "PERSONAL_BIRTHDAY", "WORK_POSITION", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID"); // TODO , "TIME_ZONE_OFFSET" if ($bIntranetEnable) { $arSelect[] = 'UF_DEPARTMENT'; } if ($bVoximplantEnable) { $arSelect[] = 'UF_VI_PHONE'; } $query = new \Bitrix\Main\Entity\Query(\Bitrix\Main\UserTable::getEntity()); $query->registerRuntimeField('', new \Bitrix\Main\Entity\ReferenceField('ref', 'Bitrix\\Im\\StatusTable', array('=this.ID' => 'ref.USER_ID'))); $query->addSelect('ref.COLOR', 'COLOR')->addSelect('ref.STATUS', 'STATUS')->addSelect('ref.IDLE', 'IDLE')->addSelect('ref.MOBILE_LAST_DATE', 'MOBILE_LAST_DATE'); $sago = Bitrix\Main\Application::getConnection()->getSqlHelper()->addSecondsToDateTime('-180'); $query->registerRuntimeField('', new \Bitrix\Main\Entity\ExpressionField('IS_ONLINE_CUSTOM', 'CASE WHEN LAST_ACTIVITY_DATE > ' . $sago . ' THEN \'Y\' ELSE \'N\' END')); $query->addSelect('IS_ONLINE_CUSTOM'); foreach ($arSelect as $value) { $query->addSelect($value); } foreach ($arFilter as $key => $value) { $query->addFilter($key, $value); } $resultQuery = $query->exec(); $arExtraUser = array(); while ($arUser = $resultQuery->fetch()) { $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"])); } } if (isset($arWoUserInGroup['all'])) { $arWoUserInGroup['all']['users'][] = $arUser["ID"]; } else { $arWoUserInGroup['all'] = array('id' => 'all', 'users' => array($arUser["ID"])); } } else { if ($bBusShowAll) { $skipUser = false; if (isset($arWoUserInGroup['all'])) { $arWoUserInGroup['all']['users'][] = $arUser["ID"]; } else { $arWoUserInGroup['all'] = array('id' => 'all', 'users' => array($arUser["ID"])); } if (isset($arUserInGroup['all'])) { $arUserInGroup['all']['users'][] = $arUser["ID"]; } else { $arUserInGroup['all'] = array('id' => 'all', 'users' => array($arUser["ID"])); } } else { $skipUser = true; 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; } $arExtraUser[$arUser["ID"]] = $arUser; $arFileTmp = CFile::ResizeImageGet($arUser["PERSONAL_PHOTO"], array('width' => 58, 'height' => 58), BX_RESIZE_IMAGE_EXACT, false, false, true); $color = self::GetUserColor($arUser["ID"], $arUser['PERSONAL_GENDER'] == 'M' ? 'M' : 'F'); if (isset($arUser['COLOR']) && strlen($arUser['COLOR']) > 0) { $color = IM\Color::getColor($arUser['COLOR']); } if (!$color) { $color = self::GetUserColor($arUser["ID"], $arUser['PERSONAL_GENDER'] == 'M' ? 'M' : 'F'); } $arUsersToGroup[$arUser['ID']] = $arUser["UF_DEPARTMENT"]; $arUsers[$arUser["ID"]] = array('id' => $arUser["ID"], 'name' => CUser::FormatName($nameTemplateSite, $arUser, true, false), 'nameList' => CUser::FormatName($nameTemplate, $arUser, true, false), 'workPosition' => $arUser['WORK_POSITION'], 'color' => $color, 'avatar' => empty($arFileTmp['src']) ? '/bitrix/js/im/images/blank.gif' : $arFileTmp['src'], 'status' => 'offline', 'birthday' => $arUser['PERSONAL_BIRTHDAY'], 'gender' => $arUser['PERSONAL_GENDER'] == 'F' ? 'F' : 'M', 'phoneDevice' => $bVoximplantEnable && $arUser['UF_VI_PHONE'] == 'Y', 'extranet' => self::IsExtranet($arUser), 'tzOffset' => intval($arUser['TIME_ZONE_OFFSET']), 'network' => $arUser['EXTERNAL_AUTH_ID'] == self::NETWORK_AUTH_ID, 'profile' => CIMContactList::GetUserPath($arUser["ID"])); } } if (isset($arWoUserInGroup['all']) && isset($arWoUserInGroup['all']['users'])) { $arWoUserInGroup['all']['users'] = array_values(array_unique($arWoUserInGroup['all']['users'])); } 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, 'WO_USER_IN_GROUP_ALL' => $arWoUserInGroup['all'], 'USER_TO_GROUP' => $arUsersToGroup, 'USER_IN_GROUP' => $arUserInGroupStructure)); } } foreach ($arUsers as $userId => $arUser) { $arUsers[$userId]['birthday'] = $bIntranetEnable ? CIntranetUtils::IsToday($arUsers[$userId]['birthday']) : false; $arUsers[$userId]['status'] = $arExtraUser[$userId]['IS_ONLINE_CUSTOM'] == 'Y' ? $arExtraUser[$userId]['STATUS'] : 'offline'; $arUsers[$userId]['idle'] = $arExtraUser[$userId]['IS_ONLINE_CUSTOM'] == 'Y' && is_object($arExtraUser[$userId]['IDLE']) ? $arExtraUser[$userId]['IDLE']->getTimestamp() : 0; $arUsers[$userId]['mobileLastDate'] = $arExtraUser[$userId]['IS_ONLINE_CUSTOM'] == 'Y' && is_object($arExtraUser[$userId]['MOBILE_LAST_DATE']) ? $arExtraUser[$userId]['MOBILE_LAST_DATE']->getTimestamp() : 0; } } //uasort($ar, create_function('$a, $b', 'if($a["stamp"] < $b["stamp"]) return 1; elseif($a["stamp"] > $b["stamp"]) return -1; else return 0;')); if (is_array($arUsersToGroup[$USER->GetID()])) { foreach ($arUsersToGroup[$USER->GetID()] as $dep_id) { if (isset($arGroups[$dep_id])) { $arGroups[$dep_id]['status'] = isset($arGroupStatus[$dep_id]) && $arGroupStatus[$dep_id] == 'close' ? 'close' : 'open'; } } } foreach ($arUserInGroupStructure as $key => $val) { $arUserInGroup[$key] = $val; } unset($arUsersToGroup, $arUserInGroupStructure); } $arChats = array(); if ($bLoadChats) { $bColorEnabled = IM\Color::isEnabled(); $bOpenChatEnabled = CIMMessenger::CheckEnableOpenChat(); $cache_id = 'im_chats_v7_' . $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() && !IM\User::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'], 'woGroups' => $arWoGroups, 'userInGroup' => $arUserInGroup, 'woUserInGroup' => $arWoUserInGroup); foreach (GetModuleEvents("im", "OnAfterContactListGetList", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arContactList)); } return $arContactList; }