%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/im/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/im/classes/general/im_message_param.php |
<? use Bitrix\Im as IM; use Bitrix\Main\UrlPreview as UrlPreview; class CIMMessageParam { public static function Set($messageId, $params = Array()) { $messageId = intval($messageId); if(!(is_array($params) || is_null($params)) || $messageId <= 0) return false; if (is_null($params) || count($params) <= 0) { return self::DeleteAll($messageId); } $default = self::GetDefault(); $arToDelete = array(); foreach ($params as $key => $val) { if (isset($default[$key]) && $default[$key] == $val) { $arToDelete[$key] = array( "=MESSAGE_ID" => $messageId, "=PARAM_NAME" => $key, ); } } $arToInsert = array(); foreach($params as $k1 => $v1) { $name = substr(trim($k1), 0, 100); if(strlen($name)) { if(is_object($v1) && $v1 instanceof \Bitrix\Im\Bot\Keyboard) { $v1 = array($v1); } else if(is_object($v1) && $v1 instanceof \Bitrix\Im\Bot\ContextMenu) { $v1 = array($v1); } else if(is_object($v1) && $v1 instanceof CIMMessageParamAttach) { $v1 = array($v1); } else if(is_object($v1) && $v1 instanceof \Bitrix\Main\Type\DateTime) { $v1 = array($v1->getTimestamp()); } else if(is_array($v1) && \Bitrix\Main\Type\Collection::isAssociative($v1)) { $v1 = array($v1); } else if (!is_array($v1)) { $v1 = array($v1); } if (empty($v1)) { $arToDelete[$name] = array( "=MESSAGE_ID" => $messageId, "=PARAM_NAME" => $name, ); } else { foreach($v1 as $v2) { if (is_array($v2)) { $value = \Bitrix\Main\Web\Json::encode($v2); if(strlen($value) > 0 && strlen($value) < 60000) { $key = md5($name.$value); $arToInsert[$key] = array( "MESSAGE_ID" => $messageId, "PARAM_NAME" => $name, "PARAM_VALUE" => isset($v2['ID'])? $v2['ID']: time(), "PARAM_JSON" => $value, ); } } else if(is_object($v2) && ($v2 instanceof \Bitrix\Im\Bot\Keyboard || $v2 instanceof \Bitrix\Im\Bot\ContextMenu)) { $value = $v2->getJson(); if(strlen($value)) { $key = md5($name.$value); $arToInsert[$key] = array( "MESSAGE_ID" => $messageId, "PARAM_NAME" => $name, "PARAM_VALUE" => "", "PARAM_JSON" => $value, ); } } else if(is_object($v2) && $v2 instanceof CIMMessageParamAttach) { $value = $v2->GetJSON(); $valueArray = $v2->GetArray(); if(strlen($value)) { $key = md5($name.$value); $arToInsert[$key] = array( "MESSAGE_ID" => $messageId, "PARAM_NAME" => $name, "PARAM_VALUE" => $valueArray['ID'], "PARAM_JSON" => $value, ); } } else { $value = substr(trim($v2), 0, 100); if(strlen($value)) { $key = md5($name.$value); $arToInsert[$key] = array( "MESSAGE_ID" => $messageId, "PARAM_NAME" => $name, "PARAM_VALUE" => $value, ); } } } } } } if(!empty($arToInsert)) { $messageParameters = IM\Model\MessageParamTable::getList(array( 'select' => array('ID', 'PARAM_NAME', 'PARAM_VALUE', 'PARAM_JSON'), 'filter' => array( '=MESSAGE_ID' => $messageId, ), )); while($ar = $messageParameters->fetch()) { if (strlen($ar['PARAM_JSON'])) { $key = md5($ar["PARAM_NAME"].$ar["PARAM_JSON"]); } else { $key = md5($ar["PARAM_NAME"].$ar["PARAM_VALUE"]); } if(array_key_exists($key, $arToInsert)) { unset($arToInsert[$key]); } else if (isset($params[$ar["PARAM_NAME"]])) { IM\Model\MessageParamTable::delete($ar['ID']); } } } foreach($arToInsert as $parameterInfo) { IM\Model\MessageParamTable::add($parameterInfo); } foreach($arToDelete as $filter) { $messageParameters = IM\Model\MessageParamTable::getList(array( 'select' => array('ID'), 'filter' => $filter, )); while ($parameterInfo = $messageParameters->fetch()) { IM\Model\MessageParamTable::delete($parameterInfo['ID']); } } self::UpdateTimestamp($messageId); return true; } public static function UpdateTimestamp($messageId, $chatId = 0) { $messageId = intval($messageId); $chatId = intval($chatId); if ($chatId <= 0) { $message = \Bitrix\Im\Model\MessageTable::getById($messageId)->fetch(); if ($message) { $chatId = $message['CHAT_ID']; } } if ($chatId <= 0) { return false; } $dateNow = new \Bitrix\Main\Type\DateTime(); $timestamp = str_pad($chatId, 11, '0', STR_PAD_LEFT).' '.$dateNow->format('Y-m-d H:i:s'); $orm = IM\Model\MessageParamTable::getList(array( 'select' => array('ID'), 'filter' => array('=MESSAGE_ID' => $messageId, '=PARAM_NAME' => 'TS'), )); if ($tsParam = $orm->fetch()) { IM\Model\MessageParamTable::update($tsParam['ID'], array('PARAM_VALUE' => $timestamp)); } else { IM\Model\MessageParamTable::add(array('MESSAGE_ID' => $messageId, 'PARAM_NAME' => 'TS', 'PARAM_VALUE' => $timestamp)); } return true; } public static function SendPull($messageId, $sendExtraParams = true) { global $DB; if (!CModule::IncludeModule('pull')) return false; $messageId = intval($messageId); $sql = " SELECT C.ID CHAT_ID, C.TYPE MESSAGE_TYPE, M.AUTHOR_ID, C.ENTITY_TYPE CHAT_ENTITY_TYPE, C.ENTITY_ID CHAT_ENTITY_ID FROM b_im_message M INNER JOIN b_im_chat C ON M.CHAT_ID = C.ID WHERE M.ID = ".$messageId." "; $messageData = $DB->Query($sql)->Fetch(); if (!$messageData) return false; $arPullMessage = Array( 'id' => $messageId, 'type' => $messageData['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE? 'private': 'chat', ); $relations = CIMMessenger::GetRelationById($messageId); if ($messageData['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE) { $arFields['FROM_USER_ID'] = $messageData['AUTHOR_ID']; foreach ($relations as $rel) { if ($rel['USER_ID'] != $messageData['AUTHOR_ID']) $arFields['TO_USER_ID'] = $rel['USER_ID']; } $arPullMessage['fromUserId'] = $arFields['FROM_USER_ID']; $arPullMessage['toUserId'] = $arFields['TO_USER_ID']; } else { $arPullMessage['chatId'] = $messageData['CHAT_ID']; $arPullMessage['senderId'] = $messageData['AUTHOR_ID']; if ($messageData['CHAT_ENTITY_TYPE'] == 'LINES') { foreach ($relations as $rel) { if ($rel["EXTERNAL_AUTH_ID"] == 'imconnector') { unset($relations[$rel["USER_ID"]]); } } } } $arMessages[$messageId] = Array(); $params = CIMMessageParam::Get(Array($messageId), false, $sendExtraParams === true); $arMessages[$messageId]['params'] = $params[$messageId]; if (is_array($sendExtraParams) && !empty($sendExtraParams)) { $arDefault = CIMMessageParam::GetDefault(); foreach($sendExtraParams as $key) { if (!isset($arMessages[$messageId]['params'][$key])) { $arMessages[$messageId]['params'][$key] = $arDefault[$key]; } } } $arMessages = CIMMessageLink::prepareShow($arMessages, $params); $arPullMessage['params'] = CIMMessenger::PrepareParamsForPull($arMessages[$messageId]['params']); \Bitrix\Pull\Event::add(array_keys($relations), Array( 'module_id' => 'im', 'command' => 'messageParamsUpdate', 'params' => $arPullMessage, 'extra' => \Bitrix\Im\Common::getPullExtra() )); if ($messageData['MESSAGE_TYPE'] == IM_MESSAGE_OPEN || $messageData['MESSAGE_TYPE'] == IM_MESSAGE_OPEN_LINE) { CPullWatch::AddToStack('IM_PUBLIC_'.$messageData['CHAT_ID'], Array( 'module_id' => 'im', 'command' => 'messageParamsUpdate', 'params' => $arPullMessage, 'extra' => \Bitrix\Im\Common::getPullExtra() )); } return true; } public static function DeleteAll($messageId) { $messageId = intval($messageId); if ($messageId <= 0) return false; $messageParameters = IM\Model\MessageParamTable::getList(array( 'select' => array('ID', 'PARAM_NAME'), 'filter' => array( '=MESSAGE_ID' => $messageId, ), )); while ($parameterInfo = $messageParameters->fetch()) { if ($parameterInfo['PARAM_NAME'] == 'TS') continue; IM\Model\MessageParamTable::delete($parameterInfo['ID']); } self::UpdateTimestamp($messageId); return true; } public static function DeleteByParam($paramName, $paramValue) { if (strlen($paramName) <= 0 || strlen($paramValue) <= 0 || $paramValue == 'TS') { return false; } $messageParameters = IM\Model\MessageParamTable::getList(array( 'select' => array('ID', 'MESSAGE_ID'), 'filter' => array( '=PARAM_NAME' => $paramName, '=PARAM_VALUE' => $paramValue, ), )); while ($parameterInfo = $messageParameters->fetch()) { if ($parameterInfo['PARAM_NAME'] == 'TS') continue; IM\Model\MessageParamTable::delete($parameterInfo['ID']); self::UpdateTimestamp($parameterInfo['MESSAGE_ID']); } return true; } public static function Get($messageId, $paramName = false, $withDefault = false) { $arResult = array(); if (is_array($messageId)) { if (!empty($messageId)) { foreach ($messageId as $key => $value) { $messageId[$key] = intval($value); $arResult[$messageId[$key]] = Array(); } } else { return $arResult; } } else { $messageId = intval($messageId); if ($messageId <= 0) { return false; } $arResult[$messageId] = Array(); } $filter = array( '=MESSAGE_ID' => $messageId, ); if ($paramName && strlen($paramName) > 0) { $filter['=PARAM_NAME'] = $paramName; } $messageParameters = IM\Model\MessageParamTable::getList(array( 'select' => array('ID', 'MESSAGE_ID', 'PARAM_NAME', 'PARAM_VALUE', 'PARAM_JSON'), 'filter' => $filter, )); while($ar = $messageParameters->fetch()) { if (strlen($ar["PARAM_JSON"])) { $value = \Bitrix\Main\Web\Json::decode($ar["PARAM_JSON"]); } else { $value = $ar["PARAM_VALUE"]; } if (in_array($ar["PARAM_NAME"], Array('KEYBOARD', 'MENU'))) { $arResult[$ar["MESSAGE_ID"]][$ar["PARAM_NAME"]] = $value; } else { $arResult[$ar["MESSAGE_ID"]][$ar["PARAM_NAME"]][] = $value; } } if (is_array($messageId)) { foreach ($messageId as $key) { $arResult[$key] = self::PrepareValues($arResult[$key], $withDefault); } } else { $arResult = self::PrepareValues($arResult[$messageId], $withDefault); } if ($paramName) { $arResult = isset($arResult[$paramName])? $arResult[$paramName]: null; } return $arResult; } public static function GetMessageIdByParam($paramName, $paramValue, $chatId = null) { $arResult = Array(); if (strlen($paramName) <= 0 || strlen($paramValue) <= 0) { return $arResult; } $filter = array( '=PARAM_NAME' => $paramName, '=PARAM_VALUE' => $paramValue, ); if ($chatId) { $filter['=MESSAGE.CHAT_ID'] = $chatId; } $messageParameters = IM\Model\MessageParamTable::getList(array( 'select' => array('MESSAGE_ID'), 'filter' => $filter, )); while($ar = $messageParameters->fetch()) { $arResult[] = $ar["MESSAGE_ID"]; } return $arResult; } public static function PrepareValues($values, $withDefault = false) { $arValues = Array(); $arDefault = self::GetDefault(); foreach($values as $key => $value) { if (in_array($key, Array('IS_DELETED', 'IS_EDITED', 'CAN_ANSWER', 'IMOL_QUOTE_MSG', 'SENDING', 'URL_ONLY'))) { $arValues[$key] = in_array($value[0], Array('Y', 'N'))? $value[0]: $arDefault[$key]; } else if (in_array($key, Array('KEYBOARD_UID'))) { $arValues[$key] = intval($value); } else if (in_array($key, Array('CHAT_ID', 'CHAT_MESSAGE', 'IMOL_VOTE_SID', 'IMOL_VOTE_USER', 'IMOL_VOTE_HEAD', 'SENDING_TS', 'IMOL_SID'))) { $arValues[$key] = intval($value[0]); } else if (in_array($key, Array('CHAT_LAST_DATE'))) { if (is_object($value[0]) && $value[0] instanceof \Bitrix\Main\Type\DateTime) { $arValues[$key] = $value[0]; } else { $arValues[$key] = \Bitrix\Main\Type\DateTime::createFromTimestamp(intval($value[0])); } } else if ($key == 'DATE_TEXT') { if (is_array($value) && !empty($value)) { foreach ($value as $k => $v) { $arValues[$key][$k] = htmlspecialcharsbx($v); } } else if (!is_array($value)) { $arValues[$key] = htmlspecialcharsbx($value); } else { $arValues[$key] = $arDefault[$key]; } } else if ($key == 'CHAT_USER' || $key == 'DATE_TS' || $key == 'FILE_ID' || $key == 'LIKE' || $key == 'FAVORITE' || $key == 'KEYBOARD_ACTION' || $key == 'URL_ID' || $key == 'LINK_ACTIVE') { if (is_array($value) && !empty($value)) { foreach ($value as $k => $v) { $arValues[$key][$k] = intval($v); } } else if (!is_array($value) && intval($value) > 0) { $arValues[$key] = intval($value); } else { $arValues[$key] = $arDefault[$key]; } } else if ($key == 'CONNECTOR_MID') { if (is_array($value) && !empty($value)) { foreach ($value as $k => $v) { $arValues[$key][$k] = $v; } } else if (!is_array($value) && strlen($value) > 0) { $arValues[$key] = $value; } else { $arValues[$key] = $arDefault[$key]; } } else if ($key == 'ATTACH') { if (isset($value)) { $arValues[$key] = CIMMessageParamAttach::PrepareAttach($value); } else { $arValues[$key] = $arDefault[$key]; } } else if ($key == 'CLASS' || $key == 'IMOL_VOTE' || $key == 'IMOL_VOTE_TEXT' || $key == 'IMOL_VOTE_LIKE' || $key == 'IMOL_VOTE_DISLIKE' || $key == 'IMOL_FORM') { $arValues[$key] = isset($value[0])? $value[0]: ''; } else if ($key == 'CONNECTOR_MID') { $arValues[$key] = $value; } else if ($key == 'NAME') { $arValues[$key] = isset($value[0])? htmlspecialcharsbx($value[0]): $arDefault[$key]; } else if ($key == 'USER_ID') { $arValues[$key] = isset($value[0])? intval($value[0]): $arDefault[$key]; } else if ($key == 'AVATAR') { if (isset($value)) { $arFileTmp = \CFile::ResizeImageGet( $value[0], array('width' => 100, 'height' => 100), BX_RESIZE_IMAGE_EXACT, false, false, true ); $arValues[$key] = empty($arFileTmp['src'])? '': $arFileTmp['src']; } else { $arValues[$key] = $arDefault[$key]; } } else if (isset($arDefault[$key])) { $arValues[$key] = $value; } } if ($withDefault) { foreach($arDefault as $key => $value) { if (!isset($arValues[$key])) { $arValues[$key] = $value; } } } else { foreach($arDefault as $key => $value) { if (isset($arValues[$key]) && $arValues[$key] == $value) { unset($arValues[$key]); } } } return $arValues; } public static function GetDefault() { $arDefault = Array( 'CODE' => '', 'FAVORITE' => Array(), 'LIKE' => Array(), 'FILE_ID' => Array(), 'URL_ID' => Array(), 'URL_ONLY' => 'N', 'ATTACH' => Array(), 'LINK_ACTIVE' => Array(), 'MENU' => 'N', 'KEYBOARD' => 'N', 'KEYBOARD_UID' => 0, 'CONNECTOR_MID' => Array(), 'IS_ERROR' => 'N', 'IS_DELIVERED' => 'Y', 'IS_DELETED' => 'N', 'IS_EDITED' => 'N', 'SENDING' => 'N', 'SENDING_TS' => 0, 'CAN_ANSWER' => 'N', 'CLASS' => '', 'USER_ID' => '', 'NAME' => '', 'AVATAR' => '', 'CHAT_ID' => 0, 'CHAT_MESSAGE' => 0, 'CHAT_LAST_DATE' => '', 'CHAT_USER' => Array(), 'DATE_TEXT' => Array(), 'DATE_TS' => Array(), 'IMOL_VOTE' => '', 'IMOL_VOTE_TEXT' => '', 'IMOL_VOTE_LIKE' => '', 'IMOL_VOTE_DISLIKE' => '', 'IMOL_VOTE_SID' => '', 'IMOL_VOTE_USER' => '', 'IMOL_VOTE_HEAD' => '', 'IMOL_QUOTE_MSG' => 'N', 'IMOL_SID' => 0, 'IMOL_FORM' => '', ); return $arDefault; } } class CIMMessageParamAttach { const NORMAL = "#aac337"; const ATTENTION = "#e8a441"; const PROBLEM = "#df532d"; const TRANSPARENT = "TRANSPARENT"; const CHAT = "CHAT"; private $result = Array(); function __construct($id = null, $color = null) { $this->result['ID'] = $id? $id: time(); $this->result['BLOCKS'] = Array(); if ($color == self::TRANSPARENT) { $this->result['COLOR'] = 'transparent'; } else if ($color != self::CHAT) { if (!$color || !preg_match('/^#([a-fA-F0-9]){3}(([a-fA-F0-9]){3})?\b$/D', $color)) { $color = Bitrix\Im\Color::getRandomColor(); } $this->result['COLOR'] = $color; } } public function AddUser($params) { $add = Array(); if (!isset($params['NAME']) || strlen(trim($params['NAME'])) <= 0) return false; $add['NAME'] = htmlspecialcharsbx(trim($params['NAME'])); $add['AVATAR_TYPE'] = 'USER'; if (isset($params['NETWORK_ID'])) { $add['NETWORK_ID'] = htmlspecialcharsbx(substr($params['NETWORK_ID'], 0,1)).intval(substr($params['NETWORK_ID'], 1)); } else if (isset($params['USER_ID']) && intval($params['USER_ID']) > 0) { $add['USER_ID'] = intval($params['USER_ID']); } else if (isset($params['CHAT_ID']) && intval($params['CHAT_ID']) > 0) { $add['CHAT_ID'] = intval($params['CHAT_ID']); $add['AVATAR_TYPE'] = 'CHAT'; } else if (isset($params['BOT_ID']) && intval($params['BOT_ID']) > 0) { $add['BOT_ID'] = intval($params['BOT_ID']); $add['AVATAR_TYPE'] = 'BOT'; } else if (isset($params['LINK']) && preg_match('#^(?:/|https?://)#', $params['LINK'])) { $add['LINK'] = htmlspecialcharsbx($params['LINK']); } if (isset($params['AVATAR']) && preg_match('#^(?:/|https?://)#', $params['AVATAR'])) { $add['AVATAR'] = htmlspecialcharsbx($params['AVATAR']); } if (isset($params['AVATAR_TYPE']) && in_array($params['AVATAR_TYPE'], Array('CHAT', 'USER', 'BOT'))) { $add['AVATAR_TYPE'] = $params['AVATAR_TYPE']; } $this->result['BLOCKS'][]['USER'] = Array($add); return true; } public function AddChat($params) { $params['AVATAR_TYPE'] = 'CHAT'; return $this->AddUser($params); } public function AddBot($params) { $params['AVATAR_TYPE'] = 'BOT'; return $this->AddUser($params); } public function AddLink($params) { $add = Array(); if (isset($params['NETWORK_ID']) && isset($params['NAME'])) { $add['NETWORK_ID'] = htmlspecialcharsbx(substr($params['NETWORK_ID'], 0,1)).intval(substr($params['NETWORK_ID'], 1)); } else if (isset($params['USER_ID']) && intval($params['USER_ID']) > 0 && isset($params['NAME'])) { $add['USER_ID'] = intval($params['USER_ID']); } else if (isset($params['CHAT_ID']) && intval($params['CHAT_ID']) > 0 && isset($params['NAME'])) { $add['CHAT_ID'] = intval($params['CHAT_ID']); } else if (!isset($params['LINK']) || isset($params['LINK']) && !preg_match('#^(?:/|https?://)#', $params['LINK'])) { return false; } if (isset($params['NAME'])) { $add['NAME'] = htmlspecialcharsbx(trim($params['NAME'])); } if (isset($params['LINK'])) { $add['LINK'] = htmlspecialcharsbx($params['LINK']); } if (isset($params['DESC'])) { $params['DESC'] = htmlspecialcharsbx(str_replace(Array('<br>', '<br/>', '<br />'), '#BR#', trim($params['DESC']))); $add['DESC'] = str_replace(array('#BR#', '[br]', '[BR]'), '<br/>', $params['DESC']); } if (isset($params['HTML'])) { $sanitizer = new CBXSanitizer(); $sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_MIDDLE); $sanitizer->ApplyHtmlSpecChars(false); $add['HTML'] = $sanitizer->SanitizeHtml($params['HTML']); } else if (isset($params['PREVIEW']) && preg_match('#^(?:/|https?://)#', $params['PREVIEW'])) { $add['PREVIEW'] = htmlspecialcharsbx($params['PREVIEW']); } $this->result['BLOCKS'][]['LINK'] = Array($add); return true; } public function AddRichLink($params) { $add = Array(); if (isset($params['NETWORK_ID']) && isset($params['NAME'])) { $add['NETWORK_ID'] = htmlspecialcharsbx(substr($params['NETWORK_ID'], 0,1)).intval(substr($params['NETWORK_ID'], 1)); } else if (isset($params['USER_ID']) && intval($params['USER_ID']) > 0 && isset($params['NAME'])) { $add['USER_ID'] = intval($params['USER_ID']); } else if (isset($params['CHAT_ID']) && intval($params['CHAT_ID']) > 0 && isset($params['NAME'])) { $add['CHAT_ID'] = intval($params['CHAT_ID']); } else if (!isset($params['LINK']) || isset($params['LINK']) && !preg_match('#^(?:/|https?://)#', $params['LINK'])) { return false; } if (isset($params['NAME'])) { $add['NAME'] = htmlspecialcharsbx(trim($params['NAME'])); } if (isset($params['LINK'])) { $add['LINK'] = htmlspecialcharsbx($params['LINK']); } if (isset($params['DESC'])) { $params['DESC'] = htmlspecialcharsbx(str_replace(Array('<br>', '<br/>', '<br />'), '#BR#', trim($params['DESC']))); $add['DESC'] = str_replace(array('#BR#', '[br]', '[BR]'), '<br/>', $params['DESC']); } if (isset($params['HTML'])) { $sanitizer = new CBXSanitizer(); $sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_MIDDLE); $sanitizer->ApplyHtmlSpecChars(false); $add['HTML'] = $sanitizer->SanitizeHtml($params['HTML']); } else if (isset($params['PREVIEW']) && preg_match('#^(?:/|https?://)#', $params['PREVIEW'])) { $add['PREVIEW'] = htmlspecialcharsbx($params['PREVIEW']); } $this->result['BLOCKS'][]['RICH_LINK'] = Array($add); return true; } public function AddHtml($html) { if (!isset($html)) return false; $sanitizer = new CBXSanitizer(); $sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_LOW); $sanitizer->ApplyHtmlSpecChars(false); $html = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $html); $this->result['BLOCKS'][]['HTML'] = $sanitizer->SanitizeHtml($html); return true; } public function AddMessage($message) { $message = trim($message); if (strlen($message) <= 0) return false; $message = htmlspecialcharsbx(str_replace(Array('<br>', '<br/>', '<br />'), '#BR#', $message)); $this->result['BLOCKS'][]['MESSAGE'] = $message; return true; } public function AddGrid($params) { $add = Array(); foreach ($params as $grid) { $result = Array(); if ($grid['DISPLAY'] != 'LINE') { if (!isset($grid['NAME']) || strlen(trim($grid['NAME'])) <= 0) continue; } if (isset($grid['DISPLAY']) && in_array($grid['DISPLAY'], Array('BLOCK', 'ROW', 'LINE', 'COLUMN'))) { if ($grid['DISPLAY'] == 'COLUMN') { $grid['DISPLAY'] = 'ROW'; } $result['DISPLAY'] = $grid['DISPLAY']; } else { $result['DISPLAY'] = 'BLOCK'; } $result['NAME'] = htmlspecialcharsbx(trim($grid['NAME'])); $result['VALUE'] = htmlspecialcharsbx(str_replace(Array('<br>', '<br/>', '<br />'), '#BR#', trim($grid['VALUE']))); if (preg_match('/^#([a-fA-F0-9]){3}(([a-fA-F0-9]){3})?\b$/D', $grid['COLOR'])) { $result['COLOR'] = $grid['COLOR']; } if (isset($grid['WIDTH']) && intval($grid['WIDTH']) > 0) { $result['WIDTH'] = intval($grid['WIDTH']); } if (isset($grid['HEIGHT']) && intval($grid['HEIGHT']) > 0) { $result['HEIGHT'] = intval($grid['HEIGHT']); } if (isset($grid['USER_ID']) && intval($grid['USER_ID']) > 0) { $result['USER_ID'] = intval($grid['USER_ID']); } if (isset($grid['CHAT_ID']) && intval($grid['CHAT_ID']) > 0) { $result['CHAT_ID'] = intval($grid['CHAT_ID']); } if (isset($grid['LINK']) && preg_match('#^(?:/|https?://)#', $grid['LINK'])) { $result['LINK'] = htmlspecialcharsbx($grid['LINK']); } $add[] = $result; } if (empty($add)) return false; $this->result['BLOCKS'][]['GRID'] = $add; return true; } public function AddImages($params) { $add = Array(); foreach ($params as $images) { $result = Array(); if (!isset($images['LINK']) || isset($images['LINK']) && !preg_match('#^(?:/|https?://)#', $images['LINK'])) continue; if (isset($images['NAME']) && strlen(trim($images['NAME'])) > 0) { $result['NAME'] = htmlspecialcharsbx(trim($images['NAME'])); } $result['LINK'] = htmlspecialcharsbx($images['LINK']); if (isset($images['PREVIEW']) && preg_match('#^(?:/|https?://)#', $images['PREVIEW'])) { $result['PREVIEW'] = htmlspecialcharsbx($images['PREVIEW']); } $add[] = $result; } if (empty($add)) return false; $this->result['BLOCKS'][]['IMAGE'] = $add; return true; } public function AddFiles($params) { $add = Array(); foreach ($params as $files) { $result = Array(); if (!isset($files['LINK']) || isset($files['LINK']) && !preg_match('#^(?:/|https?://)#', $files['LINK'])) continue; $result['LINK'] = htmlspecialcharsbx($files['LINK']); if (isset($files['NAME']) && strlen(trim($files['NAME'])) > 0) { $result['NAME'] = htmlspecialcharsbx(trim($files['NAME'])); } if (isset($files['SIZE']) && intval($files['SIZE']) > 0) { $result['SIZE'] = intval($files['SIZE']); } $add[] = $result; } if (empty($add)) return false; $this->result['BLOCKS'][]['FILE'] = $add; return true; } public function AddDelimiter($params = Array()) { $add = Array(); $add['SIZE'] = isset($params['SIZE'])? intval($params['SIZE']): 0; if ($add['SIZE'] <= 0) { $add['SIZE'] = 200; } if (preg_match('/^#([a-fA-F0-9]){3}(([a-fA-F0-9]){3})?\b$/D', $params['COLOR'])) { $add['COLOR'] = $params['COLOR']; } else { $add['COLOR'] = '#c6c6c6'; } $this->result['BLOCKS'][]['DELIMITER'] = $add; } private static function decodeBbCode($message) { return \Bitrix\Im\Text::parse($message, Array('SAFE' => 'N')); } public static function GetAttachByJson($array) { if (is_string($array)) { $array = \CUtil::JsObjectToPhp($array); } if (!is_array($array)) { return null; } $id = null; $color = \CIMMessageParamAttach::CHAT; $attach = null; if (isset($array['BLOCKS'])) { $blocks = $array['BLOCKS']; if (isset($array['ID'])) { $id = $array['ID']; } if (isset($array['COLOR'])) { $color = $array['COLOR']; } } else { $blocks = $array; } $attach = new CIMMessageParamAttach($id, $color); foreach ($blocks as $data) { if (isset($data['USER'])) { if (is_array($data['USER']) && !\Bitrix\Main\Type\Collection::isAssociative($data['USER'])) { foreach ($data['USER'] as $dataItem) { $attach->AddUser($dataItem); } } else { $attach->AddUser($data['USER']); } } else if (isset($data['LINK'])) { if (is_array($data['LINK']) && !\Bitrix\Main\Type\Collection::isAssociative($data['LINK'])) { foreach ($data['LINK'] as $dataItem) { $attach->AddLink($dataItem); } } else { $attach->AddLink($data['LINK']); } } else if (isset($data['RICH_LINK'])) { if (is_array($data['RICH_LINK']) && !\Bitrix\Main\Type\Collection::isAssociative($data['RICH_LINK'])) { foreach ($data['RICH_LINK'] as $dataItem) { $attach->AddRichLink($dataItem); } } else { $attach->AddRichLink($data['RICH_LINK']); } } else if (isset($data['MESSAGE'])) { $attach->AddMessage($data['MESSAGE']); } else if (isset($data['GRID'])) { $attach->AddGrid($data['GRID']); } else if (isset($data['IMAGE'])) { if (is_array($data['IMAGE']) && \Bitrix\Main\Type\Collection::isAssociative($data['IMAGE'])) { $data['IMAGE'] = Array($data['IMAGE']); } $attach->AddImages($data['IMAGE']); } else if (isset($data['FILE'])) { if (is_array($data['FILE']) && \Bitrix\Main\Type\Collection::isAssociative($data['FILE'])) { $data['FILE'] = Array($data['FILE']); } $attach->AddFiles($data['FILE']); } else if (isset($data['DELIMITER'])) { $attach->AddDelimiter($data['DELIMITER']); } } return $attach->IsEmpty()? null: $attach; } public static function PrepareAttach($attach) { if (!is_array($attach)) return $attach; $isCollection = true; if(\Bitrix\Main\Type\Collection::isAssociative($attach)) { $isCollection = false; $attach = array($attach); } foreach ($attach as $attachId => $attachValue) { if (isset($attachValue['BLOCKS'])) { foreach ($attachValue['BLOCKS'] as $blockId => $block) { if (isset($block['GRID'])) { foreach ($block['GRID'] as $key => $value) { $attach[$attachId]['BLOCKS'][$blockId]['GRID'][$key]['VALUE'] = self::decodeBbCode($value['VALUE']); } } else if (isset($block['MESSAGE'])) { $attach[$attachId]['BLOCKS'][$blockId]['MESSAGE'] = self::decodeBbCode($block['MESSAGE']); } } } } return $isCollection? $attach: $attach[0]; } public function IsEmpty() { return empty($this->result['BLOCKS']); } public function IsAllowSize() { return $this->GetJSON()? true: false; } public function SetId($id) { $this->result['ID'] = $id; return true; } public function GetId() { return $this->result['ID']; } public function GetArray() { return $this->result; } public function GetJSON() { $result = \Bitrix\Main\Web\Json::encode($this->result); return strlen($result) < 60000? $result: ""; } } class CIMMessageLink { private $result = false; private $message = ""; private $attach = Array(); private $urlId = Array(); private $staticUrl = Array(); public function prepareInsert($text) { $this->message = $text; $parser = new CTextParser(); $parser->allow = array("ANCHOR" => "Y", "USER" => "N", "NL2BR" => "N", "HTML" => "Y", "BIU" => "N", "IMG" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "LIST" => "N", "SMILES" => "N", "VIDEO" => "N", "TABLE" => "N", "ALIGN" => "N"); $convertedText = preg_replace('#\-{54}.+?\-{54}#s', "xxx", $this->message); $convertedText = $parser->convertText($convertedText); preg_replace_callback('#<a\s+href="(?P<URL>[^"]+?)".+?>(?P<TEXT>.+?)</a>#', array($this, "prepareUrlObjects"), $convertedText, 1); return $this->result(); } private function prepareUrlObjects($params) { $params['URL'] = htmlspecialcharsback($params['URL']); $linkParam = UrlPreview\UrlPreview::getMetadataAndHtmlByUrl($params['URL'], true, false); if (!$linkParam) return '[URL='.$params['URL'].']'.$params['TEXT'].'[/URL]'; $attach = self::formatAttach($linkParam); if (!$attach) { return '[URL='.$params['URL'].']'.$params['TEXT'].'[/URL]'; } $this->attach[$linkParam['ID']] = $attach; $this->urlId[$linkParam['ID']] = $linkParam['ID']; if ($linkParam['TYPE'] == UrlPreview\UrlMetadataTable::TYPE_STATIC) { $this->staticUrl[] = $params['URL']; if (substr($params['URL'], -1) == '/') { $this->staticUrl[] = substr($params['URL'], 0, -1); } } $this->result = true; return '[URL='.$params['URL'].']'.$params['TEXT'].'[/URL]'; } public static function prepareShow($arMessages, $params) { $arUrl = Array(); foreach ($params as $messageId => $param) { if (isset($param['URL_ID'])) { foreach ($param['URL_ID'] as $urlId) { $urlId = intval($urlId); if ($urlId > 0) { $arUrl[$urlId] = $urlId; } } } } if (!empty($arUrl)) { $arAttachUrl = self::getAttachments($arUrl, true); if (!empty($arAttachUrl)) { foreach ($params as $messageId => $param) { if (isset($param['URL_ID'])) { foreach ($param['URL_ID'] as $urlId) { if (isset($arAttachUrl[$urlId])) { $arMessages[$messageId]['params']['ATTACH'][] = $arAttachUrl[$urlId]; } } } } } } return $arMessages; } public static function getAttachments($id, $typeArray = false) { $attachArray = Array(); if (is_array($id)) { foreach ($id as $key => $value) { $id[$key] = intval($value); } } else { $id = array(intval($id)); } if ($params = UrlPreview\UrlPreview::getMetadataAndHtmlByIds($id)) { foreach ($params as $id => $linkParam) { if ($attach = self::formatAttach($linkParam)) { $attachArray[$id] = $typeArray? $attach->GetArray(): $attach; } } } return $attachArray; } public static function formatAttach($linkParam) { $attach = null; if ($linkParam['TYPE'] == UrlPreview\UrlMetadataTable::TYPE_STATIC) { if ($linkParam['EXTRA']['PEER_IP_PRIVATE'] && IM\User::getInstance()->isExtranet()) { return $attach; } if (intval($linkParam['IMAGE_ID']) > 0) { $image = CFile::ResizeImageGet( $linkParam['IMAGE_ID'], array('width' => 450, 'height' => 120), BX_RESIZE_IMAGE_PROPORTIONAL, false, false, true ); $linkParam['IMAGE_ID'] = empty($image['src'])? '': $image['src']; } else if (strlen($linkParam['IMAGE']) > 0) { $linkParam['IMAGE_ID'] = $linkParam['IMAGE']; } else { $linkParam['IMAGE_ID'] = ''; } $attach = new CIMMessageParamAttach($linkParam['ID'], CIMMessageParamAttach::TRANSPARENT); $attach->AddRichLink(Array( "NAME" => $linkParam['TITLE'], "DESC" => $linkParam['DESCRIPTION'], "LINK" => $linkParam['URL'], "PREVIEW" => $linkParam['IMAGE_ID'] )); } else if ($linkParam['TYPE'] == UrlPreview\UrlMetadataTable::TYPE_DYNAMIC) { $attach = UrlPreview\UrlPreview::getImAttach($linkParam['URL'], true); if ($attach && $attach instanceof CIMMessageParamAttach) { $attach->SetId($linkParam['ID']); } } return $attach; } private function isLinkOnly() { $message = $this->message; foreach ($this->staticUrl as $url) { $message = str_replace($url, '', $message); } $message = trim($message); return empty($message); } public function result() { return Array( 'RESULT' => $this->result, 'MESSAGE' => $this->message, 'MESSAGE_IS_LINK' => $this->isLinkOnly(), 'URL_ID' => array_values($this->urlId), 'ATTACH' => array_values($this->attach), ); } } ?>