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

	$arParams['PHOTO_SIZE'] = isset($arParams['PHOTO_SIZE'])? intval($arParams['PHOTO_SIZE']): 200;

	$from = "
		FROM b_im_relation R1
		INNER JOIN b_im_chat C ON C.ID = R1.CHAT_ID
	";

	if (isset($arParams['SKIP_PRIVATE']) && $arParams['SKIP_PRIVATE'] == 'Y')
	{
		$from .= " AND C.TYPE IN ('".IM_MESSAGE_OPEN."','".IM_MESSAGE_CHAT."','".IM_MESSAGE_OPEN_LINE."')";
	}

	$innerJoin = $whereUser = "";
	if (isset($arParams['GET_LIST']) && $arParams['GET_LIST'] == 'Y')
	{
		if (!isset($arParams['USER_ID']))
			return false;

		$innerJoin = "INNER JOIN b_im_relation R2 ON R2.CHAT_ID = C.ID";
		$whereGeneral = "WHERE R2.USER_ID = ".intval($arParams['USER_ID']);
	}
	else
	{
		$arFilter = Array();
		if (isset($arParams['ID']) && is_array($arParams['ID']))
		{
			foreach ($arParams['ID'] as $key => $value)
				$arFilter['ID'][$key] = intval($value);
		}
		else if (isset($arParams['ID']) && intval($arParams['ID']) > 0)
		{
			$arFilter['ID'][] = intval($arParams['ID']);
		}

		if (empty($arFilter['ID']))
		{
			return false;
		}

		if (isset($arParams['USER_ID']))
		{
			$innerJoin = "LEFT JOIN b_im_relation R2 ON R2.CHAT_ID = C.ID AND R2.USER_ID = ".intval($arParams['USER_ID']);
		}
		$whereGeneral = "WHERE R1.CHAT_ID IN (".implode(',', $arFilter['ID']).") ";
	}

	$connection = BitrixMainApplication::getConnection();
	$helper = $connection->getSqlHelper();
	$strSql = "
		SELECT
			C.ID CHAT_ID,
			C.TITLE CHAT_TITLE,
			C.CALL_TYPE CHAT_CALL_TYPE,
			C.AUTHOR_ID CHAT_OWNER_ID,
			C.CALL_NUMBER CHAT_CALL_NUMBER,
			C.EXTRANET CHAT_EXTRANET,
			C.COLOR CHAT_COLOR,
			C.TYPE CHAT_TYPE,
			C.AVATAR,
			C.ENTITY_TYPE,
			C.ENTITY_DATA_1 ENTITY_DATA_1,
			C.ENTITY_DATA_2 ENTITY_DATA_2,
			C.ENTITY_DATA_3 ENTITY_DATA_3,
			C.MANAGE_USERS,
			C.MANAGE_UI,
			C.MANAGE_SETTINGS,
			C.CAN_POST,
			A.ALIAS ALIAS_NAME,
			".$DB->DatetimeToTimestampFunction('C.DATE_CREATE')." CHAT_DATE_CREATE,
			C.ENTITY_ID,
			R1.NOTIFY_BLOCK RELATION_NOTIFY_BLOCK,
			R1.USER_ID RELATION_USER_ID,
			R1.CALL_STATUS,
			R1.MANAGER RELATION_MANAGER
			".(isset($arParams['USER_ID'])? ", R2.ID RID": "")."
		".$from."
		".$innerJoin."
		LEFT JOIN b_im_alias A ON A.ENTITY_ID = " . $helper->castToChar("C.ID") . " AND A.ENTITY_TYPE = C.ENTITY_TYPE
		".$whereGeneral."
	";

	$arChat = Array();
	$arLines = Array();
	$arUserInChat = Array();
	$arUserCallStatus = Array();
	$arUserChatBlockStatus = Array();
	$arManagerList = Array();
	$enableOpenChat = CIMMessenger::CheckEnableOpenChat();
	$generalChatId = CIMChat::GetGeneralChatId();

	$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); while ($arRes = $dbRes->GetNext(true, false)) { $arRes['CHAT_TYPE'] = trim($arRes['CHAT_TYPE']); if (isset($arParams['USER_ID'])) { if ($arRes['CHAT_TYPE'] == IM_MESSAGE_OPEN) { if (!$enableOpenChat) { continue; } else if (intval($arRes['RID']) <= 0 && IMUser::getInstance($arParams['USER_ID'])->isExtranet()) { continue; } } else if (intval($arRes['RID']) <= 0) { continue; } } $arRes["RELATION_USER_ID"] = (int)$arRes["RELATION_USER_ID"]; if (!isset($arChat[$arRes["CHAT_ID"]])) { $avatar = '/bitrix/js/im/images/blank.gif'; if (intval($arRes["AVATAR"]) > 0) { $avatar = self::GetAvatarImage($arRes["AVATAR"], $arParams['PHOTO_SIZE']); } $chatType = BitrixImChat::getType($arRes); if ($arRes["ENTITY_TYPE"] == 'LINES') { $fieldData = explode("|", $arRes['ENTITY_DATA_1']); $arLines[$arRes["CHAT_ID"]] = $fieldData[5]; } else if ($generalChatId == $arRes['CHAT_ID']) { $arRes["ENTITY_TYPE"] = 'GENERAL'; } $publicOption = ''; if ($arRes['ALIAS_NAME']) { $publicOption = [ 'code' => $arRes['ALIAS_NAME'], 'link' => IMAlias::getPublicLink($arRes['ENTITY_TYPE'], $arRes['ALIAS_NAME']) ]; } $arChat[$arRes["CHAT_ID"]] = Array( 'id' => $arRes["CHAT_ID"], 'name' => BitrixImText::decodeEmoji($arRes["CHAT_TITLE"]), 'owner' => $arRes["CHAT_OWNER_ID"], 'color' => $arRes["CHAT_COLOR"] == ""? IMColor::getColorByNumber($arRes['CHAT_ID']): IMColor::getColor($arRes['CHAT_COLOR']), 'extranet' => $arRes["CHAT_EXTRANET"] == ""? "": ($arRes["CHAT_EXTRANET"] == "Y"? true: false), 'avatar' => $avatar, 'call' => trim($arRes["CHAT_CALL_TYPE"]), 'call_number' => trim($arRes["CHAT_CALL_NUMBER"]), 'entity_type' => trim($arRes["ENTITY_TYPE"]), 'entity_id' => trim($arRes["ENTITY_ID"]), 'entity_data_1' => trim($arRes["ENTITY_DATA_1"]), 'entity_data_2' => trim($arRes["ENTITY_DATA_2"]), 'entity_data_3' => trim($arRes["ENTITY_DATA_3"]), 'public' => $publicOption, 'mute_list' => array(), 'manager_list' => array(), 'date_create' => $arRes["CHAT_DATE_CREATE"]? BitrixMainTypeDateTime::createFromTimestamp($arRes["CHAT_DATE_CREATE"]): false, 'type' => $chatType, 'manage_users' => mb_strtolower($arRes['MANAGE_USERS']), 'manage_ui' => mb_strtolower($arRes['MANAGE_UI']), 'manage_settings' => mb_strtolower($arRes['MANAGE_SETTINGS']), 'can_post' => mb_strtolower($arRes['CAN_POST']), 'message_type' => $arRes["CHAT_TYPE"], ); } $arUserInChat[$arRes["CHAT_ID"]][] = $arRes["RELATION_USER_ID"]; $arUserChatBlockStatus[$arRes["CHAT_ID"]][$arRes["RELATION_USER_ID"]] = $arRes["RELATION_NOTIFY_BLOCK"] == 'Y'; $arUserCallStatus[$arRes["CHAT_ID"]][$arRes["RELATION_USER_ID"]] = trim($arRes["CALL_STATUS"]); $arChat[$arRes["CHAT_ID"]]['mute_list'] = $arUserChatBlockStatus[$arRes["CHAT_ID"]]; if ($arRes["RELATION_MANAGER"] == 'Y') { $arManagerList[$arRes["CHAT_ID"]][] = (int)$arRes["RELATION_USER_ID"]; } $arChat[$arRes["CHAT_ID"]]['manager_list'] = $arManagerList[$arRes["CHAT_ID"]] ?? null; } foreach ($arUserInChat as $chatId => $userIds) { $arUserInChat[$chatId] = array_values(array_unique($userIds)); } $lines = Array(); if (!empty($arLines) && CModule::IncludeModule('imopenlines')) { $orm = BitrixImopenlinesModelSessionTable::getList(Array( 'select' => Array('CHAT_ID', 'ID', 'STATUS', 'DATE_CREATE'), 'filter' => Array( '=ID' => array_values($arLines) ) )); while($row = $orm->fetch()) { $lines[$row['CHAT_ID']] = Array( 'id' => (int)$row['ID'], 'status' => (int)$row['STATUS'], 'date_create' => $row['DATE_CREATE'], ); } } $result = array( 'chat' => $arChat, 'lines' => $lines, 'userInChat' => $arUserInChat, 'userCallStatus' => $arUserCallStatus, 'userChatBlockStatus' => $arUserChatBlockStatus ); return $result; }