%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),
);
}
}
?>