static function messageAdd($arParams, $n, CRestServer $server)
{
global $USER;
$arParams = array_change_key_case($arParams, CASE_UPPER);
if (isset($arParams['MESSAGE']))
{
if (!is_string($arParams['MESSAGE']))
{
throw new BitrixRestRestException("Wrong message type", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
}
$arParams['MESSAGE'] = trim($arParams['MESSAGE']);
if ($arParams['MESSAGE'] == '' && empty($arParams['ATTACH']))
{
throw new BitrixRestRestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
}
}
else if (!isset($arParams['ATTACH']))
{
throw new BitrixRestRestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
}
if (isset($arParams['DIALOG_ID']))
{
if (BitrixImCommon::isChatId($arParams['DIALOG_ID']))
{
$arParams['CHAT_ID'] = BitrixImDialog::getChatId($arParams['DIALOG_ID']);
}
else
{
$arParams['USER_ID'] = intval($arParams['DIALOG_ID']);
}
}
$arParams['FROM_USER_ID'] = $USER->GetId();
if (isset($arParams['USER_ID']))
{
$arParams['USER_ID'] = intval($arParams['USER_ID']);
if ($arParams['USER_ID'] <= 0)
{
throw new BitrixRestRestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
}
if (!BitrixImUser::getInstance($arParams['USER_ID'])->isExists())
{
throw new BitrixRestRestException("User not found", "USER_NOT_FOUND", CRestServer::STATUS_WRONG_REQUEST);
}
$arMessageFields = Array(
"MESSAGE_TYPE" => IM_MESSAGE_PRIVATE,
"FROM_USER_ID" => $arParams['FROM_USER_ID'],
"DIALOG_ID" => $arParams['USER_ID'],
);
}
else if (isset($arParams['CHAT_ID']))
{
$arParams['CHAT_ID'] = intval($arParams['CHAT_ID']);
if ($arParams['CHAT_ID'] <= 0)
{
throw new BitrixRestRestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
}
if (
CIMChat::GetGeneralChatId() == $arParams['CHAT_ID']
&& !CIMChat::CanSendMessageToGeneralChat($arParams['FROM_USER_ID'])
)
{
throw new BitrixRestRestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN);
}
if (!Chat::isActionAllowed('chat' . $arParams['CHAT_ID'], 'SEND'))
{
throw new BitrixRestRestException('It is forbidden to send messages to this chat', 'ACCESS_ERROR', CRestServer::STATUS_FORBIDDEN);
}
if (isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y')
{
$clientId = $server->getClientId();
if ($clientId)
{
$result = BitrixRestAppTable::getList(
array(
'filter' => array(
'=CLIENT_ID' => $clientId
),
'select' => array(
'CODE',
'APP_NAME',
'APP_NAME_DEFAULT' => 'LANG_DEFAULT.MENU_NAME',
)
)
);
$result = $result->fetch();
$moduleName = !empty($result['APP_NAME'])
? $result['APP_NAME']
: (!empty($result['APP_NAME_DEFAULT'])
? $result['APP_NAME_DEFAULT']
: $result['CODE']
)
;
$arParams['MESSAGE'] = "[b]".$moduleName."[/b]n".$arParams['MESSAGE'];
}
}
$arMessageFields = Array(
"MESSAGE_TYPE" => IM_MESSAGE_CHAT,
"FROM_USER_ID" => $arParams['FROM_USER_ID'],
"DIALOG_ID" => 'chat'.$arParams['CHAT_ID'],
);
}
else
{
throw new BitrixRestRestException("Incorrect params", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
if (isset($arParams['MESSAGE']))
{
$arMessageFields["MESSAGE"] = $arParams['MESSAGE'];
}
$attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']);
if ($attach)
{
if ($attach->IsAllowSize())
{
$arMessageFields['ATTACH'] = $attach;
}
else
{
throw new BitrixRestRestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST);
}
}
else if ($arParams['ATTACH'])
{
throw new BitrixRestRestException("Incorrect attach params", "ATTACH_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
if (isset($arParams['KEYBOARD']) && !empty($arParams['KEYBOARD']))
{
$keyboard = Array();
if (is_string($arParams['KEYBOARD']))
{
$arParams['KEYBOARD'] = CUtil::JsObjectToPhp($arParams['KEYBOARD']);
}
if (!isset($arParams['KEYBOARD']['BUTTONS']))
{
$keyboard['BUTTONS'] = $arParams['KEYBOARD'];
}
else
{
$keyboard = $arParams['KEYBOARD'];
}
$keyboard['BOT_ID'] = $arParams['BOT_ID'];
$keyboard = BitrixImBotKeyboard::getKeyboardByJson($keyboard);
if ($keyboard)
{
$arMessageFields['KEYBOARD'] = $keyboard;
}
else
{
throw new BitrixRestRestException("Incorrect keyboard params", "KEYBOARD_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (isset($arParams['MENU']) && !empty($arParams['MENU']))
{
$menu = Array();
if (is_string($arParams['MENU']))
{
$arParams['MENU'] = CUtil::JsObjectToPhp($arParams['MENU']);
}
if (!isset($arParams['MENU']['ITEMS']))
{
$menu['ITEMS'] = $arParams['MENU'];
}
else
{
$menu = $arParams['MENU'];
}
$menu['BOT_ID'] = $arParams['BOT_ID'];
$menu = BitrixImBotContextMenu::getByJson($menu);
if ($menu)
{
$arMessageFields['MENU'] = $menu;
}
else
{
throw new BitrixRestRestException("Incorrect menu params", "MENU_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (
isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y'
&& $server->getAuthType() !== BitrixRestSessionAuthAuth::AUTH_TYPE
&& BitrixImDialog::hasAccess($arMessageFields['DIALOG_ID'])
)
{
$arMessageFields['SYSTEM'] = 'Y';
}
if (isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == 'N')
{
$arMessageFields['URL_PREVIEW'] = 'N';
}
if (isset($arParams['SKIP_CONNECTOR']) && mb_strtoupper($arParams['SKIP_CONNECTOR']) == 'Y')
{
$arMessageFields['SKIP_CONNECTOR'] = 'Y';
$arMessageFields['SILENT_CONNECTOR'] = 'Y';
}
if (isset($arParams['TEMPLATE_ID']) && !empty($arParams['TEMPLATE_ID']))
{
$arMessageFields['TEMPLATE_ID'] = mb_substr((string)$arParams['TEMPLATE_ID'], 0, 255);
}
if (isset($arParams['REPLY_ID']) && (int)$arParams['REPLY_ID'] > 0)
{
$message = new BitrixImV2Message((int)$arParams['REPLY_ID']);
if (!$message->hasAccess())
{
throw new BitrixRestRestException("Action unavailable", "REPLY_ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN);
}
if ($message->getChat()->getDialogId() !== (string)$arMessageFields['DIALOG_ID'])
{
throw new BitrixRestRestException("You can only reply to a message within the same chat", "REPLY_FROM_OTHER_CHAT_ERROR", CRestServer::STATUS_FORBIDDEN);
}
$arMessageFields['PARAMS']['REPLY_ID'] = $message->getId();
}
$id = CIMMessenger::Add($arMessageFields);
if (!$id)
{
throw new BitrixRestRestException("Message isn't added", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
return (int)$id;
}