示例#1
0
	public static function GetFormatMessage($arParams)
	{
		$arParams['ID'] = intval($arParams['ID']);
		$arParams['TO_USER_ID'] = isset($arParams['TO_CHAT_ID'])? intval($arParams['TO_CHAT_ID']): intval($arParams['TO_USER_ID']);
		$arParams['FROM_USER_ID'] = intval($arParams['FROM_USER_ID']);
		$arParams['MESSAGE'] = trim($arParams['MESSAGE']);
		$arParams['DATE_CREATE'] = intval($arParams['DATE_CREATE']);
		$arParams['PARAMS'] = empty($arParams['PARAMS'])? Array(): $arParams['PARAMS'];

		$arUsers = CIMContactList::GetUserData(Array('ID' => isset($arParams['TO_CHAT_ID'])? $arParams['FROM_USER_ID']: Array($arParams['TO_USER_ID'], $arParams['FROM_USER_ID'])));
		$arChat = Array();
		if (isset($arParams['TO_CHAT_ID']))
		{
			$arChat = CIMChat::GetChatData(array(
				'ID' => $arParams['TO_USER_ID'],
				'USE_CACHE' => 'N'
			));
		}

		$CCTP = new CTextParser();
		$CCTP->MaxStringLen = 200;
		$CCTP->allow = array("HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => "Y", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N");

		$text = $CCTP->convertText(htmlspecialcharsbx($arParams['MESSAGE']));
		$text_mobile = strip_tags(preg_replace("/<img.*?data-code=\"([^\"]*)\".*?>/i", "$1", $CCTP->convertText(htmlspecialcharsbx(preg_replace("/\[s\].*?\[\/s\]/i", "", $arParams['MESSAGE'])))) , '<br>');

		return Array(
			'CHAT_ID' => $arParams['CHAT_ID'],
			'CHAT' => isset($arChat['chat'])? $arChat['chat']: Array(),
			'USER_IN_CHAT' => isset($arChat['userInChat'])? $arChat['userInChat']: Array(),
			'USER_BLOCK_CHAT' => $arChat['userChatBlockStatus'],
			'USERS' => $arUsers['users'],
			'MESSAGE' => Array(
				'id' => $arParams['ID'],
				'chatId' => $arParams['CHAT_ID'],
				'senderId' => $arParams['FROM_USER_ID'],
				'recipientId' => isset($arParams['TO_CHAT_ID'])? 'chat'.$arParams['TO_USER_ID']: $arParams['TO_USER_ID'],
				'system' => $arParams['SYSTEM'] == 'Y'? 'Y': 'N',
				'date' => $arParams['DATE_CREATE'],
				'text' => $text,
				'text_mobile' => $text_mobile,
				'params' => $arParams['PARAMS']
			),
			'FILES' => isset($arParams['FILES'])? $arParams['FILES']: Array(),
		);
	}
示例#2
0
 public function OnImFileUpload($arFields)
 {
     if (!CModule::IncludeModule("im")) {
         return false;
     }
     $chatId = $arFields['CHAT_ID'];
     $arChat = CIMChat::GetChatData(array('ID' => $chatId));
     if ($arChat['chat'][$chatId]['type'] == IM_MESSAGE_PRIVATE) {
         $arFields["FROM_USER_ID"] = $arFields['FILE']['authorId'];
         foreach ($arChat['userInChat'][$chatId] as $userId) {
             if ($userId != $arFields["FROM_USER_ID"]) {
                 $arFields["TO_USER_ID"] = $userId;
             }
         }
         $domain = CXMPPServer::GetDomain();
         if (CXMPPUtility::IsBitrix24Mode()) {
             $domain = $_SERVER["HTTP_HOST"];
         }
         $factory = CXMPPFactory::GetFactory();
         return $factory->__SendMessage($arFields["FROM_USER_ID"], $arFields["TO_USER_ID"], $arFields["MESSAGE_ID"] > 1 ? $arFields["MESSAGE_ID"] : 1, IM_MESSAGE_PRIVATE, htmlspecialcharsbx(CTextParser::convert4mail(str_replace("#BR#", "\n", $arFields["MESSAGE_OUT"]))), $domain);
     }
     return true;
 }
示例#3
0
 public static function UploadFileFromDisk($chatId, $files)
 {
     if (intval($chatId) <= 0) {
         return false;
     }
     $chatRelation = CIMChat::GetRelationById($chatId);
     if (!$chatRelation[self::GetUserId()]) {
         return false;
     }
     $result['FILES'] = array();
     $messageFileId = array();
     foreach ($files as $fileId) {
         $newFile = self::SaveFromLocalDisk($chatId, substr($fileId, 4));
         if ($newFile) {
             $result['FILES'][$fileId] = self::GetFileParams($chatId, $newFile);
             $messageFileId[] = $newFile->getId();
             foreach ($chatRelation as $relation) {
                 if ($relation['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE) {
                     break;
                 }
                 if (self::GetUserId() == $relation['USER_ID']) {
                     continue;
                 }
                 \Bitrix\Disk\Driver::getInstance()->getRecentlyUsedManager()->push($relation['USER_ID'], $newFile->getId());
             }
         } else {
             $result['FILES'][$fileId]['id'] = 0;
         }
     }
     if (empty($messageFileId)) {
         return false;
     }
     $result['MESSAGE_ID'] = 0;
     $arChat = CIMChat::GetChatData(array('ID' => $chatId));
     $ar = array("TO_CHAT_ID" => $chatId, "FROM_USER_ID" => self::GetUserId(), "MESSAGE_TYPE" => $arChat['chat'][$chatId]['messageType'], "PARAMS" => array('FILE_ID' => $messageFileId));
     $messageId = CIMMessage::Add($ar);
     if ($messageId) {
         $result['MESSAGE_ID'] = $messageId;
     }
     return $result;
 }
示例#4
0
	public static function Signaling($arParams)
	{
		$arConfig['CHAT_ID'] = intval($arParams['CHAT_ID']);
		if ($arConfig['CHAT_ID'] <= 0)
			return false;

		global $DB, $USER;
		$arConfig['USER_ID'] = intval($arParams['USER_ID']) > 0? intval($arParams['USER_ID']): IntVal($USER->GetID());

		$arConfig['COMMAND'] = isset($arParams['COMMAND'])? $arParams['COMMAND']: 'signaling';
		$arConfig['PARAMS'] = isset($arParams['PARAMS'])? $arParams['PARAMS']: Array();

		$arChat = CIMChat::GetChatData(Array('ID' => $arConfig['CHAT_ID']));
		if (empty($arChat['chat']))
			return false;

		foreach ($arChat['userCallStatus'][$arConfig['CHAT_ID']] as $userId => $callStatus)
		{
			if ($userId != $arConfig['USER_ID'])
				self::Command($arConfig['CHAT_ID'], $userId, $arConfig['COMMAND'], $arConfig['PARAMS']);
		}

		return true;
	}
示例#5
0
		$CIMChat = new CIMChat();
		$CIMChat->Rename($_POST['CHAT_ID'], $_POST['CHAT_TITLE']);

		echo CUtil::PhpToJsObject(Array(
			'CHAT_ID' => intval($_POST['CHAT_ID']),
			'CHAT_TITLE' => $_POST['CHAT_TITLE'],
			'ERROR' => ''
		));
	}
	else if ($_POST['IM_CHAT_DATA_LOAD'] == 'Y')
	{
		CUtil::decodeURIComponent($_POST);

		$arChat = CIMChat::GetChatData(array(
			'ID' => $_POST['CHAT_ID'],
			'USE_CACHE' => 'Y',
			'USER_ID' => $USER->GetId()
		));

		echo CUtil::PhpToJsObject(Array(
			'CHAT' => $arChat['chat'],
			'CHAT_ID' => $_POST['CHAT_ID'],
			'USER_IN_CHAT' => $arChat['userInChat'],
			'USER_BLOCK_CHAT' => $arChat['userChatBlockStatus'],
			'ERROR' => ''
		));
	}
	else if ($_POST['IM_GET_EXTERNAL_DATA'] == 'Y')
	{
		$error = '';
		$arResult = Array(
示例#6
0
 public static 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'));
     $arGroups['search'] = array('id' => 'search', 'status' => isset($arGroupStatus['search']) && $arGroupStatus['search'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_SEARCH'));
     $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')), 'search' => array('id' => 'search', 'status' => isset($arGroupStatus['search']) && $arGroupStatus['search'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_SEARCH')));
     $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'));
     }
     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();
         $nameTemplate = self::GetUserNameTemplate(SITE_ID);
         $nameTemplateSite = CSite::GetNameFormat(false);
         $cache_id = 'im_contact_list_v11_' . $nameTemplate . '_' . $nameTemplateSite . (!empty($arExtranetUsers) ? '_' . $USER->GetID() : '') . $bVoximplantEnable . $bColorEnabled;
         $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");
             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), '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();
         $cache_id = 'im_chats_v4_' . $USER->GetID() . '_' . $bColorEnabled;
         $obCLCache = new CPHPCache();
         $cache_dir = '/bx/imc/chats';
         $arUsersToGroup = array();
         $arUserInGroupStructure = array();
         if ($obCLCache->InitCache($ttl, $cache_id, $cache_dir)) {
             $tmpVal = $obCLCache->GetVars();
             $arChats = $tmpVal['CHATS'];
             unset($tmpVal);
         } else {
             $chats = CIMChat::GetChatData(array('SKIP_PRIVATE' => 'Y', 'GET_LIST' => 'Y', 'USER_ID' => $USER->GetID()));
             $arChats = $chats['chat'];
             if ($obCLCache->StartDataCache()) {
                 $obCLCache->EndDataCache(array('CHATS' => $arChats));
             }
         }
     }
     $arContactList = array('users' => $arUsers, 'groups' => $arGroups, 'chats' => $arChats, 'woGroups' => $arWoGroups, 'userInGroup' => $arUserInGroup, 'woUserInGroup' => $arWoUserInGroup);
     foreach (GetModuleEvents("im", "OnAfterContactListGetList", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array(&$arContactList));
     }
     return $arContactList;
 }
示例#7
0
    die;
}
if (isset($_REQUEST['AJAX_CALL']) && $_REQUEST['AJAX_CALL'] == 'Y') {
    return;
}
if (intval($USER->GetID()) <= 0) {
    return;
}
if (!CModule::IncludeModule('im')) {
    return;
}
$chatId = intval($_GET['chat_id']);
if ($chatId <= 0) {
    return;
}
$arChat = CIMChat::GetChatData(array('ID' => $chatId, 'USE_CACHE' => 'N'));
$arResult['CHAT_ID'] = $chatId;
$arResult['CHAT'] = $arChat['chat'];
$arResult['USERS'] = array();
if (!empty($arChat['userInChat'][$chatId])) {
    $ar = CIMContactList::GetUserData(array('ID' => $arChat['userInChat'][$chatId], 'DEPARTMENT' => 'N', 'USE_CACHE' => 'Y'));
    $arResult['USERS'] = $ar['users'];
}
if (!$arResult['USERS'][$USER->GetId()]) {
    return;
}
$GLOBALS["APPLICATION"]->SetPageProperty("Viewport", "user-scalable=no, initial-scale=1.0, maximum-scale=1.0, width=290");
$GLOBALS["APPLICATION"]->SetPageProperty("BodyClass", "chat-profile-page");
if (!(isset($arParams['TEMPLATE_HIDE']) && $arParams['TEMPLATE_HIDE'] == 'Y')) {
    $this->IncludeComponentTemplate();
}
示例#8
0
 public static function GetFormatMessage($arParams)
 {
     $arParams['ID'] = intval($arParams['ID']);
     $arParams['TO_USER_ID'] = isset($arParams['TO_CHAT_ID']) ? intval($arParams['TO_CHAT_ID']) : intval($arParams['TO_USER_ID']);
     $arParams['FROM_USER_ID'] = intval($arParams['FROM_USER_ID']);
     $arParams['MESSAGE'] = trim($arParams['MESSAGE']);
     $arParams['DATE_CREATE'] = intval($arParams['DATE_CREATE']);
     $arUsers = CIMContactList::GetUserData(array('ID' => isset($arParams['TO_CHAT_ID']) ? $arParams['FROM_USER_ID'] : array($arParams['TO_USER_ID'], $arParams['FROM_USER_ID'])));
     $arChat = array();
     if (isset($arParams['TO_CHAT_ID'])) {
         $arChat = CIMChat::GetChatData(array('ID' => $arParams['TO_USER_ID'], 'USE_CACHE' => 'N'));
     }
     $CCTP = new CTextParser();
     $CCTP->MaxStringLen = 200;
     $CCTP->allow = array("HTML" => "N", "ANCHOR" => "Y", "BIU" => "N", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => "N", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N");
     $CCTPM = new CTextParser();
     $CCTPM->MaxStringLen = 200;
     $CCTPM->allow = array("HTML" => "N", "ANCHOR" => "N", "BIU" => "N", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => "N", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N");
     return array('CHAT' => isset($arChat['chat']) ? $arChat['chat'] : array(), 'USER_IN_CHAT' => isset($arChat['userInChat']) ? $arChat['userInChat'] : array(), 'USERS' => $arUsers['users'], 'MESSAGE' => array('id' => $arParams['ID'], 'senderId' => $arParams['FROM_USER_ID'], 'recipientId' => isset($arParams['TO_CHAT_ID']) ? 'chat' . $arParams['TO_USER_ID'] : $arParams['TO_USER_ID'], 'date' => $arParams['DATE_CREATE'], 'text' => $CCTP->convertText(htmlspecialcharsbx($arParams['MESSAGE'])), 'text_mobile' => $CCTPM->convertText(htmlspecialcharsbx($arParams['MESSAGE']))));
 }
示例#9
0
             $errorMessage = GetMessage('IM_ACCESS_ERROR');
         } else {
             $chat = new CIMChat();
             $chat->SetColor($_POST['CHAT_ID'], $_POST['COLOR']);
         }
     } else {
         CIMStatus::SetColor($USER->GetId(), $_POST['COLOR']);
     }
     echo CUtil::PhpToJsObject(array('COLOR' => $_POST['COLOR'], 'CHAT_ID' => $_POST['CHAT_ID'], 'ERROR' => $errorMessage));
 } else {
     if ($_POST['IM_GET_MOBILE_CHAT_AVATAR'] == 'Y') {
         $avatar = "";
         $errorMessage = "";
         if ($_POST['CHAT_ID'] > 0) {
             $chat = new CIMChat();
             $arChat = CIMChat::GetChatData(array('ID' => $_POST['CHAT_ID'], 'USE_CACHE' => 'N', 'PHOTO_SIZE' => '500', 'USER_ID' => intval($USER->GetId())));
             $arResult['CHAT'] = $arChat['chat'][$_POST['CHAT_ID']];
             if ($arResult['CHAT']) {
                 $avatar = $arResult['CHAT']['avatar'] == '/bitrix/js/im/images/blank.gif' ? '' : $arResult['CHAT']['avatar'];
             }
         }
         echo CUtil::PhpToJsObject(array('AVATAR' => $avatar, 'ERROR' => $errorMessage));
     } else {
         if ($_POST['IM_SETTING_SAVE'] == 'Y') {
             $errorMessage = "";
             $arSettings = CUtil::JsObjectToPhp($_POST['SETTINGS']);
             CIMSettings::SetSetting(CIMSettings::SETTINGS, $arSettings);
             echo CUtil::PhpToJsObject(array('ERROR' => $errorMessage));
         } else {
             if ($_POST['IM_SETTINGS_SAVE'] == 'Y') {
                 $errorMessage = "";
示例#10
0
	public static function UploadFileFromDisk($chatId, $files)
	{
		if (intval($chatId) <= 0)
			return false;

		$chatRelation = CIMChat::GetRelationById($chatId);
		if (!$chatRelation[self::GetUserId()])
			return false;

		$result['FILES'] = Array();
		$messageFileId = Array();
		foreach ($files as $fileId)
		{
			$newFile = self::SaveFromLocalDisk($chatId, substr($fileId, 4));
			if ($newFile)
			{
				$result['FILES'][$fileId] = self::GetFileParams($chatId, $newFile);
				$messageFileId[] = $newFile->getId();
			}
			else
			{
				$result['FILES'][$fileId]['id'] = 0;
			}
		}
		if (empty($messageFileId))
		{
			return false;
		}

		$result['MESSAGE_ID'] = 0;
		$arChat = CIMChat::GetChatData(Array('ID' => $chatId));
		$ar = Array(
			"TO_CHAT_ID" => $chatId,
			"FROM_USER_ID" => self::GetUserId(),
			"MESSAGE_TYPE" => $arChat['chat'][$chatId]['type'] == IM_MESSAGE_PRIVATE? IM_MESSAGE_PRIVATE: IM_MESSAGE_GROUP,
			"PARAMS" => Array(
				'FILE_ID' => $messageFileId
			)
		);
		$messageId = CIMMessage::Add($ar);
		if ($messageId)
		{
			$result['MESSAGE_ID'] = $messageId;
		}

		return $result;
	}
示例#11
0
 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');
     $bIntranetEnable = false;
     $arGroupStatus = CUserOptions::GetOption('IM', 'groupStatus');
     if (IsModuleInstalled('intranet') && 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);
                     }
                 }
             }
             $arGroups['other'] = array('id' => 'other', 'status' => isset($arGroupStatus['other']) && $arGroupStatus['other'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_OTHER'));
         }
     } else {
         $arGroups['other'] = array('id' => 'other', 'status' => isset($arGroupStatus['other']) && $arGroupStatus['other'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_OTHER_2'));
     }
     $arGroups['chat'] = array('id' => 'chat', 'status' => isset($arGroupStatus['chat']) && $arGroupStatus['chat'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_CHATS'));
     $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 ($USER->GetID() != $ar["USER_ID"]) {
                         $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'] = $USER->GetID() . "|" . implode('|', $arExtranetUsers);
         }
         $arWoGroups['extranet'] = array('id' => 'extranet', 'status' => isset($arGroupStatus['extranet']) && $arGroupStatus['extranet'] == 'open' ? 'open' : 'close', 'name' => GetMessage('IM_CL_GROUP_EXTRANET'));
     }
     if ($bLoadUsers) {
         if ($bFriendEnable) {
             if (!$bIntranetEnable) {
                 $arFilter['ID'] = $USER->GetID();
                 if (!empty($arFriendUsers)) {
                     $arFilter['ID'] .= "|" . implode('|', $arFriendUsers);
                 }
                 if (!empty($arExtranetUsers)) {
                     $arFilter['ID'] .= "|" . implode('|', $arExtranetUsers);
                 }
             }
         }
         $bCLCacheEnable = false;
         if ($bIntranetEnable && !$bFriendEnable) {
             $bCLCacheEnable = true;
         }
         if ($bCLCacheEnable && CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser()) {
             $bCLCacheEnable = false;
         }
         $bVoximplantEnable = IsModuleInstalled('voximplant');
         $nameTemplate = self::GetUserNameTemplate(SITE_ID);
         $nameTemplateSite = CSite::GetNameFormat(false);
         $cache_id = 'im_contact_list_' . $nameTemplate . '_' . $nameTemplateSite . (!empty($arExtranetUsers) ? '_' . $USER->GetID() : '') . $bVoximplantEnable . '_v4';
         $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);
         } else {
             $arExtParams = array('FIELDS' => array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "PERSONAL_PHOTO", "PERSONAL_BIRTHDAY", "PERSONAL_GENDER", "WORK_POSITION"));
             if ($bIntranetEnable) {
                 $arExtParams['SELECT'][] = 'UF_DEPARTMENT';
             }
             if ($bVoximplantEnable) {
                 $arExtParams['SELECT'][] = 'UF_VI_PHONE';
             }
             $dbUsers = CUser::GetList($sort_by = array('last_name' => 'asc'), $dummy = '', $arFilter, $arExtParams);
             while ($arUser = $dbUsers->GetNext(true, false)) {
                 $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 {
                     $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) {
                     $arFileTmp = CFile::ResizeImageGet($arUser["PERSONAL_PHOTO"], array('width' => 58, 'height' => 58), BX_RESIZE_IMAGE_EXACT, false, false, true);
                     $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'], '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), '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($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));
                 }
             }
         }
         $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;
         }
         //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) {
         $cache_id = 'im_contact_list_chats_' . $USER->GetID() . '_v1';
         $obCLCache = new CPHPCache();
         $cache_dir = '/bx/imc/chats';
         $arUsersToGroup = array();
         $arUserInGroupStructure = array();
         if ($obCLCache->InitCache($ttl, $cache_id, $cache_dir)) {
             $tmpVal = $obCLCache->GetVars();
             $arChats = $tmpVal['CHATS'];
             unset($tmpVal);
         } else {
             $chats = CIMChat::GetChatData(array('ONLY_CHAT' => 'Y', 'GET_USER_CHATS' => 'Y', 'USER_ID' => $USER->GetID()));
             $arChats = $chats['chat'];
             if ($obCLCache->StartDataCache()) {
                 $obCLCache->EndDataCache(array('CHATS' => $arChats));
             }
         }
     }
     $arContactList = array('users' => $arUsers, 'groups' => $arGroups, 'chats' => $arChats, 'woGroups' => $arWoGroups, 'userInGroup' => $arUserInGroup, 'woUserInGroup' => $arWoUserInGroup);
     foreach (GetModuleEvents("im", "OnAfterContactListGetList", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array(&$arContactList));
     }
     return $arContactList;
 }