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;
}