403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/im.messenger/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/im.messenger/im.ajax.php
<?
if (!defined('IM_AJAX_INIT'))
{
	define("IM_AJAX_INIT", true);
	define("PUBLIC_AJAX_MODE", true);
	define("NO_KEEP_STATISTIC", "Y");
	define("NO_AGENT_STATISTIC","Y");
	define("NOT_CHECK_PERMISSIONS", true);
	require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
}
header('Content-Type: application/x-javascript; charset='.LANG_CHARSET);

IncludeModuleLangFile(__FILE__);

global $APPLICATION;
$APPLICATION->RestartBuffer();

// NOTICE
// Before execute next code, execute file /module/im/ajax_hit.php
// for skip onProlog events

if (!CModule::IncludeModule("im"))
{
	echo \Bitrix\Im\Common::objectEncode(Array('ERROR' => GetMessage('IM_MODULE_NOT_INSTALLED')));
	CMain::FinalActions();
	die();
}

if(!$USER->IsAuthorized())
{
	$USER->LoginByCookies();
}

if (intval($USER->GetID()) <= 0)
{
	// TODO need change AUTHORIZE ERROR callbacks
	//header("HTTP/1.0 401 Not Authorized");
	//header("Content-Type: application/x-javascript");
	//header("BX-Authorize: ".bitrix_sessid());

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => 'AUTHORIZE_ERROR',
		'BITRIX_SESSID' => bitrix_sessid()
	));
	CMain::FinalActions();
	die();
}
if (!$USER->IsJustAuthorized() && !check_bitrix_sessid())
{
	if (\Bitrix\Im\User::getInstance($USER->GetID())->isConnector())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => '',
			'REAL_ERROR' => 'SESSION_ERROR',
		));
	}
	else
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'SESSION_ERROR',
			'BITRIX_SESSID' => bitrix_sessid(),
		));
	}
	CMain::FinalActions();
	die();
}

if (\Bitrix\Im\User::getInstance($USER->GetID())->isConnector())
{
	if (!(
		$_POST['IM_START_WRITING'] == 'Y' ||
		$_POST['IM_SEND_MESSAGE'] == 'Y' ||
		$_POST['IM_EDIT_MESSAGE'] == 'Y' ||
		$_POST['IM_LIKE_MESSAGE'] == 'Y' ||
		$_POST['IM_DELETE_MESSAGE'] == 'Y' ||
		$_POST['IM_READ_MESSAGE'] == 'Y' ||
		$_POST['IM_UNREAD_MESSAGE'] == 'Y' ||
		$_POST['IM_FILE_REGISTER'] == 'Y' ||
		$_POST['IM_FILE_UPLOAD'] == 'Y' ||
		$_POST['IM_FILE_UNREGISTER'] == 'Y' ||
		$_POST['IM_FILE_DELETE'] == 'Y' ||
		$_POST['IM_UPDATE_STATE'] == 'Y' ||
		$_POST['IM_LOAD_LAST_MESSAGE'] == 'Y' ||
		$_POST['IM_HISTORY_LOAD_MORE'] == 'Y' ||
		$_POST['IM_LOAD_CONTEXT_MESSAGE'] == 'Y' ||
		$_POST['IM_URL_ATTACH_DELETE'] == 'Y' ||
		$_POST['IM_LOAD_MESSAGE_BY_DATE'] == 'Y' ||
		$_POST['IM_LINES_VOTE_SEND'] == 'Y' ||
		$_POST['IM_OPEN_LINES_CLIENT'] == 'Y'
	))
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'SCOPE_ERROR'
		));
		CMain::FinalActions();
		die();
	}
}

CIMContactList::SetOnline();

if (isset($_REQUEST["mobile_action"]) && $_POST['FOCUS'] == 'Y' && CModule::IncludeModule('mobile'))
{
	Bitrix\Mobile\User::setOnline();
}

if (isset($_POST['desktop_action']) && $_POST['desktop_action'] == 'Y')
{
	CIMMessenger::SetDesktopStatusOnline();
}

if (!function_exists('isImPostRequest'))
{
	function isImPostRequest(string $method): bool
	{
		if (!$_POST || !isset($_POST[$method]) || $_POST[$method] !== 'Y')
		{
			return false;
		}

		return true;
	}
}

if (isImPostRequest('IM_AVATAR_UPDATE'))
{
	$userId = $USER->GetId();
	$chatId = intval($_POST['CHAT_ID']);
	if (!\Bitrix\Im\Chat::isActionAllowed('chat' . $chatId, 'AVATAR'))
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'UPLOAD_ERROR'
		));
	}
	else
	{
		$uploader = new \Bitrix\Main\UI\Uploader\Uploader(array(
			"allowUpload" => "I",
			"events" => array("onFileIsUploaded" => array("CIMDisk", "UploadAvatar")),
			"storage" => array("moduleId" => "im")
		));
		if (!$uploader->checkPost())
		{
			echo \Bitrix\Im\Common::objectEncode(Array(
				'ERROR' => 'UPLOAD_ERROR'
			));
		}
	}
}
else if (isImPostRequest('IM_FILE_UPLOAD'))
{
	$uploader = new \Bitrix\Main\UI\Uploader\Uploader(array(
		"allowUpload" => "A",
		"events" => array(
			"onFileIsUploaded" => array("CIMDisk", "UploadFile")
		),
		"storage" => array(
			"moduleId" => "im"
		)
	));
	if (!$uploader->checkPost())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'UPLOAD_ERROR'
		));
	}
}
else if (isImPostRequest('IM_FILE_REGISTER'))
{
	$errorMessage = '';
	$_POST['FILES'] = CUtil::JsObjectToPhp($_POST['FILES']);

	$result = CIMDisk::UploadFileRegister($_POST['CHAT_ID'], $_POST['FILES'], $_POST['TEXT'], $_POST['OL_SILENT'] == 'Y');
	if (!$result)
	{
		$errorMessage = 'ERROR';
	}

	if ($_POST['TEXT'])
	{
		$ar['MESSAGE'] = trim(str_replace(Array('[BR]', '[br]'), "\n", $_POST['TEXT']));
		$ar['MESSAGE'] = preg_replace("/\[DISK\=([0-9]+)\]/i", "", $ar['MESSAGE']);
		$ar['MESSAGE'] = \Bitrix\Im\Text::parse($ar['MESSAGE']);
	}
	else
	{
		$ar['MESSAGE'] = '';
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'FILE_ID' => $result['FILE_ID'],
		'CHAT_ID' => $_POST['CHAT_ID'],
		'RECIPIENT_ID' => $_POST['RECIPIENT_ID'],
		'MESSAGE_TEXT' => $ar['MESSAGE'],
		'MESSAGE_ID' => $result['MESSAGE_ID'],
		'MESSAGE_TMP_ID' => $_POST['MESSAGE_TMP_ID'],
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_FILE_UNREGISTER'))
{
	$_POST['FILES'] = CUtil::JsObjectToPhp($_POST['FILES']);
	$_POST['MESSAGES'] = CUtil::JsObjectToPhp($_POST['MESSAGES']);

	$result = CIMDisk::UploadFileUnRegister($_POST['CHAT_ID'], $_POST['FILES'], $_POST['MESSAGES']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => !$result? 'ERROR': ''
	));
}
else if (isImPostRequest('IM_FILE_DELETE'))
{
	$result = CIMDisk::DeleteFile($_POST['CHAT_ID'], $_POST['FILE_ID']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $_POST['CHAT_ID'],
		'FILE_ID' => $_POST['FILE_ID'],
		'ERROR' => !$result? 'ERROR': ''
	));
}
else if (isImPostRequest('IM_FILE_SAVE_TO_DISK'))
{
	$result = CIMDisk::SaveToLocalDisk($_POST['FILE_ID']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $_POST['CHAT_ID'],
		'FILE_ID' => $_POST['FILE_ID'],
		'NEW_FILE_ID' => $result? $result['FILE']->getId(): 0,
		'ERROR' => !$result? 'ERROR': ''
	));
}
else if (isImPostRequest('IM_FILE_UPLOAD_FROM_DISK'))
{
	$errorMessage = '';

	$_POST['FILES'] = CUtil::JsObjectToPhp($_POST['FILES']);

	$result = CIMDisk::UploadFileFromDisk($_POST['CHAT_ID'], $_POST['FILES'], $_POST['MESSAGE'], [
		'LINES_SILENT_MODE' => $_POST['OL_SILENT'] == 'Y',
		//'SYMLINK' => true
	]);
	if (!$result)
	{
		$errorMessage = 'ERROR';
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'FILES' => $result['FILES'],
		'CHAT_ID' => $_POST['CHAT_ID'],
		'RECIPIENT_ID' => $_POST['RECIPIENT_ID'],
		'MESSAGE_ID' => $result['MESSAGE_ID'],
		'MESSAGE_TMP_ID' => $_POST['MESSAGE_TMP_ID'],
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_HISTORY_FILES_LOAD'))
{
	$chatId = intval($_POST['CHAT_ID']);
	$historyPage = isset($_POST['PAGE_ID']) ? intval($_POST['PAGE_ID']) : 0;
	$historyPage = $historyPage>0? $historyPage: 1;

	$arFiles = CIMDisk::GetHistoryFiles($chatId, $historyPage);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $chatId,
		'FILES' => $arFiles, // TODO remove this in next year 2022
		'FILE_LIST' => array_values($arFiles),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_HISTORY_FILES_SEARCH'))
{
	$chatId = intval($_POST['CHAT_ID']);
	$arFiles = CIMDisk::GetHistoryFilesByName($chatId, $_POST['SEARCH']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $chatId,
		'FILES' => $arFiles,
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_UPDATE_STATE') || isImPostRequest('IM_UPDATE_STATE_LIGHT'))
{
	$arResult['LAST_UPDATE'] = (new \Bitrix\Main\Type\DateTime())->format(DateTimeInterface::RFC3339);

	$arResult["REVISION"] = \Bitrix\Im\Revision::getWeb();
	$arResult["MOBILE_REVISION"] = \Bitrix\Im\Revision::getMobile();
	$arResult["DISK_REVISION"] = COption::GetOptionString("disk", "disk_revision_api", -1);

	$arResult['SERVER_TIME'] = time();

	// Online
	$arOnline = CIMStatus::GetList();

	// Counters
	$arResult["COUNTERS"] = CUserCounter::GetValues($USER->GetID(), $_POST['SITE_ID']);

	if (CIMMail::IsExternalMailAvailable())
	{
		$arResult["MAIL_COUNTER"] = intval($arResult["COUNTERS"]["mail_unseen"]);
	}
	else if (CModule::IncludeModule("dav"))
	{
		// Exchange
		$ar = CDavExchangeMail::GetTicker($GLOBALS["USER"]);
		if ($ar !== null)
		{
			$arResult["MAIL_COUNTER"] = intval($ar["numberOfUnreadMessages"]);
		}
	}

	$arResult["INTRANET_USTAT_ONLINE_DATA"] = [];
	if (
		$_POST["IS_DESKTOP"] !== "Y"
		&& CModule::IncludeModule("intranet")
	)
	{
		$ustatOnline = new \Bitrix\Intranet\Component\UstatOnline;
		if (!$ustatOnline->isFullAnimationMode())
		{
			$arResult["INTRANET_USTAT_ONLINE_DATA"] = $ustatOnline->getCurrentOnlineUserData();
		}
	}

	$counters = \Bitrix\Im\Counter::get(null, ['JSON' => 'Y']);
	$counters['type']['mail'] = (int)$arResult["MAIL_COUNTER"];

	$isOperator = $_POST["IS_OPERATOR"] === 'Y';

	$recent = [];
	$getOriginalTextOption = isImPostRequest('IM_UPDATE_STATE') ? 'Y' : 'N';
	if (isset($_POST['RECENT_LAST_UPDATE']) && $_POST['RECENT_LAST_UPDATE'] !== 'N')
	{
		try
		{
			$lastUpdate = new \Bitrix\Main\Type\DateTime($_POST['RECENT_LAST_UPDATE'], DateTimeInterface::RFC3339);
			$recent = \Bitrix\Im\Recent::get(null, [
				'LAST_SYNC_DATE' => $lastUpdate,
				'SKIP_NOTIFICATION' => 'Y',
				'SKIP_OPENLINES' => ($isOperator? 'Y': 'N'),
				'GET_ORIGINAL_TEXT' => $getOriginalTextOption,
				'JSON' => 'Y'
			]);
		}
		catch (Exception $e){}
	}

	$linesList = [];
	if (isset($_POST['LINES_LAST_UPDATE']) && $_POST['LINES_LAST_UPDATE'] !== 'N')
	{
		try
		{
			$lastUpdate = new \Bitrix\Main\Type\DateTime($_POST['LINES_LAST_UPDATE'], DateTimeInterface::RFC3339);
			$linesList = \Bitrix\Im\Recent::get(null, [
				'LAST_SYNC_DATE' => $lastUpdate,
				'ONLY_OPENLINES' => 'Y',
				'GET_ORIGINAL_TEXT' => $getOriginalTextOption,
				'JSON' => 'Y'
			]);
		}
		catch (Exception $e){}
	}

	$arSend = [
		'REVISION' => $arResult["REVISION"],
		'MOBILE_REVISION' => $arResult["MOBILE_REVISION"],
		'DISK_REVISION' => $arResult["DISK_REVISION"],
		'RECENT' => $recent,
		'LINES_LIST' => $linesList,
		'COUNTERS' => $arResult["COUNTERS"],
		'CHAT_COUNTERS' => $counters,
		'NOTIFY_LAST_ID' => (new \Bitrix\Im\Notify())->getLastId(),
		'ONLINE' => !empty($arOnline)? $arOnline['users']: array(),
		'XMPP_STATUS' => CIMMessenger::CheckXmppStatusOnline()? 'Y':'N',
		'DESKTOP_STATUS' => CIMMessenger::CheckDesktopStatusOnline()? 'Y':'N',
		'INTRANET_USTAT_ONLINE_DATA' => $arResult["INTRANET_USTAT_ONLINE_DATA"],
		'SERVER_TIME' => time(),
		'LAST_UPDATE' => $arResult['LAST_UPDATE'],
		'ERROR' => ""
	];
	echo \Bitrix\Im\Common::objectEncode($arSend, true);
}
else if (isImPostRequest('IM_NOTIFY_LOAD'))
{
	$CIMNotify = new CIMNotify();
	$arNotify = $CIMNotify->GetUnreadNotify(Array('SPEED_CHECK' => 'N', 'USE_TIME_ZONE' => 'N'));
	if ($arNotify['result'])
	{
		$arSend['NOTIFY'] = $arNotify['notify'];
		$arSend['UNREAD_NOTIFY'] = $arNotify['unreadNotify'];
		$arSend['ERROR'] = '';

		if (count($arNotify['notify']))
		{
			$minNotify = min(array_keys($arNotify['notify']));
			if (
				$minNotify > 0
				&& (!isset($_POST['IM_AUTO_READ']) || $_POST['IM_AUTO_READ'] == 'Y')
			)
			{
				$CIMNotify->MarkNotifyRead($minNotify, true);
			}
		}
	}
	echo \Bitrix\Im\Common::objectEncode($arSend);
}
else if (isImPostRequest('IM_NOTIFY_HISTORY_LOAD_MORE'))
{
	if (CIMMessenger::IsBitrix24UserRestricted())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => GetMessage('IM_ACCESS_ERROR')
		));
		CMain::FinalActions();
		die();
	}

	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	$arNotify = $CIMNotify->GetNotifyList(Array('PAGE' => $_POST['PAGE'], 'USE_TIME_ZONE' => 'N'));

	echo \Bitrix\Im\Common::objectEncode(Array(
		'NOTIFY' => $arNotify,
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_SEND_MESSAGE'))
{
	if (
		CIMMessenger::IsBitrix24UserRestricted()
		|| !\Bitrix\Im\Chat::isActionAllowed($_POST['RECIPIENT_ID'], 'SEND')
	)
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => GetMessage('IM_ACCESS_ERROR')
		));
		CMain::FinalActions();
		die();
	}

	$insertID = 0;
	$errorMessage = "";
	if ($_POST['CHAT'] == 'Y' && mb_substr($_POST['RECIPIENT_ID'], 0, 4) == 'chat')
	{
		$userId = $USER->GetId();
		$chatId = intval(mb_substr($_POST['RECIPIENT_ID'], 4));
		if (CIMChat::GetGeneralChatId() == $chatId && !CIMChat::CanSendMessageToGeneralChat($userId))
		{
			$errorMessage = GetMessage('IM_ERROR_GROUP_CANCELED');
		}
		else
		{
			$ar = Array(
				"FROM_USER_ID" => $userId,
				"TO_CHAT_ID" => $chatId,
				"MESSAGE" 	 => $_POST['MESSAGE'],
				"SILENT_CONNECTOR" => $_POST['OL_SILENT'] == 'Y'?'Y':'N',
				"TEMPLATE_ID" => $_POST['ID'],
			);
			$insertID = CIMChat::AddMessage($ar);
		}
	}
	else if (mb_substr($_POST['RECIPIENT_ID'], 0, 4) != 'chat' && !\Bitrix\Im\User::getInstance($USER->GetID())->isConnector())
	{
		$ar = Array(
			"FROM_USER_ID" => intval($USER->GetID()),
			"TO_USER_ID" => intval($_POST['RECIPIENT_ID']),
			"MESSAGE" 	 => $_POST['MESSAGE'],
			"TEMPLATE_ID" => $_POST['ID'],
		);
		$insertID = CIMMessage::Add($ar);
	}
	else
	{
		$errorMessage = GetMessage('IM_ACCESS_ERROR');
	}

	if (!$insertID && !$errorMessage)
	{
		if ($e = $GLOBALS["APPLICATION"]->GetException())
			$errorMessage = $e->GetString();
		if ($errorMessage == '')
			$errorMessage = GetMessage('IM_UNKNOWN_ERROR');
	}

	if (!\CIMMessenger::IsMobileRequest())
	{
		CIMStatus::Set($USER->GetId(), Array('IDLE' => null));
	}

	$message = CIMMessenger::GetById($insertID, Array('WITH_FILES' => 'Y'));
	$arMessages[$insertID]['params'] = $message['PARAMS'] ?? null;

	$arMessages = CIMMessageLink::prepareShow($arMessages, Array($insertID => $message['PARAMS'] ?? null));

	$ar['MESSAGE'] = trim(str_replace(Array('[BR]', '[br]'), "\n", $_POST['MESSAGE']));
	$ar['MESSAGE'] = preg_replace("/\[DISK\=([0-9]+)\]/i", "", $ar['MESSAGE']);

	$userTzOffset = isset($_POST['USER_TZ_OFFSET'])? intval($_POST['USER_TZ_OFFSET']): CTimeZone::GetOffset();
	$arResult = Array(
		'TMP_ID' => $_POST['ID'],
		'ID' => $insertID,
		'CHAT_ID' => $message['CHAT_ID'] ?? null,
		'SEND_DATE' => new \Bitrix\Main\Type\DateTime(),
		'SEND_MESSAGE' => \Bitrix\Im\Text::parse($ar['MESSAGE']),
		'SEND_MESSAGE_PARAMS' => $arMessages[$insertID]['params'],
		'SEND_MESSAGE_FILES' => $message['FILES'] ?? null,
		'SENDER_ID' => intval($USER->GetID()),
		'RECIPIENT_ID' => $_POST['CHAT'] == 'Y'? htmlspecialcharsbx($_POST['RECIPIENT_ID']): intval($_POST['RECIPIENT_ID']),
		'OL_SILENT' => $_POST['OL_SILENT'],
		'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 \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_BOT_COMMAND'))
{
	$messageId = intval($_POST['MESSAGE_ID']);
	$userId = $USER->GetId();

	$errorMessage = 'ACCESS_DENIED';

	$orm = \Bitrix\Im\Model\MessageTable::getById($messageId);
	if($message = $orm->fetch())
	{
		$orm = \Bitrix\Im\Model\ChatTable::getById($message['CHAT_ID']);
		$chat = $orm->fetch();
		$relations = \CIMChat::GetRelationById($message['CHAT_ID'], false, true, false);
		if (isset($relations[$userId]))
		{
			if (mb_substr($_POST['DIALOG_ID'], 0, 4) == 'chat')
			{
				$messageFields = Array(
					"FROM_USER_ID" => $userId,
					"TO_CHAT_ID" => $message['CHAT_ID'],
					"MESSAGE"  => '/'.$_POST['COMMAND'].' '.$_POST['COMMAND_PARAMS'],
				);
			}
			else
			{
				$messageFields = Array(
					"FROM_USER_ID" => $userId,
					"TO_USER_ID" => intval($_POST['BOT_ID']),
					"MESSAGE"  => '/'.$_POST['COMMAND'].' '.$_POST['COMMAND_PARAMS'],
				);
			}
			$messageFields['MESSAGE_TYPE'] = $relations[$userId]['MESSAGE_TYPE'];
			$messageFields['AUTHOR_ID'] = $userId;

			$messageFields['COMMAND_CONTEXT'] = $_POST['COMMAND_CONTEXT'] === 'MENU'? 'MENU': 'KEYBOARD';
			$messageFields['CHAT_ENTITY_TYPE'] = $chat['ENTITY_TYPE'];
			$messageFields['CHAT_ENTITY_ID'] = $chat['ENTITY_ID'];

			$result = \Bitrix\Im\Command::onCommandAdd($messageId, $messageFields);
			$errorMessage = '';
		}
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_EDIT_MESSAGE'))
{
	if(!CIMMessenger::Update($_POST['ID'], $_POST['MESSAGE']))
	{
		$arResult = Array(
			'ERROR' => 'CANT_EDIT_MESSAGE'
		);
	}
	else
	{
		$userTzOffset = isset($_POST['USER_TZ_OFFSET'])? intval($_POST['USER_TZ_OFFSET']): CTimeZone::GetOffset();

		$arResult = Array(
			'ID' => $insertID ?? 0,
			'MESSAGE' => \Bitrix\Im\Text::parse($_POST['MESSAGE']),
			'DATE' => new \Bitrix\Main\Type\DateTime(),
			'ERROR' => ''
		);
	}

	echo \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_DELETE_MESSAGE'))
{
	$errorMessage = '';
	if(!CIMMessenger::Delete($_POST['ID']))
	{
		$errorMessage = 'CANT_EDIT_MESSAGE';
	}

	$arResult = Array(
		'ERROR' => $errorMessage
	);
	echo \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_SHARE_MESSAGE'))
{
	$errorMessage = '';
	if(!CIMMessenger::Share($_POST['ID'], $_POST['TYPE'], $_POST['DATE']))
	{
		$errorMessage = 'CANT_SHARE_MESSAGE';
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_URL_ATTACH_DELETE'))
{
	$errorMessage = '';

	$result = CIMMessenger::UrlAttachDelete($_POST['ID'], $_POST['ATTACH_ID']);

	$arResult = Array(
		'ERROR' => $errorMessage
	);
	echo \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_LINES_VOTE_SEND'))
{
	CIMMessenger::LinesSessionVote($_POST['DIALOG_ID'], $_POST['MESSAGE_ID'], $_POST['RATING']);

	$arResult = Array(
		'ERROR' => ''
	);
	echo \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_LIKE_MESSAGE'))
{
	$errorMessage = '';
	$result = CIMMessenger::Like($_POST['ID'], $_POST['ACTION']);
	if ($result === false)
		$errorMessage = 'WITHOUT_CHANGES';

	$arResult = Array(
		'LIKE' => $result,
		'ERROR' => $errorMessage
	);
	echo \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_READ_MESSAGE'))
{
	if (CIMMessenger::IsBitrix24UserRestricted())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => GetMessage('IM_ACCESS_ERROR')
		));
		CMain::FinalActions();
		die();
	}

	$errorMessage = "";

	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
	{
		$CIMChat = new CIMChat();
		$CIMChat->SetReadMessage(intval(mb_substr($_POST['USER_ID'], 4)), (isset($_POST['LAST_ID']) && intval($_POST['LAST_ID'])>0 ? $_POST['LAST_ID']: null));
	}
	else
	{
		$CIMMessage = new CIMMessage();
		$CIMMessage->SetReadMessage($_POST['USER_ID'], (isset($_POST['LAST_ID']) && intval($_POST['LAST_ID'])>0 ? $_POST['LAST_ID']: null));
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'USER_ID' => htmlspecialcharsbx($_POST['USER_ID']),
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_UNREAD_MESSAGE'))
{
	$errorMessage = "";
	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
	{
		$CIMChat = new CIMChat();
		$CIMChat->SetUnReadMessage(intval(mb_substr($_POST['USER_ID'], 4)), (isset($_POST['LAST_ID']) && intval($_POST['LAST_ID'])>0 ? $_POST['LAST_ID']: null));
	}
	else
	{
		$CIMMessage = new CIMMessage();
		$CIMMessage->SetUnReadMessage($_POST['USER_ID'], (isset($_POST['LAST_ID']) && intval($_POST['LAST_ID'])>0 ? $_POST['LAST_ID']: null));
	}
	echo \Bitrix\Im\Common::objectEncode(Array(
		'USER_ID' => htmlspecialcharsbx($_POST['USER_ID']),
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_LOAD_LAST_MESSAGE'))
{
	if (CIMMessenger::IsBitrix24UserRestricted())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'ACCESS_DENIED'
		));
		CMain::FinalActions();
		die();
	}

	$error = '';
	$arMessage = Array();

	$entityType = '';
	$entityId = '';
	if ($_POST['CHAT'] == 'Y')
	{
		if (mb_substr($_POST['USER_ID'], 0, 3) == 'crm')
		{
			$chatId = CIMChat::GetCrmChatId(mb_substr($_POST['USER_ID'], 4));
		}
		else if (mb_substr($_POST['USER_ID'], 0, 2) == 'sg')
		{
			$chatId = CIMChat::GetSonetGroupChatId(mb_substr($_POST['USER_ID'], 2));
		}
		else
		{
			$chatId = intval(mb_substr($_POST['USER_ID'], 4));
		}

		if ($chatId > 0)
		{
			$CIMChat = new CIMChat();
			$arMessage = $CIMChat->GetLastMessage($chatId, false, ($_POST['USER_LOAD'] == 'Y'? true: false), false);
		}
		else
		{
			$arMessage = false;
		}

		if (!$arMessage || $_POST['USER_LOAD'] == 'Y' && empty($arMessage['chat']) || isset($arMessage['chat'][$chatId]) && !in_array($arMessage['chat'][$chatId]['message_type'], CIMChat::getGroupTypes()))
		{
			$arMessage = Array();
			$error = 'ACCESS_DENIED';
		}
		else if (isset($arMessage['message']))
		{
			foreach ($arMessage['message'] as $id => $ar)
				$arMessage['message'][$id]['recipientId'] = 'chat'.$ar['recipientId'];

			$arMessage['usersMessage']['chat'.$chatId] = $arMessage['usersMessage'][$chatId];
			unset($arMessage['usersMessage'][$chatId]);
			if (isset($_POST['READ']) && $_POST['READ'] == 'Y')
				$CIMChat->SetReadMessage($chatId);

			$orm = \Bitrix\Im\Model\ChatTable::getById($chatId);
			$chatData = $orm->fetch();

			$diskFolderId = (int)$chatData['DISK_FOLDER_ID'];
			$entityType = $chatData['ENTITY_TYPE'];
			$entityId = $chatData['ENTITY_ID'];
		}
	}
	else
	{
		$networkUserId = 0;
		if (
			mb_substr($_POST['USER_ID'], 0, 12) == 'networkLines'
			&& CModule::IncludeModule('imbot')
		)
		{
			$userId = \Bitrix\ImBot\Bot\Network::join(mb_substr($_POST['USER_ID'], 12));
			if ($userId > 0)
			{
				$networkUserId = $_POST['USER_ID'];
				$_POST['USER_ID'] = $userId;
			}
		}
		else if (mb_substr($_POST['USER_ID'], 0, 7) == 'network')
		{
			$userId = \CIMContactList::PrepareUserId($_POST['USER_ID'], $_POST['SEARCH_MARK']);
			if ($userId > 0)
			{
				$networkUserId = $_POST['USER_ID'];
				$_POST['USER_ID'] = $userId;
			}
		}

		$chatId = 0;
		if (CIMContactList::AllowToSend(Array('TO_USER_ID' => $_POST['USER_ID'])))
		{
			$CIMMessage = new CIMMessage();
			$arMessage = $CIMMessage->GetLastMessage(intval($_POST['USER_ID']), false, ($_POST['USER_LOAD'] == 'Y'? true: false), false);
			if (isset($_POST['READ']) && $_POST['READ'] == 'Y')
				$CIMMessage->SetReadMessage(intval($_POST['USER_ID']));

			if (
				$_POST['USER_LOAD'] == 'Y'
				&& $_POST['USER_ID'] != $USER->GetId()
				&& $arMessage && isset($arMessage['users']) && count($arMessage['users']) <= 1
			)
			{
				$arMessage = Array();
				$error = 'ACCESS_DENIED';
			}
			else
			{
				$chatId = $arMessage['chatId'];
				if ($chatId <= 0)
				{
					$chatId = CIMMessage::GetChatId($USER->GetId(), $_POST['USER_ID']);
				}

				$orm = \Bitrix\Im\Model\ChatTable::getById($chatId);
				$chatData = $orm->fetch();

				if ($chatData === false)
				{
					$chatData = [
						'DISK_FOLDER_ID' => null,
						'ENTITY_TYPE' => null,
						'ENTITY_ID' => null,
					];
				}
				$diskFolderId = (int)($chatData['DISK_FOLDER_ID']);
				$entityType = $chatData['ENTITY_TYPE'];
				$entityId = $chatData['ENTITY_ID'];
			}
		}
		else
		{
			$arMessage = Array();
			$error = 'ACCESS_DENIED';
		}
	}

	if ($error == '')
	{
		$relation = \CIMChat::GetRelationById($chatId, false, true, false);

		$dialogId = $_POST['USER_ID'];
		$userId = $USER->GetId();
		foreach(GetModuleEvents("im", "OnLoadLastMessage", true) as $arEvent)
		{
			ExecuteModuleEventEx($arEvent, array($chatId, $dialogId, $entityType, $entityId, $userId));
		}
	}

	if (!\CIMMessenger::IsMobileRequest())
	{
		CIMStatus::Set($USER->GetId(), Array('IDLE' => null));
	}

	if (
		$chatData['TYPE'] == Bitrix\Im\V2\Chat::IM_TYPE_OPEN_LINE
		&& \Bitrix\Main\Loader::includeModule('imopenlines')
		&& class_exists('\Bitrix\ImOpenLines\Recent')
	)
	{
		$userIds = \Bitrix\ImOpenLines\Recent::getUserIdsByChatId((int)$chatId);
		if (!isset($arMessage['userInChat'][(string)$chatId]))
		{
			$arMessage['userInChat'][(string)$chatId] = $userIds;
		}
		else
		{
			$arMessage['userInChat'][(string)$chatId] = array_unique(array_merge($arMessage['userInChat'][(string)$chatId], $userIds));
		}
		$arMessage['userInChat'][(string)$chatId] = array_values($arMessage['userInChat'][(string)$chatId] ?? []);
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'REVISION' => \Bitrix\Im\Revision::getWeb(),
		'MOBILE_REVISION' => \Bitrix\Im\Revision::getMobile(),
		'CHAT_ID' => $chatId,
		'DISK_FOLDER_ID' => $diskFolderId,
		'USER_ID' => $_POST['CHAT'] == 'Y'? htmlspecialcharsbx($_POST['USER_ID']): intval($_POST['USER_ID']),
		'MESSAGE' => isset($arMessage['message'])? $arMessage['message']: Array(),
		'USERS_MESSAGE' => isset($arMessage['usersMessage'])? $arMessage['usersMessage']: Array(),
		'UNREAD_MESSAGE' => isset($arMessage['unreadMessage'])? $arMessage['unreadMessage']: Array(),
		'USERS' => isset($arMessage['users'])? $arMessage['users']: Array(),
		'USER_IN_GROUP' => isset($arMessage['userInGroup'])? $arMessage['userInGroup']: Array(),
		'CHAT' => isset($arMessage['chat'])? $arMessage['chat']: Array(),
		'USER_BLOCK_CHAT' => isset($arMessage['userChatBlockStatus'])? $arMessage['userChatBlockStatus']: Array(),
		'USER_IN_CHAT' => isset($arMessage['userInChat'])? $arMessage['userInChat']: Array(),
		'USER_LOAD' => $_POST['USER_LOAD'] == 'Y'? 'Y': 'N',
		'READED_LIST' => isset($arMessage['readedList'])? $arMessage['readedList']: Array(),
		'PHONES' => isset($arMessage['phones'])? $arMessage['phones']: Array(),
		'FILES' => isset($arMessage['files'])? $arMessage['files']: Array(),
		'LINES' => isset($arMessage['lines'])? $arMessage['lines']: Array(),
		'OPENLINES' => isset($arMessage['openlines'])? $arMessage['openlines']: Array(),
		'NETWORK_ID' => isset($networkUserId) && $networkUserId ? $networkUserId : '',
		'ERROR' => $error
	));
}
else if (isImPostRequest('IM_USER_DATA_LOAD'))
{
	$error = '';
	$arMessage = Array();
	$chatId = 0;
	if (CIMContactList::AllowToSend(Array('TO_USER_ID' => $_POST['USER_ID'])))
	{
		$ar = CIMContactList::GetUserData(array(
				'ID' => Array($_POST['USER_ID'], $USER->GetID()),
				'DEPARTMENT' => 'Y',
				'USE_CACHE' => 'N',
				'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
			)
		);
		$arMessage['users'] = $ar['users'];
		$arMessage['userInGroup']  = $ar['userInGroup'];
		$arMessage['phones']  = $ar['phones'];
		$chatId = CIMMessage::GetChatId($USER->GetId(), $_POST['USER_ID']);
	}
	else
	{
		$error = 'ACCESS_DENIED';
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $chatId,
		'USER_ID' => intval($_POST['USER_ID']),
		'USERS' => isset($arMessage['users'])? $arMessage['users']: Array(),
		'USER_IN_GROUP' => isset($arMessage['userInGroup'])? $arMessage['userInGroup']: Array(),
		'PHONES' => isset($arMessage['phones'])? $arMessage['phones']: Array(),
		'ERROR' => $error
	));
}
else if (isImPostRequest('IM_HISTORY_LOAD'))
{
	$arMessage = Array();
	$chatId = 0;
	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
	{
		$chatId = intval(mb_substr($_POST['USER_ID'], 4));

		$CIMChat = new CIMChat();
		$arMessage = $CIMChat->GetLastMessage($chatId, false, ($_POST['USER_LOAD'] == 'Y'? true: false), false, false);
		if ($arMessage && isset($arMessage['message']))
		{
			foreach ($arMessage['message'] as $id => $ar)
				$arMessage['message'][$id]['recipientId'] = 'chat'.$ar['recipientId'];

			$arMessage['usersMessage']['chat'.$chatId] = $arMessage['usersMessage'][$chatId];
			unset($arMessage['usersMessage'][$chatId]);
		}
		$dialogId = 'chat'.$chatId;
	}
	else
	{
		$dialogId = intval($_POST['USER_ID']);
		if (CIMContactList::AllowToSend(Array('TO_USER_ID' => $dialogId)))
		{
			$CIMMessage = new CIMMessage();
			$arMessage = $CIMMessage->GetLastMessage($dialogId, false, ($_POST['USER_LOAD'] == 'Y'? true: false), false, false);

			$chatId = $arMessage['chatId'];
			if ($chatId <= 0)
			{
				$chatId = CIMMessage::GetChatId($USER->GetId(), $dialogId);
			}
		}
	}
	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $chatId,
		'USER_ID' => $dialogId,
		'MESSAGE' => isset($arMessage['message'])? $arMessage['message']: Array(),
		'USERS_MESSAGE' => isset($arMessage['message'])? $arMessage['usersMessage']: Array(),
		'USERS' => isset($arMessage['users'])? $arMessage['users']: Array(),
		'USER_IN_GROUP' => isset($arMessage['userInGroup'])? $arMessage['userInGroup']: Array(),
		'CHAT' => isset($arMessage['chat'])? $arMessage['chat']: Array(),
		'USER_BLOCK_CHAT' => isset($arMessage['userChatBlockStatus'])? $arMessage['userChatBlockStatus']: Array(),
		'USER_IN_CHAT' => isset($arMessage['userInChat'])? $arMessage['userInChat']: Array(),
		'FILES' => isset($arMessage['files'])? $arMessage['files']: Array(),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_HISTORY_LOAD_MORE'))
{
	$arMessage = Array();

	$CIMHistory = new CIMHistory(false, Array());
	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
	{
		$chatId = mb_substr($_POST['USER_ID'], 4);
		$arMessage = $CIMHistory->GetMoreChatMessage(intval($_POST['PAGE_ID']), $chatId, false);
		if (!empty($arMessage['message']))
		{
			foreach ($arMessage['message'] as $id => $ar)
				$arMessage['message'][$id]['recipientId'] = 'chat'.$ar['recipientId'];

			$arMessage['usersMessage']['chat'.$chatId] = $arMessage['usersMessage'][$chatId];
			unset($arMessage['usersMessage'][$chatId]);
		}
	}
	else
	{
		$allowToSend = Array('TO_USER_ID' => $_POST['USER_ID']);

		if (CIMContactList::AllowToSend($allowToSend))
		{
			$arMessage = $CIMHistory->GetMoreMessage(intval($_POST['PAGE_ID']), intval($_POST['USER_ID']), false, false);
		}
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => isset($arMessage['chatId'])? $arMessage['chatId']: 0,
		'MESSAGE' => isset($arMessage['message'])? $arMessage['message']: Array(),
		'USERS' => isset($arMessage['users'])? $arMessage['users']: Array(),
		'USER_IN_GROUP' => isset($arMessage['userInGroup'])? $arMessage['userInGroup']: Array(),
		'PHONES' => isset($arMessage['phones'])? $arMessage['phones']: Array(),
		'USERS_MESSAGE' => isset($arMessage['usersMessage'])? $arMessage['usersMessage']: Array(),
		'FILES' => isset($arMessage['files'])? $arMessage['files']: Array(),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_LOAD_MESSAGE_BY_DATE'))
{
	$history = new \CIMHistory();
	$arMessage = $history->GetMessagesByDate($_POST['CHAT_ID'], $_POST['LAST_LOAD'], $_POST['FIRST_MESSAGE_ID'], false);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => isset($arMessage['chatId'])? $arMessage['chatId']: 0,
		'DIALOG_ID' => isset($arMessage['dialogId'])? $arMessage['dialogId']: 0,
		'MESSAGE' => isset($arMessage['message'])? $arMessage['message']: Array(),
		'USERS_MESSAGE' => isset($arMessage['usersMessage'])? $arMessage['usersMessage']: Array(),
		'UNREAD_MESSAGE' => isset($arMessage['unreadMessage'])? $arMessage['unreadMessage']: Array(),
		'DELETE_MESSAGE' => isset($arMessage['messageDelete'])? $arMessage['messageDelete']: Array(),
		'FILES' => isset($arMessage['files'])? $arMessage['files']: Array(),
		'USERS' => isset($arMessage['users'])? $arMessage['users']: Array(),
		'USER_IN_GROUP' => isset($arMessage['userInGroup'])? $arMessage['userInGroup']: Array(),
		'PHONES' => isset($arMessage['phones'])? $arMessage['phones']: Array(),
		'CHAT' => $arChat['chat'],
		'USER_IN_CHAT' => $arChat['userInChat'],
		'USER_BLOCK_CHAT' => $arChat['userChatBlockStatus'],
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_LOAD_CONTEXT_MESSAGE'))
{
	if (isset($_POST['PREVIOUS']))
	{
		$previous = 20;
		$next = 0;
	}
	else if (isset($_POST['NEXT']))
	{
		$previous = 0;
		$next = 20;
	}
	else
	{
		$previous = 10;
		$next = 10;
	}

	$CIMHistory = new CIMHistory();
	$arMessage = $CIMHistory->GetRelatedMessages(intval($_POST['MESSAGE_ID']), $previous, $next, false);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => isset($arMessage['chatId'])? $arMessage['chatId']: 0,
		'DIALOG_ID' => isset($arMessage['dialogId'])? $arMessage['dialogId']: 0,
		'MESSAGE' => isset($arMessage['message'])? $arMessage['message']: Array(),
		'USERS_MESSAGE' => isset($arMessage['usersMessage'])? $arMessage['usersMessage']: Array(),
		'FILES' => isset($arMessage['files'])? $arMessage['files']: Array(),
		'USERS' => isset($arMessage['users'])? $arMessage['users']: Array(),
		'USER_IN_GROUP' => isset($arMessage['userInGroup'])? $arMessage['userInGroup']: Array(),
		'PHONES' => isset($arMessage['phones'])? $arMessage['phones']: Array(),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_HISTORY_REMOVE_ALL'))
{
	$errorMessage = "";

	$CIMHistory = new CIMHistory();
	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
		$CIMHistory->HideAllChatMessage(mb_substr($_POST['USER_ID'], 4));
	else
		$CIMHistory->RemoveAllMessage($_POST['USER_ID']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'USER_ID' => htmlspecialcharsbx($_POST['USER_ID']),
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_HISTORY_REMOVE_MESSAGE'))
{
	$errorMessage = "";

	$CIMHistory = new CIMHistory();
	$CIMHistory->RemoveMessage($_POST['MESSAGE_ID']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'MESSAGE_ID' => intval($_POST['MESSAGE_ID']),
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_HISTORY_SEARCH'))
{
	$CIMHistory = new CIMHistory();
	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
	{
		$chatId = mb_substr($_POST['USER_ID'], 4);
		$arMessage = $CIMHistory->SearchChatMessage($_POST['SEARCH'], $chatId, false);
		if (!empty($arMessage['message']))
		{
			foreach ($arMessage['message'] as $id => $ar)
				$arMessage['message'][$id]['recipientId'] = 'chat'.$ar['recipientId'];

			$arMessage['usersMessage']['chat'.$chatId] = $arMessage['usersMessage'][$chatId];
			unset($arMessage['usersMessage'][$chatId]);
		}
	}
	else
	{
		$arMessage = $CIMHistory->SearchMessage($_POST['SEARCH'], intval($_POST['USER_ID']), false, false);
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $arMessage['chatId'],
		'MESSAGE' => $arMessage['message'],
		'FILES' => $arMessage['files'],
		'USERS_MESSAGE' => $arMessage['usersMessage'],
		'USER_ID' => htmlspecialcharsbx($_POST['USER_ID']),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_HISTORY_DATE_SEARCH'))
{
	$CIMHistory = new CIMHistory();
	if (mb_substr($_POST['USER_ID'], 0, 4) == 'chat')
	{
		$chatId = mb_substr($_POST['USER_ID'], 4);
		$arMessage = $CIMHistory->SearchDateChatMessage($_POST['DATE'], $chatId, false);
		if (!empty($arMessage['message']))
		{
			foreach ($arMessage['message'] as $id => $ar)
				$arMessage['message'][$id]['recipientId'] = 'chat'.$ar['recipientId'];

			$arMessage['usersMessage']['chat'.$chatId] = $arMessage['usersMessage'][$chatId];
			unset($arMessage['usersMessage'][$chatId]);
		}
	}
	else
	{
		$arMessage = $CIMHistory->SearchDateMessage($_POST['DATE'], intval($_POST['USER_ID']), false, false);
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => $arMessage['chatId'],
		'MESSAGE' => $arMessage['message'],
		'FILES' => $arMessage['files'],
		'USERS_MESSAGE' => $arMessage['usersMessage'],
		'USER_ID' => htmlspecialcharsbx($_POST['USER_ID']),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_CONTACT_LIST_SEARCH'))
{
	$enabled = false;
	if (!IsModuleInstalled('b24network'))
	{
		$enabled = true;
	}
	else if (!Bitrix\Im\User::getInstance()->isExtranet() && CModule::IncludeModule('socialservices'))
	{
		$network = new \Bitrix\Socialservices\Network();
		$enabled = $network->isEnabled();

		if ($enabled)
		{
			$query = CBitrix24NetTransport::init();
			if(!$query)
			{
				$enabled = false;
			}
		}
	}

	if ($enabled)
	{
		$CIMContactList = new CIMContactList();
		$arContactList = $CIMContactList->SearchUsers($_POST['SEARCH']);

		echo \Bitrix\Im\Common::objectEncode(Array(
			'USERS' => $arContactList['users'],
			'USER_ID' => htmlspecialcharsbx($_POST['USER_ID']),
			'ERROR' => ''
		));
	}
	else
	{
		echo \Bitrix\Im\Common::objectEncode(Array('ERROR' => 'DISABLED_FUNCTION'));
	}
}
else if (isImPostRequest('IM_CONTACT_LIST'))
{
	$CIMContactList = new CIMContactList();
	$arContactList = $CIMContactList->GetList([
		'LOAD_USERS' => COption::GetOptionString("im", 'contact_list_load')? 'Y': 'N'
	]);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'USER_ID' => $USER->GetId(),
		'USERS' => $arContactList['users'],
		'GROUPS' => $arContactList['groups'],
		'CHATS' => $arContactList['chats'],
		'PHONES' => $arContactList['phones'],
		'USER_IN_GROUP' => $arContactList['userInGroup'],
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_RECENT_LIST'))
{
	$ar = CIMContactList::GetRecentList(Array(
		'USE_TIME_ZONE' => 'N',
		'USE_SMILES' => 'N'
	));
	$arRecent = Array();
	$arUsers = Array();
	$arChat = Array();
	foreach ($ar as $userId => $value)
	{
		if (in_array($value['TYPE'], CIMChat::getGroupTypes()))
		{
			$arChat[$value['CHAT']['id']] = $value['CHAT'];
			$value['MESSAGE']['userId'] = $userId;
			$value['MESSAGE']['recipientId'] = $userId;
		}
		else
		{
			$value['MESSAGE']['userId'] = $userId;
			$value['MESSAGE']['recipientId'] = $userId;
			$arUsers[$value['USER']['id']] = $value['USER'];
		}
		$arRecent[] = $value['MESSAGE'];
	}

	$arSmile = CIMMessenger::PrepareSmiles();

	$arResult['SMILE'] = $arSmile['SMILE'];
	$arResult['SMILE_SET'] = $arSmile['SMILE_SET'];

	$arResult['NOTIFY_BLOCKED'] = CIMSettings::GetSimpleNotifyBlocked();

	echo \Bitrix\Im\Common::objectEncode(Array(
		'USER_ID' => $USER->GetId(),
		'RECENT' => $arRecent,
		'USERS' => $arUsers,
		'CHAT' => $arChat,
		'NOTIFY_BLOCKED' => $arResult['NOTIFY_BLOCKED'],
		'SMILE' => !empty($arSmile['SMILE'])? $arSmile['SMILE']: false,
		'SMILE_SET' => !empty($arSmile['SMILE_SET'])? $arSmile['SMILE_SET']: false,
		'ERROR' => ''
	));

}
else if (isImPostRequest('IM_NOTIFY_READ'))
{
	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	$CIMNotify->MarkNotifyRead($_POST['ID'], true);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_NOTIFY_VIEW'))
{
	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	if ($_POST['READ'] == 'N')
	{
		$CIMNotify->MarkNotifyUnRead($_POST['ID']);
	}
	else
	{
		$CIMNotify->MarkNotifyRead($_POST['ID']);
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_NOTIFY_CONFIRM'))
{
	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	$result = $CIMNotify->Confirm($_POST['NOTIFY_ID'], $_POST['NOTIFY_VALUE']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'NOTIFY_ID' => intval($_POST['NOTIFY_ID']),
		'NOTIFY_VALUE' => $_POST['NOTIFY_VALUE'],
		'MESSAGES' => $result,
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_NOTIFY_ANSWER'))
{
	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	$result = $CIMNotify->Answer($_POST['NOTIFY_ID'], $_POST['NOTIFY_ANSWER']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'MESSAGES' => $result,
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_NOTIFY_BLOCK_TYPE'))
{
	$errorMessage = "";

	$arSettings = Array(
		'site|'.$_POST['BLOCK_TYPE'] => $_POST['BLOCK_RESULT'] == 'Y'? false: true,
		'xmpp|'.$_POST['BLOCK_TYPE'] => $_POST['BLOCK_RESULT'] == 'Y'? false: true,
		'email|'.$_POST['BLOCK_TYPE'] => $_POST['BLOCK_RESULT'] == 'Y'? false: true,
	);
	CIMSettings::SetSetting(CIMSettings::NOTIFY, $arSettings);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_NOTIFY_REMOVE'))
{
	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	$CIMNotify->DeleteWithCheck($_POST['NOTIFY_ID']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'NOTIFY_ID' => intval($_POST['NOTIFY_ID']),
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_NOTIFY_GROUP_REMOVE'))
{
	$errorMessage = "";

	$CIMNotify = new CIMNotify();
	if ($arNotify = $CIMNotify->GetNotify($_POST['NOTIFY_ID']))
		CIMNotify::DeleteByTag($arNotify['NOTIFY_TAG']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'NOTIFY_ID' => intval($_POST['NOTIFY_ID']),
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_RECENT_HIDE'))
{
	\CIMContactList::DialogHide($_POST['DIALOG_ID']);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'USER_ID' => $_POST['DIALOG_ID'],
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_CHAT_ADD'))
{
	$_POST['USERS'] = CUtil::JsObjectToPhp($_POST['USERS']);

	$errorMessage = "";
	$chatId = 0;
	$alias = null;
	if ($_POST['TYPE'] != 'open' && !is_array($_POST['USERS']))
	{
		$errorMessage = GetMessage('IM_UNKNOWN_ERROR');
	}
	else
	{
		$entityType = '';

		$type = IM_MESSAGE_CHAT;
		if ($_POST['TYPE'] == 'open')
		{
			$type = IM_MESSAGE_OPEN;
		}
		else if ($_POST['TYPE'] == 'videoconf')
		{
			$entityType = 'VIDEOCONF';
		}

		if (\Bitrix\Im\User::getInstance()->isExtranet())
		{
			$_POST['USERS'] = \Bitrix\Im\Integration\Socialnetwork\Extranet::filterUserList($_POST['USERS']);
		}

		$CIMChat = new CIMChat();
		$chatId = $CIMChat->Add(Array(
			'TYPE' => $type,
			'USERS' => $_POST['USERS'],
			'TITLE' => $_POST['TITLE'],
			'MESSAGE' => $_POST['MESSAGE'],
			'ENTITY_TYPE' => $entityType,
			'SEARCH_MARK' => $_POST['SEARCH_MARK'] ?? null,
			'AVATAR' => $_POST['AVATAR']
		));
		if ($chatId)
		{
			if ($entityType === 'VIDEOCONF')
			{
				$alias = \Bitrix\Im\Alias::getByEntity('VIDEOCONF', $chatId);
			}
		}
		else
		{
			if ($e = $GLOBALS["APPLICATION"]->GetException())
				$errorMessage = $e->GetString();
		}
	}

	echo \Bitrix\Im\Common::objectEncode([
		'CHAT_ID' => intval($chatId),
		'PUBLIC_LINK' => $alias? $alias['LINK']: '',
		'ERROR' => $errorMessage
	]);
}
else if (isImPostRequest('IM_CHAT_EXTEND'))
{
	$_POST['USERS'] = CUtil::JsObjectToPhp($_POST['USERS']);

	$errorMessage = "";
	$userId = $USER->GetId();
	$chatId = intval($_POST['CHAT_ID']);
	if (!\Bitrix\Im\Chat::isActionAllowed('chat' . $chatId, 'EXTEND'))
	{
		$errorMessage = GetMessage('IM_ACCESS_ERROR');
	}
	else
	{
		if (\Bitrix\Im\User::getInstance()->isExtranet())
		{
			$_POST['USERS'] = \Bitrix\Im\Integration\Socialnetwork\Extranet::filterUserList($_POST['USERS']);
		}

		$CIMChat = new CIMChat();
		$result = $CIMChat->AddUser($_POST['CHAT_ID'], $_POST['USERS'], $_POST['HISTORY'] != 'Y');
		if (!$result)
		{
			if ($e = $GLOBALS["APPLICATION"]->GetException())
				$errorMessage = $e->GetString();
		}
	}
	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_CHAT_JOIN'))
{
	$CIMChat = new CIMChat();
	$result = $CIMChat->Join($_POST['CHAT_ID']);
}
else if (isImPostRequest('IM_PARENT_CHAT_JOIN'))
{
	$CIMChat = new CIMChat();
	$result = $CIMChat->JoinParent($_POST['CHAT_ID'], $_POST['MESSAGE_ID']);
}
else if (isImPostRequest('IM_CHAT_LEAVE'))
{
	$userId = $USER->GetId();
	$chatId = intval($_POST['CHAT_ID']);
	if (!\Bitrix\Im\Chat::isActionAllowed('chat' . $chatId, 'LEAVE'))
	{
		$result = false;
	}
	else
	{
		$CIMChat = new CIMChat();
		$result = $CIMChat->DeleteUser($chatId, intval($_POST['USER_ID']) > 0? intval($_POST['USER_ID']): $USER->GetID());
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => intval($_POST['CHAT_ID']),
		'USER_ID' => intval($_POST['USER_ID']),
		'ERROR' => $result? '': 'ACCESS_ERROR'
	));
}
else if (isImPostRequest('IM_CHAT_MUTE'))
{
	$result = false;

	if (\Bitrix\Im\Chat::isActionAllowed('chat' . $_POST['CHAT_ID'], 'MUTE'))
	{
		$CIMChat = new CIMChat();
		$result = $CIMChat->MuteNotify($_POST['CHAT_ID'], $_POST['MUTE'] == 'Y');
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => intval($_POST['CHAT_ID']),
		'ERROR' => $result? '': 'ACCESS_ERROR'
	));
}
else if (isImPostRequest('IM_CHAT_RENAME'))
{
	$userId = $USER->GetId();
	$chatId = intval($_POST['CHAT_ID']);
	$error = '';
	if (!\Bitrix\Im\Chat::isActionAllowed('chat' . $chatId, 'RENAME'))
	{
		$error = 'ACTION_DISABLED';
	}
	else
	{
		$CIMChat = new CIMChat();
		$CIMChat->Rename($chatId, $_POST['CHAT_TITLE']);
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT_ID' => intval($_POST['CHAT_ID']),
		'CHAT_TITLE' => $_POST['CHAT_TITLE'],
		'ERROR' => $error
	));
}
else if (isImPostRequest('IM_CRM_SELECTOR'))
{
	if (CModule::IncludeModule('crm'))
	{
		ob_start();
		$APPLICATION->IncludeComponent(
			'bitrix:crm.entity.selector.ajax',
			'.default',
			array(
				"MULTIPLE" => $_REQUEST['multiple'] == 'Y' ? 'Y' : 'N',
				'VALUE' => $_REQUEST['value'],
				'ENTITY_TYPE' => $_REQUEST['entityType'],
				'NAME' => 'olCrmSelector',
			),
			null,
			array('HIDE_ICONS' => 'Y')
		);
		$arResult['HTML'] = ob_get_contents();
		ob_end_clean();
	}
	else
	{
		$arResult['ERROR'] = 'ACCESS_DENIED';
	}

	echo \Bitrix\Im\Common::objectEncode($arResult);

}
else if (isImPostRequest('IM_CHAT_DATA_LOAD'))
{
	$chatId = $_POST['CHAT_ID'];

	$arChat = CIMChat::GetChatData(array(
		'ID' => $chatId,
		'USE_CACHE' => 'Y',
		'USER_ID' => $USER->GetId()
	));

	$arUser = CIMContactList::GetUserData(Array(
		'ID' => $arChat['userInChat'][$chatId]
	));

	if (!in_array($USER->GetId(), $arChat['userInChat'][$chatId]))
	{
		if (($arChat['chat'][$chatId]['message_type'] == IM_MESSAGE_OPEN || $arChat['chat'][$chatId]['messageType'] == IM_MESSAGE_OPEN_LINE) && CModule::IncludeModule("pull"))
		{
			CPullWatch::Add($USER->GetId(), 'IM_PUBLIC_'.$chatId, true);
		}
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'CHAT' => $arChat['chat'],
		'CHAT_ID' => $_POST['CHAT_ID'],
		'LINES' => $arChat['lines'],
		'USER_IN_CHAT' => $arChat['userInChat'],
		'USER_BLOCK_CHAT' => $arChat['userChatBlockStatus'],
		'USERS' => isset($arUser['users'])? $arUser['users']: Array(),
		'USER_IN_GROUP' => isset($arUser['userInGroup'])? $arUser['userInGroup']: Array(),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_GET_EXTERNAL_DATA'))
{
	$error = '';
	$arResult = Array(
		'TS' => $_POST['TS'],
		'TYPE' => $_POST['TYPE'],
		'ERROR' => ''
	);
	$arMessage = Array();

	if ($_POST['TYPE'] == 'user')
	{
		$arResult['USER_ID'] = intval($_POST['USER_ID']);
		if (CIMContactList::AllowToSend(Array('TO_USER_ID' => $_POST['USER_ID'])))
		{
			$ar = CIMContactList::GetUserData(array(
				'ID' => Array($_POST['USER_ID']),
				'DEPARTMENT' => 'Y',
				'USE_CACHE' => 'N',
				'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
			));
			$arResult['USERS'] = isset($ar['users'])? $ar['users']: Array();
			$arResult['USER_IN_GROUP'] = isset($ar['userInGroup'])? $ar['userInGroup']: Array();
			$arResult['PHONES'] = isset($ar['phones'])? $ar['phones']: Array();
		}
		else
		{
			$arResult['ERROR'] = 'ACCESS_DENIED';
		}
	}
	else if ($_POST['TYPE'] == 'chat')
	{
		$chatId = intval($_POST['CHAT_ID']);

		$arChat = CIMChat::GetChatData(array(
			'ID' => $chatId,
			'USE_CACHE' => 'Y',
			'USER_ID' => $USER->GetId()
		));

		if ($arChat['chat'][$chatId])
		{
			$arResult['CHAT_ID'] = $chatId;
			$arResult['CHAT'] = $arChat['chat'];
			$arResult['LINES'] = $arChat['lines'];
			$arResult['USER_IN_CHAT'] = $arChat['userInChat'];
			$arResult['USER_BLOCK_CHAT'] = $arChat['userChatBlockStatus'];
		}
		else
		{
			$arResult['ERROR'] = 'ACCESS_DENIED';
		}
	}
	else if ($_POST['TYPE'] == 'phoneCallHistory')
	{
		if (CModule::IncludeModule('voximplant'))
		{
			$arResult['HISTORY_ID'] = intval($_POST['HISTORY_ID']);
			$history = CVoxImplantHistory::GetForPopup($arResult['HISTORY_ID']);
			if ($history && $history['PORTAL_USER_ID'] == $USER->GetId())
			{
				if ($history['CALL_RECORD_HREF'] <> '')
				{
					ob_start();
					$APPLICATION->IncludeComponent(
						"bitrix:player",
						"",
						Array(
							"PROVIDER" => "sound",
							"PLAYER_TYPE" => "flv",
							"CHECK_FILE" => "N",
							"USE_PLAYLIST" => "N",
							"PATH" => $history["CALL_RECORD_HREF"],
							"WIDTH" => 233,
							"HEIGHT" => 24,
							"PREVIEW" => false,
							"LOGO" => false,
							"FULLSCREEN" => "N",
							"SKIN_PATH" => "/bitrix/components/bitrix/player/mediaplayer/skins",
							"SKIN" => "",
							"CONTROLBAR" => "bottom",
							"WMODE" => "transparent",
							"WMODE_WMV" => "windowless",
							"HIDE_MENU" => "N",
							"SHOW_CONTROLS" => "N",
							"SHOW_STOP" => "Y",
							"SHOW_DIGITS" => "Y",
							"CONTROLS_BGCOLOR" => "FFFFFF",
							"CONTROLS_COLOR" => "000000",
							"CONTROLS_OVER_COLOR" => "000000",
							"SCREEN_COLOR" => "000000",
							//"FILE_DURATION" => "30",
							"AUTOSTART" => "N",
							"REPEAT" => "N",
							"VOLUME" => "90",
							"DISPLAY_CLICK" => "play",
							"MUTE" => "N",
							"HIGH_QUALITY" => "N",
							"ADVANCED_MODE_SETTINGS" => "Y",
							"BUFFER_LENGTH" => "10",
							"DOWNLOAD_LINK" => false,
							"DOWNLOAD_LINK_TARGET" => "_self",
							"ALLOW_SWF" => "N",
							"ADDITIONAL_PARAMS" => array(
								'LOGO' => false,
								'NUM' => false,
								'HEIGHT_CORRECT' => false,
							),
							"PLAYER_ID" => "bitrix_vi_record_".$arResult['HISTORY_ID']
						),
						false,
						Array("HIDE_ICONS" => "Y")
					);
					$history['CALL_RECORD_HTML'] = ob_get_contents();
					ob_end_clean();
					unset($history['CALL_RECORD_HREF']);

				}
				foreach ($history as $key => $value)
				{
					$arResult[$key] = $value;
				}
			}
			else
			{
				$arResult['ERROR'] = 'ACCESS_DENIED';
			}
		}
		else
		{
			$arResult['ERROR'] = 'ACCESS_DENIED';
		}
	}

	echo \Bitrix\Im\Common::objectEncode($arResult);
}
else if (isImPostRequest('IM_CALL'))
{
	$userId = intval($USER->GetId());
	$chatId = intval($_POST['CHAT_ID']) ?: CIMMessage::GetChatId($userId, intval($_POST['USER_ID']));

	$errorMessage = "";
	if ($_POST['COMMAND'] == 'invite')
	{
		if ($_POST['CHAT'] != 'Y')
			$chatId = CIMMessage::GetChatId($userId, intval($_POST['CHAT_ID']));

		$arCallData = CIMCall::Invite(Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'RECIPIENT_ID' => $_POST['CHAT'] != 'Y'? intval($_POST['CHAT_ID']): 0,
			'VIDEO' => $_POST['VIDEO'],
			'MOBILE' => $_POST['MOBILE'],
		));
		if (!$arCallData)
		{
			if ($e = $GLOBALS["APPLICATION"]->GetException())
				$errorMessage = $e->GetString();

			echo \Bitrix\Im\Common::objectEncode(Array(
				'ERROR' => $errorMessage
			));
		}
		else
		{
			echo \Bitrix\Im\Common::objectEncode(Array(
				'CHAT_ID' => $arCallData['CHAT_ID'],
				'USERS' => $arCallData['USER_DATA']['USERS'],
				'USERS_CONNECT' => isset($arCallData['USERS_CONNECT'])? $arCallData['USERS_CONNECT']: array(),
				'HR_PHOTO' => $arCallData['USER_DATA']['HR_PHOTO'],
				'CALL_VIDEO' => $arCallData['STATUS_TYPE'] == IM_CALL_VIDEO,
				'CALL_TO_GROUP' => $arCallData['CALL_TO_GROUP'],
				'CALL_ENABLED' => $arCallData['STATUS_TYPE'] != IM_CALL_NONE,
				'ERROR' => $errorMessage
			));
		}
	}
	else if ($_POST['COMMAND'] == 'wait')
	{
		CIMCall::Wait(Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
		));
	}
	else if ($_POST['COMMAND'] == 'reconnect')
	{
		CIMCall::Command($chatId, $_POST['RECIPIENT_ID'], 'reconnect', Array());
	}
	else if ($_POST['COMMAND'] == 'answer')
	{
		CIMCall::Answer(Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'CALL_TO_GROUP' => $_POST['CALL_TO_GROUP'] == 'Y',
			'MOBILE' => $_POST['MOBILE'],
		));
	}
	else if ($_POST['COMMAND'] == 'start')
	{
		CIMCall::Start(Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'RECIPIENT_ID' => intval($_POST['RECIPIENT_ID']),
			'CALL_TO_GROUP' => $_POST['CALL_TO_GROUP'] == 'Y',
		));
	}
	else if (in_array($_POST['COMMAND'], Array(IM_CALL_END_DECLINE, IM_CALL_END_TIMEOUT, IM_CALL_END_BUSY, IM_CALL_END_OFFLINE, IM_CALL_END_ACCESS)))
	{
		$arParams = Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'RECIPIENT_ID' => intval($_POST['RECIPIENT_ID']),
			'REASON' => $_POST['COMMAND'],
		);
		$_POST['PARAMS'] = CUtil::JsObjectToPhp($_POST['PARAMS']);
		if (isset($_POST['VIDEO']))
			$arParams['VIDEO'] = $_POST['VIDEO'];
		if (isset($_POST['PARAMS']['ACTIVE']))
			$arParams['ACTIVE'] = $_POST['PARAMS']['ACTIVE'];
		if (isset($_POST['PARAMS']['INITIATOR']))
			$arParams['INITIATOR'] = $_POST['PARAMS']['INITIATOR'];

		CIMCall::End($arParams);
	}
	else if ($_POST['COMMAND'] == 'signaling')
	{
		CIMCall::Command($chatId, $_POST['RECIPIENT_ID'], 'signaling', Array('peer' => $_POST['PEER']));
	}
	else if ($_POST['COMMAND'] == 'invite_user')
	{
		$arCallData = CIMCall::AddUser(Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'USERS' => CUtil::JsObjectToPhp($_POST['USERS']),
		));
		if ($e = $GLOBALS["APPLICATION"]->GetException())
			$errorMessage = $e->GetString();

		if ($errorMessage == '')
		{
			echo \Bitrix\Im\Common::objectEncode(Array(
				'CHAT_ID' => $arCallData['CHAT_ID'],
				'USERS' => $arCallData['USER_DATA']['USERS'],
				'HR_PHOTO' => $arCallData['USER_DATA']['HR_PHOTO'],
				'ERROR' => $errorMessage
			));
		}
		else
		{
			echo \Bitrix\Im\Common::objectEncode(Array(
				'CHAT_ID' => $arCallData['CHAT_ID'],
				'ERROR' => $e->GetString()
			));
		}
	}
	else
	{
		CIMCall::Signaling(Array(
			'CHAT_ID' => $chatId,
			'USER_ID' => $userId,
			'COMMAND' => $_POST['COMMAND'],
		));
	}
	if ($_POST['COMMAND'] != 'invite' && $_POST['COMMAND'] != 'invite_user')
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'CHAT_ID' => $chatId,
			'ERROR' => $errorMessage
		));
	}
}
else if (isImPostRequest('IM_SHARING') && intval($_POST['USER_ID']) > 0)
{
	if (!CModule::IncludeModule("pull"))
		return false;

	if ($_POST['COMMAND'] == 'signaling')
	{
		\Bitrix\Pull\Event::add(intval($_POST['USER_ID']), Array(
			'module_id' => 'im',
			'command' => 'screenSharing',
			'expiry' => 3600,
			'params' => Array(
				'senderId' => $USER->GetID(),
				'command' => 'signaling',
				'peer' => $_POST['PEER'],
			),
			'extra' => \Bitrix\Im\Common::getPullExtra()
		));
	}
	else
	{
		\Bitrix\Pull\Event::add(intval($_POST['USER_ID']), Array(
			'module_id' => 'im',
			'command' => 'screenSharing',
			'expiry' => 3600,
			'params' => Array(
				'senderId' => $USER->GetID(),
				'command' => $_POST['COMMAND']
			),
			'extra' => \Bitrix\Im\Common::getPullExtra()
		));
	}
}
else if ((isImPostRequest('IM_OPEN_LINES') || isImPostRequest('IM_OPEN_LINES_CLIENT')) && CModule::IncludeModule('imopenlines'))
{
	$_POST['IM_OPEN_LINES_CLIENT'] = $_POST['IM_OPEN_LINES'] == 'Y'? 'N': 'Y';
	$_POST['IM_OPEN_LINES'] = $_POST['IM_OPEN_LINES_CLIENT'] == 'Y'? 'N': 'Y';

	require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/imopenlines/handlers/ajax.php");
}
else if (isImPostRequest('IM_IDLE'))
{
	$errorMessage = "";
	CIMStatus::SetIdle($USER->GetId(), $_POST['IDLE'] == 'Y', $_POST['MANUAL'] == 'Y'? 1: 10);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_OPEN_REST_TOKEN'))
{
	$errorMessage = "";

	\Bitrix\Im\App::addToken(Array(
		'BOT_ID' => intval($_POST['BOT_ID']),
		'DIALOG_ID' => $_POST['DIALOG_ID'],
		'USER_ID' => $USER->GetId(),
	));

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_GET_TEXTAREA_ICONS'))
{
	$errorMessage = "";

	echo \Bitrix\Im\Common::objectEncode(Array(
		'TEXTAREA_ICON' => \Bitrix\Im\App::getListForJs(),
		'ERROR' => ''
	));
}
else if (isImPostRequest('IM_START_WRITING'))
{
	$errorMessage = "";
	CIMMessenger::StartWriting($_POST['DIALOG_ID'], false, "", false, $_POST['OL_SILENT'] == 'Y');

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_DESKTOP_LOGOUT'))
{
	$errorMessage = "";

	CIMMessenger::SetDesktopStatusOffline();
	CIMContactList::SetOffline();

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_SET_COLOR'))
{
	$errorMessage = "";

	$_POST['CHAT_ID'] = intval($_POST['CHAT_ID']);

	if ($_POST['CHAT_ID'] > 0)
	{
		$userId = $USER->GetId();
		if (CIMChat::GetGeneralChatId() == intval($_POST['CHAT_ID']) && !CIMChat::CanSendMessageToGeneralChat($userId))
		{
			$errorMessage = GetMessage('IM_ACCESS_ERROR');
		}
		else
		{
			$chat = new CIMChat();
			$chat->SetColor($_POST['CHAT_ID'], $_POST['COLOR']);
		}
	}
	else
	{
		CIMStatus::SetColor($USER->GetId(), $_POST['COLOR']);
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'COLOR' => $_POST['COLOR'],
		'CHAT_ID' => $_POST['CHAT_ID'],
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_GET_MOBILE_CHAT_AVATAR'))
{
	$avatar = "";
	$errorMessage = "";

	if ($_POST['CHAT_ID'] > 0)
	{
		$chat = new CIMChat();
		$arChat = CIMChat::GetChatData(array(
			'ID' => $_POST['CHAT_ID'],
			'USE_CACHE' => 'N',
			'PHOTO_SIZE' => '500',
			'USER_ID' => intval($USER->GetId())
		));
		$arResult['CHAT'] = $arChat['chat'][$_POST['CHAT_ID']];
		if ($arResult['CHAT'])
		{
			$avatar = $arResult['CHAT']['avatar'] == '/bitrix/js/im/images/blank.gif'? '': $arResult['CHAT']['avatar'];
		}
	}

	echo \Bitrix\Im\Common::objectEncode(Array(
		'AVATAR' => $avatar,
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_SETTING_SAVE'))
{
	$errorMessage = "";

	$arSettings = CUtil::JsObjectToPhp($_POST['SETTINGS']);

	CIMSettings::SetSetting(CIMSettings::SETTINGS, $arSettings);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_SETTINGS_SAVE'))
{
	$errorMessage = "";

	$arSettings = CUtil::JsObjectToPhp($_POST['SETTINGS']);

	$oldSettings = CIMSettings::Get()[CIMSettings::SETTINGS];
	if ($oldSettings['notifyScheme'] == 'expert' && $arSettings['notifyScheme'] == 'simple')
	{
		$arNotifyValues = CIMSettings::GetSimpleNotifyBlocked();
		$arSettings['notify'] = Array();
		foreach ($arNotifyValues as $settingName => $value)
		{
			$arSettings['notify'][CIMSettings::CLIENT_SITE.'|'.$settingName] = false;
			$arSettings['notify'][CIMSettings::CLIENT_XMPP.'|'.$settingName] = false;
			$arSettings['notify'][CIMSettings::CLIENT_MAIL.'|'.$settingName] = false;
		}
	}

	if (array_key_exists('notify', $arSettings))
	{
		CIMSettings::Set(CIMSettings::NOTIFY, $arSettings['notify']);
		unset($arSettings['notify']);
	}
	CIMSettings::Set(CIMSettings::SETTINGS, $arSettings);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_SETTINGS_NOTIFY_LOAD'))
{
	$errorMessage = "";

	$arSettings = CIMSettings::Get();
	$arNotifyNames = CIMSettings::GetNotifyNames();

	echo \Bitrix\Im\Common::objectEncode(Array(
		'NAMES' => $arNotifyNames,
		'VALUES' => $arSettings['notify'],
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_SETTINGS_SIMPLE_NOTIFY_LOAD'))
{
	$errorMessage = "";

	$arNotifyNames = CIMSettings::GetNotifyNames();
	$arNotifyValues = CIMSettings::GetSimpleNotifyBlocked(true);

	echo \Bitrix\Im\Common::objectEncode(Array(
		'NAMES' => $arNotifyNames,
		'VALUES' => $arNotifyValues,
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_DISK_ACTIVATE_PUBLIC_LINK'))
{
	CIMDisk::SetEnabledExternalLink($_POST['STATUS'] == 'Y');

	echo \Bitrix\Im\Common::objectEncode(Array(
		'ERROR' => $errorMessage
	));
}
else if (isImPostRequest('IM_CREATE_ZOOM_CONF'))
{
	$chatId = \Bitrix\Im\Dialog::getChatId($_POST['CHAT_ID']);
	$userId = $USER->GetId();

	if (!\Bitrix\Im\Call\Integration\Zoom::isActive())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'NOT_ACTIVE'
		));
	}
	elseif (!\Bitrix\Im\Call\Integration\Zoom::isAvailable())
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'NOT_AVAILABLE'
		));
	}
	elseif (!\Bitrix\Im\Call\Integration\Zoom::isConnected($userId))
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => 'NOT_CONNECTED',
		));
	}
	elseif (CIMChat::GetGeneralChatId() == $chatId && !CIMChat::CanSendMessageToGeneralChat($userId))
	{
		echo \Bitrix\Im\Common::objectEncode(Array(
			'ERROR' => GetMessage('IM_ERROR_GROUP_CANCELED'),
		));
	}
	else
	{
		$zoom = new \Bitrix\Im\Call\Integration\Zoom($userId, $_POST['CHAT_ID']);
		$link = $zoom->getImChatConferenceUrl();
		if (empty($link))
		{
			echo \Bitrix\Im\Common::objectEncode(Array(
				'ERROR' => 'COULD_NOT_CREATE',
			));
		}
		else
		{
			$messageFields = $zoom->getRichMessageFields($_POST['CHAT_ID'], $link, $userId);
			$messageId = \CIMMessenger::Add($messageFields);
			if ($messageId)
			{
				echo \Bitrix\Im\Common::objectEncode(Array(
					'LINK' => $link,
					'ADD_RESULT' => $messageId,
				));
			}
			else
			{
				echo \Bitrix\Im\Common::objectEncode(Array(
					'ERROR' => 'COULD_NOT_ADD_MESSAGE',
				));
			}
		}
	}
}
else
{
	echo \Bitrix\Im\Common::objectEncode(Array('ERROR' => GetMessage('IM_UNKNOWN_ERROR')));
}

CMain::FinalActions();
die();

Youez - 2016 - github.com/yon3zu
LinuXploit