• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/recent.php
  • Класс: BitrixImRecent
  • Вызов: Recent::formatRow
static function formatRow($row, $options = []): ?array
{
	$generalChatId = (int)$options['GENERAL_CHAT_ID'];
	$withoutCommonUsers = isset($options['WITHOUT_COMMON_USERS']) && $options['WITHOUT_COMMON_USERS'] === true;
	$shortInfo = isset($options['SHORT_INFO']) && $options['SHORT_INFO'];

	$chatOwner = $row['CHAT_OWNER'] ?? null;

	$isUser = $row['ITEM_TYPE'] == IM_MESSAGE_PRIVATE;
	$id = $isUser? (int)$row['ITEM_ID']: 'chat'.$row['ITEM_ID'];
	$row['MESSAGE_ID'] ??= null;

	if (!$isUser && ((!$row['MESSAGE_ID'] && !$shortInfo) || !$row['RELATION_USER_ID'] || !$row['CHAT_ID']))
	{
		return null;
	}

	if ($row['ITEM_MID'] > 0 && $row['MESSAGE_ID'] > 0)
	{
		$attach = false;
		if ($row['MESSAGE_ATTACH'] || $row["MESSAGE_ATTACH_JSON"])
		{
			if (preg_match('/^(d+)$/', $row['MESSAGE_ATTACH']))
			{
				$attach = true;
			}
			else if ($row['MESSAGE_ATTACH'] === CIMMessageParamAttach::FIRST_MESSAGE)
			{
				try
				{
					$value = BitrixMainWebJson::decode($row["MESSAGE_ATTACH_JSON"]);
					$attachRestored = CIMMessageParamAttach::PrepareAttach($value);
					$attach = $attachRestored['DESCRIPTION'];
				}
				catch (BitrixMainSystemException $e)
				{
					$attach = true;
				}
			}
			else if (!empty($row['MESSAGE_ATTACH']))
			{
				$attach = $row['MESSAGE_ATTACH'];
			}
			else
			{
				$attach = true;
			}
		}

		$text = $row['MESSAGE_TEXT'] ?? '';

		$getOriginalTextOption = $options['GET_ORIGINAL_TEXT'] ?? null;
		if ($getOriginalTextOption === 'Y')
		{
			$text = Text::populateUserBbCode($text);
		}
		else
		{
			$text = Text::removeBbCodes(
				str_replace("n", " ", $text),
				$row['MESSAGE_FILE'] > 0,
				$attach
			);
		}

		$message = [
			'ID' => (int)$row['ITEM_MID'],
			'TEXT' => $text,
			'FILE' => $row['MESSAGE_FILE'],
			'AUTHOR_ID' =>  (int)$row['MESSAGE_AUTHOR_ID'],
			'ATTACH' => $attach,
			'DATE' => $row['MESSAGE_DATE']?: $row['DATE_UPDATE'],
			'STATUS' => $row['CHAT_LAST_MESSAGE_STATUS'],
			'UUID' => $row['MESSAGE_UUID_VALUE'],
		];
	}
	else
	{
		$row['MESSAGE_DATE'] ??= null;
		$message = [
			'ID' => 0,
			'TEXT' => "",
			'FILE' => false,
			'AUTHOR_ID' =>  0,
			'ATTACH' => false,
			'DATE' => $row['MESSAGE_DATE']?: $row['DATE_UPDATE'],
			'STATUS' => $row['CHAT_LAST_MESSAGE_STATUS'],
		];
	}

	$item = [
		'ID' => $id,
		'CHAT_ID' => (int)$row['CHAT_ID'],
		'TYPE' => $isUser ? 'user' : 'chat',
		'AVATAR' => [],
		'TITLE' => [],
		'MESSAGE' => $message,
		'COUNTER' => (int)$row['COUNTER'],
		'PINNED' => $row['PINNED'] === 'Y',
		'UNREAD' => $row['UNREAD'] === 'Y',
		'HAS_REMINDER' => isset($row['HAS_REMINDER']) && $row['HAS_REMINDER'] === 'Y',
		'DATE_UPDATE' => $row['DATE_UPDATE']
	];

	if ($isUser)
	{
		if (
			$withoutCommonUsers
			&& ($row['USER_ID'] == 0 || $row['MESSAGE_CODE'] === 'USER_JOIN')
		)
		{
			return null;
		}

		$row['INVITATION_ORIGINATOR_ID'] ??= null;
		if (!$row['USER_LAST_ACTIVITY_DATE'] && $row['INVITATION_ORIGINATOR_ID'])
		{
			$item['INVITED'] = [
				'ORIGINATOR_ID' => (int)$row['INVITATION_ORIGINATOR_ID'],
				'CAN_RESEND' => !empty($row['USER_EMAIL'])
			];
		}
		$item['USER'] = [
			'ID' => (int)$row['ITEM_ID'],
		];
	}
	else
	{
		$avatar = CIMChat::GetAvatarImage($row['CHAT_AVATAR'], 200, false);
		$color = $row['CHAT_COLOR'] <> ''
			? Color::getColor($row['CHAT_COLOR'])
			: Color::getColorByNumber(
				$row['ITEM_ID']
			);
		$chatType = BitrixImChat::getType($row);

		if ($generalChatId == $row['ITEM_ID'])
		{
			$row["CHAT_ENTITY_TYPE"] = 'GENERAL';
		}

		$muteList = [];
		if ($row['RELATION_NOTIFY_BLOCK'] == 'Y')
		{
			$muteList = [$row['RELATION_USER_ID'] => true];
		}

		$managerList = [];
		if (
			$chatOwner == $row['RELATION_USER_ID']
			|| $row['RELATION_IS_MANAGER'] == 'Y'
		)
		{
			$managerList = [(int)$row['RELATION_USER_ID']];
		}

		if ($row['RELATION_NOTIFY_BLOCK'] == 'Y')
		{
			$muteList = [$row['RELATION_USER_ID'] => true];
		}

		$chatOptions = CIMChat::GetChatOptions();
		$restrictions = $chatOptions['DEFAULT'];
		if ($row['CHAT_ENTITY_TYPE'] && array_key_exists($row['CHAT_ENTITY_TYPE'], $chatOptions))
		{
			$restrictions = $chatOptions[$row['CHAT_ENTITY_TYPE']];
		}

		$item['AVATAR'] = [
			'URL' => $avatar,
			'COLOR' => $color
		];
		$item['TITLE'] = $row['CHAT_TITLE'];
		$item['CHAT'] = [
			'ID' => (int)$row['ITEM_CID'],
			'NAME' => $row['CHAT_TITLE'],
			'OWNER' => (int)$row['CHAT_AUTHOR_ID'],
			'EXTRANET' => $row['CHAT_EXTRANET'] == 'Y',
			'AVATAR' => $avatar,
			'COLOR' => $color,
			'TYPE' => $chatType,
			'ENTITY_TYPE' => (string)$row['CHAT_ENTITY_TYPE'],
			'ENTITY_ID' => (string)$row['CHAT_ENTITY_ID'],
			'ENTITY_DATA_1' => (string)$row['CHAT_ENTITY_DATA_1'],
			'ENTITY_DATA_2' => (string)$row['CHAT_ENTITY_DATA_2'],
			'ENTITY_DATA_3' => (string)$row['CHAT_ENTITY_DATA_3'],
			'MUTE_LIST' => $muteList,
			'MANAGER_LIST' => $managerList,
			'DATE_CREATE' => $row['CHAT_DATE_CREATE'],
			'MESSAGE_TYPE' => $row["CHAT_TYPE"],
			'USER_COUNTER' => (int)$row['CHAT_USER_COUNT'],
			'RESTRICTIONS' => $restrictions,
			'ROLE' => self::getRole($row),
			'MANAGE_USERS' => $row['CHAT_MANAGE_USERS'] ?? null,
			'MANAGE_UI' => $row['CHAT_MANAGE_UI'] ?? null,
			'MANAGE_SETTINGS' => $row['CHAT_MANAGE_SETTINGS'] ?? null,
			'CAN_POST' => $row['CHAT_CAN_POST'] ?? null,
		];
		if ($row["CHAT_ENTITY_TYPE"] == 'LINES')
		{
			$item['LINES'] = [
				'ID' => (int)$row['LINES_ID'],
				'STATUS' => (int)$row['LINES_STATUS'],
				'DATE_CREATE' => $row['LINES_DATE_CREATE'] ?? $row['DATE_UPDATE'],
			];
		}
		$item['USER'] = [
			'ID' => (int)($row['MESSAGE_AUTHOR_ID'] ?? 0),
		];
	}

	if ($item['USER']['ID'] > 0)
	{
		$user = User::getInstance($item['USER']['ID'])->getArray(['SKIP_ONLINE' => 'Y']);
		if (!$user)
		{
			$user = ['ID' => 0];
		}
		else if ($item['TYPE'] == 'user')
		{
			if (
				(!$user['ACTIVE'] && $item['COUNTER'] <= 0)
				&& !$user['BOT']
				&& !$user['CONNECTOR']
				&& !$user['NETWORK']
			)
			{
				return null;
			}

			$item['AVATAR'] = [
				'URL' => $user['AVATAR'],
				'COLOR' => $user['COLOR']
			];

			$item['TITLE'] = $user['NAME'];

			$row['USER_LAST_ACTIVITY_DATE'] ??= null;
			$row['USER_DESKTOP_LAST_DATE'] ??= null;
			$row['USER_MOBILE_LAST_DATE'] ??= null;
			$row['USER_IDLE'] ??= null;

			$user['LAST_ACTIVITY_DATE'] = $row['USER_LAST_ACTIVITY_DATE']?: false;
			$user['DESKTOP_LAST_DATE'] = $row['USER_DESKTOP_LAST_DATE']?: false;
			$user['MOBILE_LAST_DATE'] = $row['USER_MOBILE_LAST_DATE']?: false;
			$user['IDLE'] = $row['USER_IDLE']?: false;
		}
		else
		{
			$row['MESSAGE_USER_LAST_ACTIVITY_DATE'] ??= null;
			$row['MESSAGE_USER_DESKTOP_LAST_DATE'] ??= null;
			$row['MESSAGE_USER_MOBILE_LAST_DATE'] ??= null;
			$row['MESSAGE_USER_IDLE'] ??= null;

			$user['LAST_ACTIVITY_DATE'] = $row['MESSAGE_USER_LAST_ACTIVITY_DATE']?: false;
			$user['DESKTOP_LAST_DATE'] = $row['MESSAGE_USER_DESKTOP_LAST_DATE']?: false;
			$user['MOBILE_LAST_DATE'] = $row['MESSAGE_USER_MOBILE_LAST_DATE']?: false;
			$user['IDLE'] = $row['MESSAGE_USER_IDLE']?: false;
		}

		$item['USER'] = $user;
	}

	$item['OPTIONS'] = [];
	if ($row['USER_ID'] == 0 || $row['MESSAGE_CODE'] === 'USER_JOIN')
	{
		$item['OPTIONS']['DEFAULT_USER_RECORD'] = true;
	}

	return $item;
}