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