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

	$bLoadUnreadMessage = isset($arParams['LOAD_UNREAD_MESSAGE']) && $arParams['LOAD_UNREAD_MESSAGE'] == 'Y'? true: false;
	$bTimeZone = isset($arParams['USE_TIME_ZONE']) && $arParams['USE_TIME_ZONE'] == 'N'? false: true;
	$bSmiles = isset($arParams['USE_SMILES']) && $arParams['USE_SMILES'] == 'N'? false: true;
	$userId = isset($arParams['USER_ID'])? $arParams['USER_ID']: $USER->GetId();
	if ($userId <= 0)
	{
		return false;
	}

	$arRecent = Array();
	$arUsers = Array();

	$generalChatId = CIMChat::GetGeneralChatId();

	$isOperator = BitrixImIntegrationImopenlinesUser::isOperator();

	if (!$bTimeZone)
		CTimeZone::Disable();

	$strSql = "
		SELECT
			R.ITEM_TYPE, R.ITEM_ID, R.PINNED,
			R.ITEM_MID M_ID, M.AUTHOR_ID M_AUTHOR_ID, M.ID M_ID, M.CHAT_ID M_CHAT_ID, M.MESSAGE M_MESSAGE, ".$DB->DatetimeToTimestampFunction('R.DATE_UPDATE')." M_DATE_CREATE,
			C.TITLE C_TITLE, C.AUTHOR_ID C_OWNER_ID, C.ENTITY_TYPE CHAT_ENTITY_TYPE, C.ENTITY_ID CHAT_ENTITY_ID, C.ENTITY_DATA_1 CHAT_ENTITY_DATA_1, C.ENTITY_DATA_2 CHAT_ENTITY_DATA_2, C.ENTITY_DATA_3 CHAT_ENTITY_DATA_3, C.AVATAR C_AVATAR, C.CALL_NUMBER C_CALL_NUMBER, C.EXTRANET CHAT_EXTRANET, C.COLOR CHAT_COLOR, C.TYPE CHAT_TYPE,
			U.LOGIN, U.NAME, U.LAST_NAME, U.PERSONAL_PHOTO, U.SECOND_NAME, ".$DB->DatetimeToTimestampFunction('U.PERSONAL_BIRTHDAY')." PERSONAL_BIRTHDAY, ".$DB->DatetimeToTimestampFunction('U.LAST_ACTIVITY_DATE')." LAST_ACTIVITY_DATE, U.PERSONAL_GENDER, U.EXTERNAL_AUTH_ID, U.WORK_POSITION, U.TIME_ZONE_OFFSET, U.ACTIVE,
			ST.COLOR, ST.STATUS, ".$DB->DatetimeToTimestampFunction('ST.IDLE')." IDLE, ".$DB->DatetimeToTimestampFunction('ST.MOBILE_LAST_DATE')." MOBILE_LAST_DATE, ".$DB->DatetimeToTimestampFunction('ST.DESKTOP_LAST_DATE')." DESKTOP_LAST_DATE,
			C1.USER_ID RID, C1.NOTIFY_BLOCK RELATION_NOTIFY_BLOCK, C1.USER_ID RELATION_USER_ID
			".($isOperator? ", S.ID LINES_ID, S.STATUS LINES_STATUS": "")."
		FROM
		b_im_recent R
		LEFT JOIN b_user U ON R.ITEM_TYPE = '".IM_MESSAGE_PRIVATE."' AND R.ITEM_ID = U.ID
		LEFT JOIN b_im_status ST ON R.ITEM_TYPE = '".IM_MESSAGE_PRIVATE."' AND R.ITEM_ID = ST.USER_ID
		LEFT JOIN b_im_chat C ON R.ITEM_TYPE != '".IM_MESSAGE_PRIVATE."' AND R.ITEM_ID = C.ID
		LEFT JOIN b_im_message M ON R.ITEM_MID = M.ID
		LEFT JOIN b_im_relation C1 ON C1.CHAT_ID = C.ID AND C1.USER_ID = ".$userId."
		".($isOperator? "LEFT JOIN b_imopenlines_session S ON R.ITEM_OLID > 0 AND S.ID = R.ITEM_OLID": "")."
		WHERE R.USER_ID = ".$userId;
	if (!$bTimeZone)
		CTimeZone::Enable();

	$enableOpenChat = CIMMessenger::CheckEnableOpenChat();
	$bots = BitrixImBot::getListCache();

	$arMessageId = Array();

	$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $counters = (new IMV2MessageCounterService($userId))->getForEachChat(); while ($arRes = $dbRes->GetNext(true, false)) { $arRes['ITEM_TYPE'] = trim($arRes['ITEM_TYPE']); $arRes['CHAT_TYPE'] = trim($arRes['CHAT_TYPE']); $arRes['CHAT_EXTRANET'] = trim($arRes['CHAT_EXTRANET']); if ($arRes['ITEM_TYPE'] == IM_MESSAGE_OPEN) { if (!$enableOpenChat) { continue; } else if (intval($arRes['RID']) <= 0 && IMUser::getInstance($userId)->isExtranet()) { continue; } } else if ($arRes['ITEM_TYPE'] == IM_MESSAGE_CHAT || $arRes['ITEM_TYPE'] == IM_MESSAGE_OPEN_LINE) { if (intval($arRes['RID']) <= 0) { continue; } } $arMessageId[] = $arRes['M_ID']; if ($arRes['M_ID'] > 0 && $arRes['M_DATE_CREATE']+2592000 < time()) { continue; } $itemId = $arRes['ITEM_ID']; $item = Array( 'TYPE' => $arRes['ITEM_TYPE'], 'MESSAGE' => Array( 'id' => $arRes['M_ID'], 'chatId' => $arRes['M_CHAT_ID'], 'senderId' => $arRes['M_AUTHOR_ID'], 'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['M_DATE_CREATE']), 'text' => BitrixImText::parse($arRes['M_MESSAGE'], Array('CUT_STRIKE' => 'Y', 'SMILES' => 'N', 'SAFE' => 'N')), 'pinned' => $arRes['PINNED'] == 'Y', ), 'COUNTER' => $counters[(int)$arRes['M_CHAT_ID']], ); $item['MESSAGE']['text'] = preg_replace('#-{54}.+?-{54}#s', " [".GetMessage('IM_QUOTE')."] ", strip_tags(str_replace(array("
","
","
", "#BR#"), Array(" "," ", " ", " "), $item['MESSAGE']['text']), "")); if ($arRes['ITEM_TYPE'] == IM_MESSAGE_PRIVATE) { $arUsers[] = $arRes['ITEM_ID']; $arRes['PERSONAL_BIRTHDAY'] = $arRes['PERSONAL_BIRTHDAY']? BitrixMainTypeDateTime::createFromTimestamp($arRes['PERSONAL_BIRTHDAY'])->format('d-m'): false; $arRes['LAST_ACTIVITY_DATE'] = $arRes['LAST_ACTIVITY_DATE']? BitrixMainTypeDateTime::createFromTimestamp($arRes['LAST_ACTIVITY_DATE']): false; $arRes = CIMStatus::prepareLastDate($arRes); $userExternalAuthId = $arRes['EXTERNAL_AUTH_ID']? $arRes['EXTERNAL_AUTH_ID']: 'default'; if ( $userExternalAuthId == BitrixImBot::EXTERNAL_AUTH_ID && $bots[$arRes["ITEM_ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK && ( $bots[$arRes["ITEM_ID"]]['CLASS'] == BitrixImBotBotSupport24::class || $bots[$arRes["ITEM_ID"]]['CLASS'] == BitrixImBotBotPartner24::class || $bots[$arRes["ITEM_ID"]]['CLASS'] == BitrixImBotBotSaleSupport24::class ) ) { $userExternalAuthId = 'support24'; } $item['USER'] = Array( 'id' => $arRes['ITEM_ID'], 'name' => BitrixImUser::formatFullNameFromDatabase($arRes), 'active' => $arRes['ACTIVE'] == 'Y', 'first_name' => BitrixImUser::formatNameFromDatabase($arRes), 'last_name' => $arRes['LAST_NAME'], 'work_position' => $arRes['WORK_POSITION'], 'color' => self::GetUserColor($arRes["ID"], $arRes['PERSONAL_GENDER'] == 'M'? 'M': 'F'), 'avatar' => CIMChat::GetAvatarImage($arRes["PERSONAL_PHOTO"]), 'birthday' => $arRes['PERSONAL_BIRTHDAY'], 'gender' => $arRes['PERSONAL_GENDER'] == 'F'? 'F': 'M', 'extranet' => false, 'network' => $arRes['EXTERNAL_AUTH_ID'] == self::NETWORK_AUTH_ID || $arRes['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID && $bots[$arRes["ITEM_ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK, 'bot' => $arRes['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID, 'tz_offset' => intval($arRes['TIME_ZONE_OFFSET']), 'phone_device' => false, 'profile' => CIMContactList::GetUserPath($arRes["ITEM_ID"]), 'external_auth_id' => $userExternalAuthId, 'status' => $arRes['STATUS'], 'idle' => $arRes['IDLE'], 'last_activity_date' => $arRes['LAST_ACTIVITY_DATE'], 'mobile_last_date' => $arRes['MOBILE_LAST_DATE'], 'desktop_last_date' => $arRes['DESKTOP_LAST_DATE'], 'absent' => self::formatAbsentResult($arRes["ITEM_ID"]), ); if (!$item['MESSAGE']['text']) { $item['MESSAGE']['text'] = $arRes['WORK_POSITION']; } } else { $chatType = BitrixImChat::getType($arRes); if ($arRes["CHAT_ENTITY_TYPE"] == 'LINES') { if ($isOperator) { $item['LINES'] = Array( 'ID' => $arRes['LINES_ID'], 'STATUS' => $arRes['LINES_STATUS'] ); } } else if ($generalChatId == $arRes['M_CHAT_ID']) { $arRes["CHAT_ENTITY_TYPE"] = 'GENERAL'; } $muteList = Array(); if ($arRes['RELATION_NOTIFY_BLOCK'] == 'Y') { $muteList = Array($arRes['RELATION_USER_ID'] => true); } $itemId = 'chat'.$itemId; $item['CHAT'] = Array( 'id' => $arRes['ITEM_ID'], 'name' => BitrixImText::decodeEmoji($arRes["C_TITLE"]), 'color' => $arRes["CHAT_COLOR"] == ""? IMColor::getColorByNumber($arRes['ITEM_ID']): IMColor::getColor($arRes['CHAT_COLOR']), 'avatar' => CIMChat::GetAvatarImage($arRes["C_AVATAR"]), 'extranet' => $arRes["CHAT_EXTRANET"] == ""? "": ($arRes["CHAT_EXTRANET"] == "Y"? true: false), 'owner' => $arRes["C_OWNER_ID"], 'type' => $chatType, 'entity_type' => $arRes["CHAT_ENTITY_TYPE"], 'entity_id' => $arRes["CHAT_ENTITY_ID"], 'entity_data_1' => trim($arRes["CHAT_ENTITY_DATA_1"]), 'entity_data_2' => trim($arRes["CHAT_ENTITY_DATA_2"]), 'entity_data_3' => trim($arRes["CHAT_ENTITY_DATA_3"]), 'mute_list' => $muteList, 'message_type' => $arRes['CHAT_TYPE'], 'call_number' => $arRes["C_CALL_NUMBER"] ); } $arRecent[$itemId] = $item; } $params = CIMMessageParam::Get($arMessageId); foreach ($arRecent as $key => $value) { if (isset($params[$value['MESSAGE']['id']]) && is_array($params[$value['MESSAGE']['id']]['FILE_ID'])) { if (count($params[$value['MESSAGE']['id']]['FILE_ID']) > 0 && trim($arRecent[$key]['MESSAGE']['text']) == '') { $arRecent[$key]['MESSAGE']['text'] = "[".GetMessage('IM_FILE')."]"; } } $arRecent[$key]['MESSAGE']['params'] = $params[$value['MESSAGE']['id']]; } $bIntranetEnable = IsModuleInstalled('intranet'); $bVoximplantEnable = IsModuleInstalled('voximplant'); if ($bIntranetEnable || $bVoximplantEnable) { $arUserPhone = Array(); $arUserDepartment = Array(); $arSelectParams = Array(); if ($bIntranetEnable) $arSelectParams[] = 'UF_DEPARTMENT'; if ($bVoximplantEnable) $arSelectParams[] = 'UF_VI_PHONE'; $dbUsers = CUser::GetList(['last_name'=>'asc'], '', Array('ID' => $userId."|".implode('|', $arUsers)), Array('FIELDS' => Array("ID"), 'SELECT' => $arSelectParams)); while ($arUser = $dbUsers->GetNext(true, false)) { $arUserPhone[$arUser['ID']] = $arUser['UF_VI_PHONE'] == 'Y'; $arUserDepartment[$arUser['ID']] = self::IsExtranet($arUser); } foreach ($arRecent as $key => $value) { if (isset($value['USER'])) { $arRecent[$key]['USER']['extranet'] = $arUserDepartment[$value['USER']['id']]; $arRecent[$key]['USER']['phone_device'] = $arUserPhone[$value['USER']['id']]; } } } if ($bLoadUnreadMessage) { $CIMMessage = new CIMMessage(false, Array( 'HIDE_LINK' => 'Y' )); $ar = $CIMMessage->GetUnreadMessage(Array( 'LOAD_DEPARTMENT' => 'N', 'ORDER' => 'ASC', 'GROUP_BY_CHAT' => 'Y', 'USE_TIME_ZONE' => $bTimeZone? 'Y': 'N', 'USE_SMILES' => $bSmiles? 'Y': 'N' )); foreach ($ar['message'] as $data) { if (!isset($arRecent[$data['senderId']])) { $arRecent[$data['senderId']] = Array( 'TYPE' => IM_MESSAGE_PRIVATE, 'USER' => $ar['users'][$data['senderId']] ); } $arRecent[$data['senderId']]['MESSAGE'] = Array( 'id' => $data['id'], 'senderId' => $data['senderId'], 'date' => $data['date'], 'text' => preg_replace('#-{54}.+?-{54}#s', " [".GetMessage('IM_QUOTE')."] ", strip_tags(str_replace(array("
","
","
", "#BR#"), Array(" ", " ", " ", " "), $data['text']), "")) ); $arRecent[$data['senderId']]['COUNTER'] = $data['counter']; } $CIMChat = new CIMChat(false, Array( 'HIDE_LINK' => 'Y' )); $ar = $CIMChat->GetUnreadMessage(Array( 'ORDER' => 'ASC', 'GROUP_BY_CHAT' => 'Y', 'USER_LOAD' => 'N', 'FILE_LOAD' => 'N', 'USE_SMILES' => $bSmiles? 'Y': 'N', 'USE_TIME_ZONE' => $bTimeZone? 'Y': 'N' )); foreach ($ar['message'] as $data) { if (!isset($arRecent['chat'.$data['recipientId']])) { $arRecent['chat'.$data['recipientId']] = Array( 'TYPE' => $ar['messageType']? $ar['messageType']: IM_MESSAGE_CHAT, 'CHAT' => $ar['chat'] ); } $arRecent['chat'.$data['recipientId']]['MESSAGE'] = Array( 'id' => $data['id'], 'senderId' => $data['senderId'], 'date' => $data['date'], 'text' => $data['text'] ); $arRecent['chat'.$data['recipientId']]['COUNTER'] = $data['counter']; } } if (!empty($arRecent)) { sortByColumn( $arRecent, array( 'COUNTER' => array(SORT_NUMERIC, SORT_DESC), 'MESSAGE' => array(SORT_NUMERIC, SORT_DESC) ), array( 'COUNTER' => array(__CLASS__, 'GetRecentListSortCounter'), 'MESSAGE' => array(__CLASS__, 'GetRecentListSortMessage'), ), null, true ); } return $arRecent; }