function GetLastMessage($toChatId, $fromUserId = false, $loadExtraData = false, $bTimeZone = true, $limit = true) { global $DB; $fromUserId = IntVal($fromUserId); if ($fromUserId <= 0) { $fromUserId = $this->user_id; } $toChatId = IntVal($toChatId); if ($toChatId <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_CHAT_ID"), "ERROR_TO_CHAT_ID"); return false; } $orm = IM\ChatTable::getById($toChatId); if (!($chatData = $orm->fetch())) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_CHAT_NOT_EXISTS"), "ERROR_CHAT_NOT_EXISTS"); return false; } if ($chatData['TYPE'] == IM_MESSAGE_OPEN && !CIMMessenger::CheckEnableOpenChat()) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_CHAT_NOT_EXISTS"), "ERROR_CHAT_NOT_EXISTS"); return false; } if ($limit) { $dbType = strtolower($DB->type); if ($dbType == "mysql") { $sqlLimit = " AND M.DATE_CREATE > DATE_SUB(NOW(), INTERVAL 30 DAY)"; } else { if ($dbType == "mssql") { $sqlLimit = " AND M.DATE_CREATE > dateadd(day, -30, getdate())"; } else { if ($dbType == "oracle") { $sqlLimit = " AND M.DATE_CREATE > SYSDATE-30"; } } } } $limitById = ''; $ar = \CIMChat::GetRelationById($toChatId, $fromUserId); if ($ar && $ar['START_ID'] > 0) { $limitById = 'AND M.ID >= ' . intval($ar['START_ID']); } if (!$bTimeZone) { CTimeZone::Disable(); } if ($chatData['TYPE'] == IM_MESSAGE_OPEN) { $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tM.ID,\n\t\t\t\t\tM.CHAT_ID,\n\t\t\t\t\tM.MESSAGE,\n\t\t\t\t\t" . $DB->DatetimeToTimestampFunction('M.DATE_CREATE') . " DATE_CREATE,\n\t\t\t\t\tM.AUTHOR_ID,\n\t\t\t\t\tC.TYPE CHAT_TYPE,\n\t\t\t\t\tR.USER_ID RID\n\t\t\t\tFROM b_im_message M\n\t\t\t\tINNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '" . IM_MESSAGE_OPEN . "'\n\t\t\t\tLEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = " . $fromUserId . "\n\t\t\t\tWHERE\n\t\t\t\t\tM.CHAT_ID = " . $toChatId . "\n\t\t\t\t\t" . $limitById . "\n\t\t\t\t\t#LIMIT#\n\t\t\t\tORDER BY M.DATE_CREATE DESC\n\t\t\t"; } else { $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tM.ID,\n\t\t\t\t\tM.CHAT_ID,\n\t\t\t\t\tM.MESSAGE,\n\t\t\t\t\t" . $DB->DatetimeToTimestampFunction('M.DATE_CREATE') . " DATE_CREATE,\n\t\t\t\t\tM.AUTHOR_ID,\n\t\t\t\t\tC.TYPE CHAT_TYPE,\n\t\t\t\t\tR1.USER_ID RID\n\t\t\t\tFROM b_im_message M\n\t\t\t\tINNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID\n\t\t\t\tINNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '" . IM_MESSAGE_CHAT . "'\n\t\t\t\tWHERE\n\t\t\t\t\tR1.CHAT_ID = " . $toChatId . " AND R1.USER_ID = " . $fromUserId . "\n\t\t\t\t\t" . $limitById . "\n\t\t\t\t\t#LIMIT#\n\t\t\t\tORDER BY M.DATE_CREATE DESC\n\t\t\t"; } $strSql = $DB->TopSql($strSql, 20); if (!$bTimeZone) { CTimeZone::Enable(); } //LEFT JOIN b_im_message_param MP on MP.MESSAGE_ID = M.ID and MP.PARAM_NAME = 'FOR_USER_ID' //and (MP.PARAM_VALUE is null or MP.PARAM_VALUE = '".$fromUserId."') if ($limit) { $dbRes = $DB->Query(str_replace("#LIMIT#", $sqlLimit, $strSql), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (!$dbRes->SelectedRowsCount()) { $dbRes = $DB->Query(str_replace("#LIMIT#", "", $strSql), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } } else { $dbRes = $DB->Query(str_replace("#LIMIT#", "", $strSql), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } CIMStatus::Set($fromUserId, array('IDLE' => null)); $chatType = $chatData['TYPE']; $chatRelationUserId = 0; $arMessages = array(); $arMessageId = array(); $arUsersMessage = array(); $CCTP = new CTextParser(); $CCTP->MaxStringLen = 200; $CCTP->allow = array("HTML" => "N", "ANCHOR" => $this->bHideLink ? "N" : "Y", "BIU" => "Y", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => $this->bHideLink ? "N" : "Y", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N"); while ($arRes = $dbRes->Fetch()) { $arRes['CHAT_TYPE'] = trim($arRes['CHAT_TYPE']); $chatType = $arRes['CHAT_TYPE']; $chatRelationUserId = intval($arRes['RID']); $arMessages[$arRes['ID']] = array('id' => $arRes['ID'], 'chatId' => $arRes['CHAT_ID'], 'senderId' => $arRes['AUTHOR_ID'], 'recipientId' => $arRes['CHAT_ID'], 'date' => $arRes['DATE_CREATE'], 'text' => $CCTP->convertText(htmlspecialcharsbx($arRes['MESSAGE']))); $arMessageId[] = $arRes['ID']; $arUsersMessage[$arRes['CHAT_ID']][] = $arRes['ID']; } if ($chatType == IM_MESSAGE_OPEN && $chatRelationUserId <= 0) { if (IM\User::getInstance($fromUserId)->isExtranet()) { $arMessages = array(); $arMessageId = array(); $arUsersMessage = array(); $loadExtraData = false; } else { if (CModule::IncludeModule('pull')) { CPullWatch::Add($fromUserId, 'IM_PUBLIC_' . $toChatId, true); } } } $params = CIMMessageParam::Get($arMessageId); $arFiles = array(); foreach ($params as $messageId => $param) { $arMessages[$messageId]['params'] = $param; if (isset($param['FILE_ID'])) { foreach ($param['FILE_ID'] as $fileId) { $arFiles[$fileId] = $fileId; } } unset($arMessages[$messageId]['params']['URL_ID']); } $arChatFiles = CIMDisk::GetFiles($toChatId, $arFiles); $arMessages = CIMMessageLink::prepareShow($arMessages, $params); $arResult = array('chatId' => $toChatId, 'message' => $arMessages, 'usersMessage' => $arUsersMessage, 'users' => array(), 'userInGroup' => array(), 'woUserInGroup' => array(), 'files' => $arChatFiles); if (is_array($loadExtraData) || is_bool($loadExtraData) && $loadExtraData == true) { $bDepartment = true; if (is_array($loadExtraData) && $loadExtraData['DEPARTMENT'] == 'N') { $bDepartment = false; } $arChat = self::GetChatData(array('ID' => $toChatId, 'USE_CACHE' => 'N')); if ($arChat['chat'][$toChatId]['messageType'] == IM_MESSAGE_OPEN || in_array($fromUserId, $arChat['userInChat'][$toChatId])) { $arResult['userInChat'] = $arChat['userInChat']; $arResult['userChatBlockStatus'] = $arChat['userChatBlockStatus']; $ar = CIMContactList::GetUserData(array('ID' => $arChat['userInChat'][$toChatId], 'DEPARTMENT' => $bDepartment ? 'Y' : 'N', 'USE_CACHE' => 'N')); $arResult['users'] = $ar['users']; $arResult['userInGroup'] = $ar['userInGroup']; $arResult['woUserInGroup'] = $ar['woUserInGroup']; if ($arChat['chat'][$toChatId]['extranet'] === "") { $isExtranet = false; foreach ($ar['users'] as $userData) { if ($userData['extranet']) { $isExtranet = true; break; } } IM\ChatTable::update($toChatId, array('EXTRANET' => $isExtranet ? "Y" : "N")); $arChat['chat'][$toChatId]['extranet'] = $isExtranet; } $arResult['chat'] = $arChat['chat']; } } return $arResult; }
function GetLastMessage($toUserId, $fromUserId = false, $loadUserData = false, $bTimeZone = true, $limit = true) { global $DB; $fromUserId = IntVal($fromUserId); if ($fromUserId <= 0) { $fromUserId = $this->user_id; } $toUserId = IntVal($toUserId); if ($toUserId <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_USER_ID"), "ERROR_TO_USER_ID"); return false; } $chatId = 0; $startId = 0; $arMessages = array(); $arUsersMessage = array(); $arMessageId = array(); if (!$bTimeZone) { CTimeZone::Disable(); } $strSql = "\n\t\t\tSELECT R1.CHAT_ID, R1.START_ID, R2.LAST_ID, " . $DB->DatetimeToTimestampFunction('R2.LAST_READ') . " LAST_READ, R1.NOTIFY_BLOCK\n\t\t\tFROM b_im_relation R1\n\t\t\tINNER JOIN b_im_relation R2 on R2.CHAT_ID = R1.CHAT_ID\n\t\t\tWHERE\n\t\t\t\tR1.USER_ID = " . $fromUserId . "\n\t\t\t\tAND R1.MESSAGE_TYPE = '" . IM_MESSAGE_PRIVATE . "'\n\t\t\t\tAND R2.USER_ID = " . $toUserId . "\n\t\t\t\tAND R2.MESSAGE_TYPE = '" . IM_MESSAGE_PRIVATE . "'\n\t\t"; if (!$bTimeZone) { CTimeZone::Enable(); } $dbRes = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if ($arRes = $dbRes->Fetch()) { $chatId = intval($arRes['CHAT_ID']); $startId = intval($arRes['START_ID']); $lastId = intval($arRes['LAST_ID']); $lastRead = intval($arRes['LAST_READ']); $blockNotify = $arRes['NOTIFY_BLOCK'] != 'N'; } if ($chatId > 0) { if ($limit) { $dbType = strtolower($DB->type); if ($dbType == "mysql") { $sqlLimit = " AND M.DATE_CREATE > DATE_SUB(NOW(), INTERVAL 30 DAY)"; } else { if ($dbType == "mssql") { $sqlLimit = " AND M.DATE_CREATE > dateadd(day, -30, getdate())"; } else { if ($dbType == "oracle") { $sqlLimit = " AND M.DATE_CREATE > SYSDATE-30"; } } } } if (!$bTimeZone) { CTimeZone::Disable(); } $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tM.ID,\n\t\t\t\t\tM.CHAT_ID,\n\t\t\t\t\tM.MESSAGE,\n\t\t\t\t\t" . $DB->DatetimeToTimestampFunction('M.DATE_CREATE') . " DATE_CREATE,\n\t\t\t\t\tM.AUTHOR_ID,\n\t\t\t\t\tM.NOTIFY_EVENT\n\t\t\t\tFROM b_im_message M\n\t\t\t\tWHERE M.CHAT_ID = " . $chatId . " #LIMIT#\n\t\t\t\tORDER BY M.DATE_CREATE DESC, M.ID DESC\n\t\t\t"; $strSql = $DB->TopSql($strSql, 20); if (!$bTimeZone) { CTimeZone::Enable(); } if ($limit) { $dbRes = $DB->Query(str_replace("#LIMIT#", $sqlLimit, $strSql), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } else { $dbRes = $DB->Query(str_replace("#LIMIT#", "", $strSql), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } CIMStatus::Set($fromUserId, array('IDLE' => null)); $CCTP = new CTextParser(); $CCTP->MaxStringLen = 200; $CCTP->allow = array("HTML" => "N", "ANCHOR" => $this->bHideLink ? "N" : "Y", "BIU" => "Y", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => $this->bHideLink ? "N" : "Y", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N"); while ($arRes = $dbRes->Fetch()) { if ($arRes['ID'] < $startId) { continue; } if ($fromUserId == $arRes['AUTHOR_ID']) { $arRes['TO_USER_ID'] = $toUserId; $arRes['FROM_USER_ID'] = $fromUserId; $convId = $arRes['TO_USER_ID']; } else { $arRes['TO_USER_ID'] = $fromUserId; $arRes['FROM_USER_ID'] = $toUserId; $convId = $arRes['FROM_USER_ID']; } $arMessages[$arRes['ID']] = array('id' => $arRes['ID'], 'chatId' => $arRes['CHAT_ID'], 'senderId' => $arRes['FROM_USER_ID'], 'recipientId' => $arRes['TO_USER_ID'], 'system' => $arRes['NOTIFY_EVENT'] == 'private' ? 'N' : 'Y', 'date' => $arRes['DATE_CREATE'], 'text' => $CCTP->convertText(htmlspecialcharsbx($arRes['MESSAGE']))); $arMessageId[] = $arRes['ID']; $arUsersMessage[$convId][] = $arRes['ID']; } } $params = CIMMessageParam::Get($arMessageId); $arFiles = array(); foreach ($params as $messageId => $param) { $arMessages[$messageId]['params'] = $param; if (isset($param['FILE_ID'])) { foreach ($param['FILE_ID'] as $fileId) { $arFiles[$fileId] = $fileId; } } unset($arMessages[$messageId]['params']['URL_ID']); } $arChatFiles = CIMDisk::GetFiles($chatId, $arFiles); $arMessages = CIMMessageLink::prepareShow($arMessages, $params); $arUserChatBlockStatus = array(); if ($blockNotify) { $arUserChatBlockStatus[$chatId][$fromUserId] = 'Y'; } $arResult = array('chatId' => $chatId, 'message' => $arMessages, 'usersMessage' => $arUsersMessage, 'users' => array(), 'userInGroup' => array(), 'woUserInGroup' => array(), 'files' => $arChatFiles, 'userChatBlockStatus' => $arUserChatBlockStatus); if ($lastRead > 0) { $arResult['readedList'][$toUserId] = array('messageId' => $lastId, 'date' => $lastRead); } if (is_array($loadUserData) || is_bool($loadUserData) && $loadUserData == true) { $bDepartment = true; if (is_array($loadUserData) && $loadUserData['DEPARTMENT'] == 'N') { $bDepartment = false; } $ar = CIMContactList::GetUserData(array('ID' => array($fromUserId, $toUserId), 'DEPARTMENT' => $bDepartment ? 'Y' : 'N', 'USE_CACHE' => 'N', 'SHOW_ONLINE' => 'Y', 'PHONES' => IsModuleInstalled('voximplant') ? 'Y' : 'N')); $arResult['users'] = $ar['users']; $arResult['userInGroup'] = $ar['userInGroup']; $arResult['woUserInGroup'] = $ar['woUserInGroup']; $arResult['phones'] = $ar['phones']; } return $arResult; }
$ar = array("FROM_USER_ID" => intval($USER->GetID()), "TO_USER_ID" => intval($_POST['RECIPIENT_ID']), "MESSAGE" => $_POST['MESSAGE']); $insertID = CIMMessage::Add($ar); } else { $errorMessage = GetMessage('IM_ACCESS_ERROR'); } } if (!$insertID && !$errorMessage) { if ($e = $GLOBALS["APPLICATION"]->GetException()) { $errorMessage = $e->GetString(); } if (StrLen($errorMessage) == 0) { $errorMessage = GetMessage('IM_UNKNOWN_ERROR'); } } $params = CIMMessageParam::Get(array($insertID)); $arMessages = CIMMessageLink::prepareShow(array(), $params); $CCTP = new CTextParser(); $CCTP->MaxStringLen = 200; $CCTP->allow = array("HTML" => "N", "ANCHOR" => isset($_POST['MOBILE']) ? "N" : "Y", "BIU" => "Y", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => "Y", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N"); $userTzOffset = isset($_POST['USER_TZ_OFFSET']) ? intval($_POST['USER_TZ_OFFSET']) : CTimeZone::GetOffset(); $arResult = array('TMP_ID' => $tmpID, 'ID' => $insertID, 'SEND_DATE' => time() + $userTzOffset, 'SEND_MESSAGE' => $CCTP->convertText(htmlspecialcharsbx($ar['MESSAGE'])), 'SEND_MESSAGE_PARAMS' => $arMessages[$insertID]['params'], 'SENDER_ID' => intval($USER->GetID()), 'RECIPIENT_ID' => $_POST['CHAT'] == 'Y' ? htmlspecialcharsbx($_POST['RECIPIENT_ID']) : intval($_POST['RECIPIENT_ID']), 'ERROR' => $errorMessage); if (isset($_POST['MOBILE'])) { $arFormat = array("today" => "today, " . GetMessage('IM_MESSAGE_FORMAT_TIME'), "" => GetMessage('IM_MESSAGE_FORMAT_DATE')); $arResult['SEND_DATE_FORMAT'] = FormatDate($arFormat, time() + $userTzOffset); } echo CUtil::PhpToJsObject($arResult); CIMContactList::SetOnline(); CIMMessenger::SetCurrentTab($_POST['TAB']); } else { if ($_POST['IM_EDIT_MESSAGE'] == 'Y') { CUtil::decodeURIComponent($_POST);
/** * @param $pageId * @param $chatId * @param bool $bTimeZone * @return array */ function GetMoreChatMessage($pageId, $chatId, $bTimeZone = true) { global $DB; $iNumPage = 1; if (intval($pageId) > 0) { $iNumPage = intval($pageId); } $chatId = IntVal($chatId); $limitById = ''; $ar = \CIMChat::GetRelationById($chatId, $this->user_id); if ($ar && $ar['START_ID'] > 0) { $limitById = 'AND M.ID >= ' . intval($ar['START_ID']); } $strSql = "\n\t\t\tSELECT COUNT(M.ID) as CNT\n\t\t\tFROM b_im_message M\n\t\t\tINNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID\n\t\t\tWHERE R1.CHAT_ID = " . $chatId . " AND R1.USER_ID = " . $this->user_id . " " . $limitById . "\n\t\t"; $res_cnt = $DB->Query($strSql); $res_cnt = $res_cnt->Fetch(); $cnt = $res_cnt["CNT"]; $arMessages = array(); $arMessageFiles = array(); $arMessageId = array(); $usersMessage = array(); if ($cnt > 0 && ceil($cnt / 20) >= $iNumPage) { if (!$bTimeZone) { CTimeZone::Disable(); } $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tM.ID,\n\t\t\t\t\tM.CHAT_ID,\n\t\t\t\t\tM.MESSAGE,\n\t\t\t\t\t" . $DB->DatetimeToTimestampFunction('M.DATE_CREATE') . " DATE_CREATE,\n\t\t\t\t\tM.AUTHOR_ID\n\t\t\t\tFROM b_im_message M\n\t\t\t\tINNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID\n\t\t\t\tWHERE R1.CHAT_ID = " . $chatId . " AND R1.USER_ID = " . $this->user_id . " " . $limitById . "\n\t\t\t\tORDER BY M.DATE_CREATE DESC, M.ID DESC\n\t\t\t"; if (!$bTimeZone) { CTimeZone::Enable(); } $dbRes = new CDBResult(); $dbRes->NavQuery($strSql, $cnt, array('iNumPage' => $iNumPage, 'nPageSize' => 20)); $CCTP = new CTextParser(); $CCTP->MaxStringLen = 200; $CCTP->allow = array("HTML" => "N", "ANCHOR" => $this->bHideLink ? "N" : "Y", "BIU" => "Y", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => $this->bHideLink ? "N" : "Y", "NL2BR" => "Y", "VIDEO" => "N", "TABLE" => "N", "CUT_ANCHOR" => "N", "ALIGN" => "N"); while ($arRes = $dbRes->Fetch()) { $arMessages[$arRes['ID']] = array('id' => $arRes['ID'], 'chatId' => $arRes['CHAT_ID'], 'senderId' => $arRes['AUTHOR_ID'], 'recipientId' => $arRes['CHAT_ID'], 'date' => $arRes['DATE_CREATE'], 'system' => $arRes['AUTHOR_ID'] > 0 ? 'N' : 'Y', 'text' => $CCTP->convertText(htmlspecialcharsbx($arRes['MESSAGE']))); $usersMessage[$arRes['CHAT_ID']][] = $arRes['ID']; $arMessageId[] = $arRes['ID']; } $params = CIMMessageParam::Get($arMessageId); $arFiles = array(); foreach ($params as $messageId => $param) { $arMessages[$messageId]['params'] = $param; if (isset($param['FILE_ID'])) { foreach ($param['FILE_ID'] as $fileId) { $arFiles[$fileId] = $fileId; } } unset($arMessages[$messageId]['params']['URL_ID']); } $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles); $arMessages = CIMMessageLink::prepareShow($arMessages, $params); } return array('chatId' => $chatId, 'message' => $arMessages, 'usersMessage' => $usersMessage, 'files' => $arMessageFiles); }