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