%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_rest.php |
<? if(!CModule::IncludeModule('rest')) return; class CIMRestService extends IRestService { public static function OnRestServiceBuildDescription() { return array( 'im' => array( 'im.revision.get' => array(__CLASS__, 'revisionGet'), 'im.user.get' => array(__CLASS__, 'userGet'), 'im.user.list.get' => array(__CLASS__, 'userList'), 'im.user.business.list' => array(__CLASS__, 'userBusinessList'), 'im.user.business.get' => array('callback' => array(__CLASS__, 'userBusinessList'), 'options' => array('private' => true)), 'im.user.status.get' => array(__CLASS__, 'userStatusGet'), 'im.user.status.set' => array(__CLASS__, 'userStatusSet'), 'im.user.status.idle.start' => array(__CLASS__, 'userStatusIdleStart'), 'im.user.status.idle.end' => array(__CLASS__, 'userStatusIdleEnd'), 'im.recent.get' => array(__CLASS__, 'recentGet'), 'im.recent.pin' => array(__CLASS__, 'recentPin'), 'im.recent.hide' => array(__CLASS__, 'recentHide'), 'im.department.get' => array(__CLASS__, 'departmentGet'), 'im.department.colleagues.list' => array(__CLASS__, 'departmentColleaguesList'), 'im.department.colleagues.get' => array('callback' => array(__CLASS__, 'departmentColleaguesList'), 'options' => array('private' => true)), 'im.department.managers.get' => array(__CLASS__, 'departmentManagersGet'), 'im.department.employees.get' => array(__CLASS__, 'departmentEmployeesGet'), 'im.chat.add' => array(__CLASS__, 'chatCreate'), 'im.chat.get' => array(__CLASS__, 'chatGet'), 'im.chat.setOwner' => array(__CLASS__, 'chatSetOwner'), 'im.chat.setManager' => array(__CLASS__, 'chatSetManager'), 'im.chat.updateColor' => array(__CLASS__, 'chatUpdateColor'), 'im.chat.updateTitle' => array(__CLASS__, 'chatUpdateTitle'), 'im.chat.updateAvatar' => array(__CLASS__, 'chatUpdateAvatar'), 'im.chat.leave' => array(__CLASS__, 'chatUserDelete'), 'im.chat.user.add' => array(__CLASS__, 'chatUserAdd'), 'im.chat.user.delete' => array(__CLASS__, 'chatUserDelete'), 'im.chat.user.list' => array(__CLASS__, 'chatUserList'), 'im.chat.sendTyping' => array(__CLASS__, 'chatSendTyping'), 'im.chat.mute' => array(__CLASS__, 'chatMute'), 'im.dialog.messages.get' => array(__CLASS__, 'dialogMessagesGet'), 'im.message.add' => array(__CLASS__, 'messageAdd'), 'im.message.delete' => array(__CLASS__, 'messageDelete'), 'im.message.update' => array(__CLASS__, 'messageUpdate'), 'im.message.like' => array(__CLASS__, 'messageLike'), 'im.message.user.get' => array('callback' => array(__CLASS__, 'messageUserGet'), 'options' => array('private' => true)), 'im.notify' => array(__CLASS__, 'notifyAdd'), 'im.notify.personal.add' => array(__CLASS__, 'notifyAdd'), 'im.notify.system.add' => array(__CLASS__, 'notifyAdd'), 'im.notify.delete' => array(__CLASS__, 'notifyDelete'), 'im.notify.read' => array(__CLASS__, 'notifyRead'), 'im.disk.folder.get' => array(__CLASS__, 'diskFolderGet'), 'im.disk.file.commit' => array(__CLASS__, 'diskFileCommit'), 'im.disk.file.delete' => array(__CLASS__, 'diskFileDelete'), 'im.counters.get' => array(__CLASS__, 'counterGet'), 'im.search.user.list' => array(__CLASS__, 'searchUser'), 'im.search.user' => array('callback' => array(__CLASS__, 'searchUser'), 'options' => array('private' => true)), 'im.search.chat.list' => array(__CLASS__, 'searchChat'), 'im.search.chat' => array('callback' => array(__CLASS__, 'searchChat'), 'options' => array('private' => true)), 'im.search.department.list' => array(__CLASS__, 'searchDepartment'), 'im.search.department' => array('callback' => array(__CLASS__, 'searchDepartment'), 'options' => array('private' => true)), 'im.search.last.get' => array(__CLASS__, 'searchLastGet'), 'im.search.last.add' => array(__CLASS__, 'searchLastAdd'), 'im.search.last.delete' => array(__CLASS__, 'searchLastDelete'), 'im.mobile.config.get' => array('callback' => array(__CLASS__, 'mobileConfigGet'), 'options' => array('private' => true)), ), 'imbot' => Array( 'imbot.register' => array(__CLASS__, 'botRegister'), 'imbot.unregister' => array(__CLASS__, 'botUnRegister'), 'imbot.update' => array(__CLASS__, 'botUpdate'), 'imbot.chat.add' => array(__CLASS__, 'chatCreate'), 'imbot.chat.get' => array(__CLASS__, 'chatGet'), 'imbot.chat.setOwner' => array(__CLASS__, 'chatSetOwner'), 'imbot.chat.setManager' => array(__CLASS__, 'chatSetManager'), 'imbot.chat.updateColor' => array(__CLASS__, 'chatUpdateColor'), 'imbot.chat.updateTitle' => array(__CLASS__, 'chatUpdateTitle'), 'imbot.chat.updateAvatar' => array(__CLASS__, 'chatUpdateAvatar'), 'imbot.chat.leave' => array(__CLASS__, 'chatUserDelete'), 'imbot.chat.user.add' => array(__CLASS__, 'chatUserAdd'), 'imbot.chat.user.delete' => array(__CLASS__, 'chatUserDelete'), 'imbot.chat.user.list' => array(__CLASS__, 'chatUserList'), 'imbot.chat.sendTyping' => array(__CLASS__, 'botSendTyping'), 'imbot.bot.list' => array(__CLASS__, 'botList'), 'imbot.message.add' => array(__CLASS__, 'botMessageAdd'), 'imbot.message.delete' => array(__CLASS__, 'botMessageDelete'), 'imbot.message.update' => array(__CLASS__, 'botMessageUpdate'), 'imbot.message.like' => array(__CLASS__, 'botMessageLike'), 'imbot.sendTyping' => array(__CLASS__, 'botSendTyping'), 'imbot.command.register' => array(__CLASS__, 'commandRegister'), 'imbot.command.unregister' => array(__CLASS__, 'commandUnRegister'), 'imbot.command.update' => array(__CLASS__, 'commandUpdate'), 'imbot.command.answer' => array(__CLASS__, 'commandAnswer'), 'imbot.app.register' => array('callback' => array(__CLASS__, 'appRegister'), 'options' => array('private' => false)), 'imbot.app.unregister' => array('callback' => array(__CLASS__, 'appUnRegister'), 'options' => array('private' => false)), 'imbot.app.update' => array('callback' => array(__CLASS__, 'appUpdate'), 'options' => array('private' => false)), CRestUtil::EVENTS => array( 'OnImBotMessageAdd' => array('im', 'onImBotMessageAdd', array(__CLASS__, 'onBotMessageAdd'), array("category" => \Bitrix\Rest\Sqs::CATEGORY_BOT, "sendRefreshToken" => true)), 'OnImBotMessageUpdate' => array('im', 'onImBotMessageUpdate', array(__CLASS__, 'onBotMessageUpdate'), array("category" => \Bitrix\Rest\Sqs::CATEGORY_BOT, "sendRefreshToken" => true)), 'OnImBotMessageDelete' => array('im', 'onImBotMessageDelete', array(__CLASS__, 'onBotMessageDelete'), array("category" => \Bitrix\Rest\Sqs::CATEGORY_BOT, "sendRefreshToken" => true)), 'OnImBotJoinChat' => array('im', 'onImBotJoinChat', array(__CLASS__, 'onBotJoinChat'), array("category" => \Bitrix\Rest\Sqs::CATEGORY_BOT)), 'OnImBotDelete' => array('im', 'onImBotDelete', array(__CLASS__, 'onBotDelete'), array("category" => \Bitrix\Rest\Sqs::CATEGORY_BOT)), 'OnImCommandAdd' => array('im', 'onImCommandAdd', array(__CLASS__, 'onCommandAdd'), array("category" => \Bitrix\Rest\Sqs::CATEGORY_BOT, "sendRefreshToken" => true)), ), ) ); } public static function OnRestAppDelete($arParams) { if(!\Bitrix\Main\Loader::includeModule('rest')) { return; } $result = \Bitrix\Rest\AppTable::getList(array('filter' =>array('=ID' => $arParams['APP_ID']))); if ($result = $result->fetch()) { $bots = \Bitrix\Im\Bot::getListCache(); foreach ($bots as $bot) { if ($bot['APP_ID'] == $result['CLIENT_ID']) { \Bitrix\Im\Bot::unRegister(Array('BOT_ID' => $bot['BOT_ID'])); } } } } public static function revisionGet($arParams, $n, CRestServer $server) { return array_merge(\Bitrix\Im\Revision::get(), [ // TODO delete temporary merge 'im_revision_mobile' => \Bitrix\Im\Revision::getMobile(), ]); } /* User api */ public static function userGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $userId = null; if (isset($arParams['ID'])) { $userId = intval($arParams['ID']); if ($userId <= 0) { throw new Bitrix\Rest\RestException("User ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $user = \Bitrix\Im\User::getInstance($userId); if ($user->isExists()) { $userId = $user->getId(); } else { throw new Bitrix\Rest\RestException("User is not exists", "USER_NOT_EXISTS", CRestServer::STATUS_WRONG_REQUEST); } $currentUserId = \Bitrix\Im\User::getInstance()->getId(); $isExtranet = \Bitrix\Im\User::getInstance()->isExtranet(); if ($isExtranet && !\Bitrix\Im\Integration\Socialnetwork\Extranet::isUserInGroup($userId, $currentUserId)) { throw new Bitrix\Rest\RestException("You can request only users who consist of your extranet group", "ACCESS_DENIED", CRestServer::STATUS_WRONG_REQUEST); } $result = $user->getArray(Array('JSON' => 'Y', 'HR_PHOTO' => isset($arParams['AVATAR_HR']) && $arParams['AVATAR_HR'] == 'Y')); $result['desktop_last_date'] = \CIMMessenger::GetDesktopStatusOnline($userId); $result['desktop_last_date'] = $result['desktop_last_date']? date('c', $result['desktop_last_date']): false; return $result; } public static function userList($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $users = Array(); if (is_string($arParams['ID'])) { $arParams['ID'] = \CUtil::JsObjectToPhp($arParams['ID']); } if (is_array($arParams['ID'])) { foreach ($arParams['ID'] as $userId) { $userId = intval($userId); if ($userId > 0) { $users[$userId] = $userId; } } } if (empty($users)) { throw new Bitrix\Rest\RestException("A wrong format for the ID field is passed", "INVALID_FORMAT", CRestServer::STATUS_WRONG_REQUEST); } $currentUserId = \Bitrix\Im\User::getInstance()->getId(); $isExtranet = \Bitrix\Im\User::getInstance()->isExtranet(); $extranetUsers = Array($currentUserId); if ($isExtranet) { $groups = \Bitrix\Im\Integration\Socialnetwork\Extranet::getGroup(Array(), $currentUserId); if (is_array($groups)) { foreach ($groups as $group) { foreach ($group['USERS'] as $userId) { $extranetUsers[$userId] = $userId; } } } } $result = Array(); foreach ($users as $userId) { if ($isExtranet && !isset($extranetUsers[$userId])) { $result[$userId] = null; } else { $result[$userId] = \Bitrix\Im\User::getInstance($userId)->getArray(Array('JSON' => 'Y', 'HR_PHOTO' => isset($arParams['AVATAR_HR']) && $arParams['AVATAR_HR'] == 'Y')); } } return $result; } public static function userBusinessList($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $withUserData = $arParams['USER_DATA'] == 'Y'; $params['OFFSET'] = intval($offset) > 0? intval($offset): (isset($arParams['OFFSET']) && intval($arParams['OFFSET']) > 0? intval($arParams['OFFSET']): 0); $params['LIMIT'] = isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 50? 50: intval($arParams['LIMIT'])): 10; $result = \Bitrix\Im\User::getBusiness(null, array('JSON' => 'Y', 'USER_DATA' => $withUserData? 'Y': 'N', 'LIST' => $params)); if ($result['available']) { $result = self::setNavData( $result['result'], array( "count" => $result['total'], "offset" => $params['OFFSET'] ) ); } else { $result = false; } return $result; } /* Status api */ public static function userStatusGet($params, $n, \CRestServer $server) { $userId = \Bitrix\Im\Common::getUserId(); $result = \CIMStatus::GetStatus($userId); if (!$result) { return false; } return $result['STATUS']; } public static function userStatusSet($params, $n, \CRestServer $server) { $params = array_change_key_case($params, CASE_UPPER); if (!is_string($params['STATUS'])) { $params['STATUS'] = strtolower($params['STATUS']); } if (!in_array($params['STATUS'], \CIMStatus::$AVAILABLE_STATUSES)) { throw new Bitrix\Rest\RestException("Status is not available", "STATUS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $userId = \Bitrix\Im\Common::getUserId(); \CIMStatus::Set($userId, Array('STATUS' => $params['STATUS'])); return true; } public static function userStatusIdleStart($params, $n, \CRestServer $server) { $params = array_change_key_case($params, CASE_UPPER); $userId = \Bitrix\Im\Common::getUserId(); if (isset($params['AGO'])) { $ago = intval($params['AGO']); if ($ago <= 1) { $ago = 1; } } else { $ago = 10; } \CIMStatus::SetIdle($userId, true, $ago); return true; } public static function userStatusIdleEnd($params, $n, \CRestServer $server) { $userId = \Bitrix\Im\Common::getUserId(); \CIMStatus::SetIdle($userId, false); return true; } /* Dialog api */ public static function dialogMessagesGet($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!\Bitrix\Im\Common::isDialogId($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (!\Bitrix\Im\Dialog::hasAccess($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("You do not have access to the specified dialog", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $chatId = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); if (isset($arParams['FIRST_ID'])) { $options['FIRST_ID'] = intval($arParams['FIRST_ID']); } else { $options['LAST_ID'] = isset($arParams['LAST_ID']) && intval($arParams['LAST_ID']) > 0? intval($arParams['LAST_ID']): 0; } $options['LIMIT'] = isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 50? 50: intval($arParams['LIMIT'])): 20; $options['JSON'] = 'Y'; return \Bitrix\Im\Chat::getMessages($chatId, null, $options); } /* Search api */ public static function searchUser($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!isset($arParams['FIND'])) { throw new Bitrix\Rest\RestException("Too short a search phrase.", "FIND_SHORT", CRestServer::STATUS_WRONG_REQUEST); } $params = Array( 'FILTER' => Array('SEARCH' => $arParams['FIND']), 'JSON' => 'Y' ); if (isset($arParams['BUSINESS']) && $arParams['BUSINESS'] == 'Y') { $params['FILTER']['BUSINESS'] = 'Y'; } $ormParams = \Bitrix\Im\User::getListParams($params); if (is_null($ormParams)) { throw new Bitrix\Rest\RestException("Too short a search phrase.", "FIND_SHORT", CRestServer::STATUS_WRONG_REQUEST); } $ormParams['select'] = array("CNT" => new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(1)')); $counter = \Bitrix\Main\UserTable::getList($ormParams)->fetch(); $result = Array(); if ($counter && $counter["CNT"] > 0) { $params['OFFSET'] = intval($offset) > 0? intval($offset): (isset($arParams['OFFSET']) && intval($arParams['OFFSET']) > 0? intval($arParams['OFFSET']): 0); $params['LIMIT'] = isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 50? 50: intval($arParams['LIMIT'])): 10; $params['HR_PHOTO'] = isset($arParams['AVATAR_HR']) && $arParams['AVATAR_HR'] == 'Y'; $params['JSON'] = true; $result = \Bitrix\Im\User::getList($params); return self::setNavData( $result, array( "count" => $counter['CNT'], "offset" => $params['OFFSET'] ) ); } return $result; } public static function searchDepartment($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!isset($arParams['FIND'])) { throw new Bitrix\Rest\RestException("Too short a search phrase.", "FIND_SHORT", CRestServer::STATUS_WRONG_REQUEST); } $options = Array( 'FILTER' => Array('SEARCH' => $arParams['FIND']), 'LIST' => Array( 'OFFSET' => intval($offset) > 0? $offset: (isset($arParams['OFFSET']) && intval($arParams['OFFSET']) > 0? intval($arParams['OFFSET']): 0), 'LIMIT' => isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 50? 50: intval($arParams['LIMIT'])): 10, ), 'USER_DATA' => $arParams['USER_DATA'] == 'Y'? 'Y': 'N', 'JSON' => 'Y', ); $result = \Bitrix\Im\Department::getStructure($options); return self::setNavData( $result['result'], array( "count" => $result['total'], "offset" => $options['OFFSET'] ) ); } public static function searchChat($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!isset($arParams['FIND'])) { throw new Bitrix\Rest\RestException("Too short a search phrase.", "FIND_SHORT", CRestServer::STATUS_WRONG_REQUEST); } $params = Array( 'FILTER' => Array('SEARCH' => $arParams['FIND']), 'JSON' => 'Y' ); $ormParams = \Bitrix\Im\Chat::getListParams($params); if (is_null($ormParams)) { throw new Bitrix\Rest\RestException("Too short a search phrase.", "FIND_SHORT", CRestServer::STATUS_WRONG_REQUEST); } $ormParams['select'] = array("CNT" => new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(1)')); $counter = \Bitrix\Im\Model\ChatTable::getList($ormParams)->fetch(); $result = Array(); if ($counter && $counter["CNT"] > 0) { $params['OFFSET'] = intval($offset) > 0? intval($offset): (isset($arParams['OFFSET']) && intval($arParams['OFFSET']) > 0? intval($arParams['OFFSET']): 0); $params['LIMIT'] = isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 50? 50: intval($arParams['LIMIT'])): 10; $params['ORDER'] = Array('ID' => 'DESC'); $params['JSON'] = 'Y'; $result = \Bitrix\Im\Chat::getList($params); return self::setNavData( $result, array( "count" => $counter['CNT'], "offset" => $params['OFFSET'] ) ); } return $result; } public static function searchLastGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $config = Array('JSON' => 'Y'); if ($arParams['SKIP_OPENLINES'] == 'Y') { $config['SKIP_OPENLINES'] = 'Y'; } if ($arParams['SKIP_CHAT'] == 'Y') { $config['SKIP_CHAT'] = 'Y'; } if ($arParams['SKIP_DIALOG'] == 'Y') { $config['SKIP_DIALOG'] = 'Y'; } return \Bitrix\Im\LastSearch::get(null, $config); } public static function searchLastAdd($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!\Bitrix\Im\Common::isDialogId($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } return \Bitrix\Im\LastSearch::add($arParams['DIALOG_ID'])? true: false; } public static function searchLastDelete($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!\Bitrix\Im\Common::isDialogId($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } return \Bitrix\Im\LastSearch::delete($arParams['DIALOG_ID']); } /* Recent api */ public static function recentGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $config = Array('JSON' => 'Y'); if ($arParams['SKIP_OPENLINES'] == 'Y') { $config['SKIP_OPENLINES'] = 'Y'; } if ($arParams['SKIP_CHAT'] == 'Y') { $config['SKIP_CHAT'] = 'Y'; } if ($arParams['SKIP_DIALOG'] == 'Y') { $config['SKIP_DIALOG'] = 'Y'; } return \Bitrix\Im\Recent::get(null, $config); } public static function recentPin($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!\Bitrix\Im\Common::isDialogId($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['ACTION'])) { $arParams['PIN'] = $arParams['ACTION']; } return \Bitrix\Im\Recent::pin($arParams['DIALOG_ID'], $arParams['PIN'] != 'N'); } public static function recentHide($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!\Bitrix\Im\Common::isDialogId($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } return \Bitrix\Im\Recent::hide($arParams['DIALOG_ID']); } /* Department api */ public static function departmentGet($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $ids = Array(); if (is_string($arParams['ID'])) { $arParams['ID'] = \CUtil::JsObjectToPhp($arParams['ID']); } if (is_array($arParams['ID'])) { foreach ($arParams['ID'] as $id) { $id = intval($id); if ($id > 0) { $ids[$id] = $id; } } } if (empty($ids)) { throw new Bitrix\Rest\RestException("A wrong format for the ID field is passed", "INVALID_FORMAT", CRestServer::STATUS_WRONG_REQUEST); } $options = Array( 'FILTER' => Array('ID' => $ids), 'USER_DATA' => $arParams['USER_DATA'] == 'Y'? 'Y': 'N', 'JSON' => 'Y', ); $result = \Bitrix\Im\Department::getStructure($options); return $result; } public static function departmentManagersGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $withUserData = $arParams['USER_DATA'] == 'Y'; $ids = Array(); if (is_string($arParams['ID'])) { $arParams['ID'] = \CUtil::JsObjectToPhp($arParams['ID']); } if (is_array($arParams['ID'])) { foreach ($arParams['ID'] as $id) { $id = intval($id); if ($id > 0) { $ids[$id] = $id; } } } if (empty($ids)) { throw new Bitrix\Rest\RestException("Department ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } return \Bitrix\Im\Department::getManagers($ids, array('JSON' => 'Y', 'USER_DATA' => $withUserData? 'Y': 'N')); } public static function departmentEmployeesGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $withUserData = $arParams['USER_DATA'] == 'Y'; $ids = Array(); if (is_string($arParams['ID'])) { $arParams['ID'] = \CUtil::JsObjectToPhp($arParams['ID']); } if (is_array($arParams['ID'])) { foreach ($arParams['ID'] as $id) { $id = intval($id); if ($id > 0) { $ids[$id] = $id; } } } if (empty($ids)) { throw new Bitrix\Rest\RestException("Department ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } return \Bitrix\Im\Department::getEmployees($ids, array('JSON' => 'Y', 'USER_DATA' => $withUserData? 'Y': 'N')); } public static function departmentColleaguesList($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $withUserData = $arParams['USER_DATA'] == 'Y'; $params['OFFSET'] = intval($offset) > 0? intval($offset): (isset($arParams['OFFSET']) && intval($arParams['OFFSET']) > 0? intval($arParams['OFFSET']): 0); $params['LIMIT'] = isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 50? 50: intval($arParams['LIMIT'])): 10; $result = \Bitrix\Im\Department::getColleagues(null, array('JSON' => 'Y', 'USER_DATA' => $withUserData? 'Y': 'N', 'LIST' => $params)); return self::setNavData( $result['result'], array( "count" => $result['total'], "offset" => $params['OFFSET'] ) ); } /* ChatAPI */ public static function chatCreate($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['USERS'])) { if (is_string($arParams['USERS'])) { $arParams['USERS'] = \CUtil::JsObjectToPhp($arParams['USERS']); } if (!is_array($arParams['USERS'])) { $arParams['USERS'] = []; } } else { $arParams['USERS'] = []; } if (isset($arParams['AVATAR']) && $arParams['AVATAR']) { $arParams['AVATAR'] = CRestUtil::saveFile($arParams['AVATAR']); if (!$arParams['AVATAR'] || strpos($arParams['AVATAR']['type'], "image/") !== 0) { $arParams['AVATAR'] = 0; } else { $arParams['AVATAR'] = CFile::saveFile($arParams['AVATAR'], 'im'); } } else { $arParams['AVATAR'] = 0; } $add = Array( 'TYPE' => $arParams['TYPE'] == 'OPEN'? IM_MESSAGE_OPEN: IM_MESSAGE_CHAT, 'USERS' => $arParams['USERS'], ); if ($arParams['AVATAR'] > 0) { $add['AVATAR_ID'] = $arParams['AVATAR']; } if (isset($arParams['COLOR'])) { $add['COLOR'] = $arParams['COLOR']; } if (isset($arParams['MESSAGE'])) { $add['MESSAGE'] = $arParams['MESSAGE']; } if (isset($arParams['TITLE'])) { $add['TITLE'] = $arParams['TITLE']; } if (isset($arParams['DESCRIPTION'])) { $add['DESCRIPTION'] = $arParams['DESCRIPTION']; } if (isset($arParams['ENTITY_TYPE'])) { $add['ENTITY_TYPE'] = $arParams['ENTITY_TYPE']; } if (isset($arParams['ENTITY_ID'])) { $add['ENTITY_ID'] = $arParams['ENTITY_ID']; } if (isset($arParams['OWNER_ID'])) { $add['OWNER_ID'] = $arParams['OWNER_ID']; } global $USER; $userId = $USER->GetId(); if ($server->getMethod() == "imbot.chat.add") { $userId = self::getBotId($arParams, $server); } $CIMChat = new CIMChat($userId); $chatId = $CIMChat->Add($add); if (!$chatId) { throw new Bitrix\Rest\RestException("Chat can't be created", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return $chatId; } public static function chatGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if ( isset($arParams['ENTITY_TYPE']) && isset($arParams['ENTITY_ID']) && !empty($arParams['ENTITY_TYPE']) && !empty($arParams['ENTITY_ID']) ) { $chatData = \Bitrix\Im\Model\ChatTable::getList(Array( 'select' => ['ID'], 'filter' => [ '=ENTITY_TYPE' => $arParams['ENTITY_TYPE'], '=ENTITY_ID' => $arParams['ENTITY_ID'], ] ))->fetch(); if ($chatData) { return Array( 'ID' => (int)$chatData['ID'] ); } } return null; } public static function chatSetOwner($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); $arParams['USER_ID'] = intval($arParams['USER_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if ($arParams['USER_ID'] <= 0) { throw new Bitrix\Rest\RestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $userId = $USER->GetId(); if ($server->getMethod() == strtolower("imbot.chat.setOwner")) { $userId = self::getBotId($arParams, $server); } if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID']) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $chat = new CIMChat($userId); $result = $chat->SetOwner($arParams['CHAT_ID'], $arParams['USER_ID']); if (!$result) { throw new Bitrix\Rest\RestException("Change owner can only owner and user must be member in chat", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatSetManager($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); $arParams['USER_ID'] = intval($arParams['USER_ID']); $arParams['IS_MANAGER'] = isset($arParams['IS_MANAGER']) && $arParams['IS_MANAGER'] == 'N'? false: true; if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if ($arParams['USER_ID'] <= 0) { throw new Bitrix\Rest\RestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $userId = $USER->GetId(); if ($server->getMethod() == strtolower("imbot.chat.setManager")) { $userId = self::getBotId($arParams, $server); } $chat = new CIMChat($userId); $result = $chat->SetManager($arParams['CHAT_ID'], $arParams['USER_ID'], $arParams['IS_MANAGER']); if (!$result) { throw new Bitrix\Rest\RestException("Change manager can only owner and user must be member in chat", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatUpdateColor($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $userId = $USER->GetId(); if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID'] && !CIMChat::CanSendMessageToGeneralChat($userId)) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } if (!Bitrix\Im\Color::isSafeColor($arParams['COLOR'])) { throw new Bitrix\Rest\RestException("This color currently unavailable", "WRONG_COLOR", CRestServer::STATUS_WRONG_REQUEST); } $userId = $USER->GetId(); if ($server->getMethod() == strtolower("imbot.chat.updateColor")) { $userId = self::getBotId($arParams, $server); } $chat = new CIMChat($userId); $result = $chat->SetColor($arParams['CHAT_ID'], $arParams['COLOR']); if (!$result) { throw new Bitrix\Rest\RestException("This color currently set or chat isn't exists", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatUpdateTitle($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); $arParams['TITLE'] = trim($arParams['TITLE']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (empty($arParams['TITLE'])) { throw new Bitrix\Rest\RestException("Title can't be empty", "TITLE_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $userId = $USER->GetId(); if ($server->getMethod() == strtolower("imbot.chat.updateTitle")) { $userId = self::getBotId($arParams, $server); } if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID'] && !CIMChat::CanSendMessageToGeneralChat($userId)) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $chat = new CIMChat($userId); $result = $chat->Rename($arParams['CHAT_ID'], $arParams['TITLE']); if (!$result) { throw new Bitrix\Rest\RestException("This title currently set or chat isn't exists", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatUpdateAvatar($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $userId = $USER->GetId(); if ($server->getMethod() == strtolower("imbot.chat.updateAvatar")) { $userId = self::getBotId($arParams, $server); } if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID'] && !CIMChat::CanSendMessageToGeneralChat($userId)) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $arParams['AVATAR'] = CRestUtil::saveFile($arParams['AVATAR']); if (!$arParams['AVATAR'] || strpos($arParams['AVATAR']['type'], "image/") !== 0) { throw new Bitrix\Rest\RestException("Avatar incorrect", "AVATAR_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['AVATAR'] = CFile::saveFile($arParams['AVATAR'], 'im'); $result = CIMDisk::UpdateAvatarId($arParams['CHAT_ID'], $arParams['AVATAR'], $userId); if (!$result) { throw new Bitrix\Rest\RestException("Chat isn't exists", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatUserAdd($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID']) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $userId = $USER->GetID(); if ($server->getMethod() == "imbot.chat.user.add") { $userId = self::getBotId($arParams, $server); } $CIMChat = new CIMChat($userId); $result = $CIMChat->AddUser($arParams['CHAT_ID'], $arParams['USERS'], $arParams['HIDE_HISTORY'] != "N"); if (!$result) { throw new Bitrix\Rest\RestException("You don't have access or user already member in chat", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatUserDelete($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); $arParams['USER_ID'] = intval($arParams['USER_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID']) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $userId = $USER->GetID(); if (in_array($server->getMethod(), Array("imbot.chat.leave", "imbot.chat.user.delete"))) { $userId = self::getBotId($arParams, $server); } if (in_array($server->getMethod(), Array("im.chat.user.delete", "imbot.chat.user.delete")) && $arParams['USER_ID'] <= 0) { throw new Bitrix\Rest\RestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $CIMChat = new CIMChat($userId); $result = $CIMChat->DeleteUser($arParams['CHAT_ID'], $arParams['USER_ID'] > 0? $arParams['USER_ID']: $userId); if (!$result) { throw new Bitrix\Rest\RestException("You don't have access or user isn't member in chat", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function chatUserList($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (CIMChat::GetGeneralChatId() == $arParams['CHAT_ID']) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } $userId = $USER->GetID(); if ($server->getMethod() == "imbot.chat.user.list") { $userId = self::getBotId($arParams, $server); } $arChat = CIMChat::GetChatData(array( 'ID' => $arParams['CHAT_ID'], 'USE_CACHE' => 'Y', 'USER_ID' => $userId )); return isset($arChat['userInChat'][$arParams['CHAT_ID']])? $arChat['userInChat'][$arParams['CHAT_ID']]: Array(); } public static function chatSendTyping($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::getChatId($arParams['DIALOG_ID']); } else { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $result = CIMMessenger::StartWriting('chat'.$arParams['CHAT_ID']); if (!$result) { throw new Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } return true; } public static function chatMute($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['ACTION'])) { $arParams['MUTE'] = $arParams['ACTION']; } return \Bitrix\Im\Chat::mute($arParams['CHAT_ID'], $arParams['MUTE'] != 'N'); } public static function botList($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $result = Array(); $list = \Bitrix\Im\Bot::getListCache(); foreach ($list as $botId => $botData) { if ($botData['TYPE'] == \Bitrix\Im\Bot::TYPE_NETWORK) continue; $result[$botId] = Array( 'ID' => $botId, 'NAME' => \Bitrix\Im\User::getInstance($botId)->getFullName(), 'CODE' => $botData['CODE'], 'OPENLINE' => $botData['OPENLINE'], ); } return $result; } public static function messageAdd($arParams, $n, CRestServer $server) { global $USER; $arParams = array_change_key_case($arParams, CASE_UPPER); $arParams['MESSAGE'] = trim($arParams['MESSAGE']); if (strlen($arParams['MESSAGE']) <= 0) { throw new Bitrix\Rest\RestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['DIALOG_ID'])) { if (\Bitrix\Im\Common::isChatId($arParams['DIALOG_ID'])) { $arParams['CHAT_ID'] = \Bitrix\Im\Dialog::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 Bitrix\Rest\RestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (!Bitrix\Im\User::getInstance($arParams['USER_ID'])->isExists()) { throw new Bitrix\Rest\RestException("User not found", "USER_NOT_FOUND", CRestServer::STATUS_WRONG_REQUEST); } $arMessageFields = Array( "MESSAGE_TYPE" => IM_MESSAGE_PRIVATE, "FROM_USER_ID" => $arParams['FROM_USER_ID'], "TO_USER_ID" => $arParams['USER_ID'], "MESSAGE" => $arParams['MESSAGE'], ); } else if (isset($arParams['CHAT_ID'])) { $arParams['CHAT_ID'] = intval($arParams['CHAT_ID']); if ($arParams['CHAT_ID'] <= 0) { throw new Bitrix\Rest\RestException("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 Bitrix\Rest\RestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN); } if (isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y') { $clientId = $server->getClientId(); if ($clientId) { $result = \Bitrix\Rest\AppTable::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']; } } else { $arRelation = CIMChat::GetRelationById($arParams['CHAT_ID']); if (!isset($arRelation[$arParams['FROM_USER_ID']])) { throw new Bitrix\Rest\RestException("You don't have access or user isn't member in chat", "ACCESS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $arMessageFields = Array( "MESSAGE_TYPE" => IM_MESSAGE_CHAT, "FROM_USER_ID" => $arParams['FROM_USER_ID'], "TO_CHAT_ID" => $arParams['CHAT_ID'], "MESSAGE" => $arParams['MESSAGE'], ); } else { throw new Bitrix\Rest\RestException("Incorrect params", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']); if ($attach) { if ($attach->IsAllowSize()) { $arMessageFields['ATTACH'] = $attach; } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['ATTACH']) { throw new Bitrix\Rest\RestException("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 = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard); if ($keyboard) { $arMessageFields['KEYBOARD'] = $keyboard; } else { throw new Bitrix\Rest\RestException("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 = \Bitrix\Im\Bot\ContextMenu::getByJson($menu); if ($menu) { $arMessageFields['MENU'] = $menu; } else { throw new Bitrix\Rest\RestException("Incorrect menu params", "MENU_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y') { $arMessageFields['SYSTEM'] = 'Y'; } if (isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == 'N') { $arMessageFields['URL_PREVIEW'] = 'N'; } $id = CIMMessenger::Add($arMessageFields); if (!$id) { throw new Bitrix\Rest\RestException("Message isn't added", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } return $id; } public static function messageDelete($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['MESSAGE_ID'])) { $arParams['ID'] = $arParams['MESSAGE_ID']; } $arParams['ID'] = intval($arParams['ID']); if ($arParams['ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $res = CIMMessenger::Delete($arParams['ID']); if (!$res) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } return true; } public static function messageUpdate($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['MESSAGE_ID'])) { $arParams['ID'] = $arParams['MESSAGE_ID']; } $arParams['ID'] = intval($arParams['ID']); if ($arParams['ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['IS_EDITED'] = $arParams['IS_EDITED'] == 'N'? 'N': 'Y'; $message = null; if (isset($arParams['ATTACH'])) { $message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['ID']); if (!$message) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } if (empty($arParams['ATTACH']) || $arParams['ATTACH'] == 'N') { CIMMessageParam::Set($arParams['ID'], Array('IS_EDITED' => $arParams['IS_EDITED'], 'ATTACH' => Array())); } else { $attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']); if ($attach) { if ($attach->IsAllowSize()) { CIMMessageParam::Set($arParams['ID'], Array('IS_EDITED' => $arParams['IS_EDITED'], 'ATTACH' => $attach)); } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['ATTACH']) { throw new Bitrix\Rest\RestException("Incorrect attach params", "ATTACH_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } } if (isset($arParams['KEYBOARD'])) { if (is_null($message)) { $message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['ID']); } if (!$message) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } if (empty($arParams['KEYBOARD']) || $arParams['KEYBOARD'] == 'N') { CIMMessageParam::Set($arParams['ID'], Array('KEYBOARD' => 'N')); } else { $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 = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard); if ($keyboard) { if ($keyboard->isAllowSize()) { CIMMessageParam::Set($arParams['ID'], Array('KEYBOARD' => $keyboard)); } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of keyboard", "KEYBOARD_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['KEYBOARD']) { throw new Bitrix\Rest\RestException("Incorrect keyboard params", "KEYBOARD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } } if (isset($arParams['MENU'])) { if (is_null($message)) { $message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']); } if (!$message) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } if (empty($arParams['MENU']) || $arParams['MENU'] == 'N') { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('MENU' => 'N')); } else { $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 = \Bitrix\Im\Bot\ContextMenu::getByJson($menu); if ($menu) { if ($menu->isAllowSize()) { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('MENU' => $menu)); } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of menu", "MENU_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['MENU']) { throw new Bitrix\Rest\RestException("Incorrect menu params", "menu_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } } if (isset($arParams['MESSAGE'])) { $urlPreview = isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == "N"? false: true; $res = CIMMessenger::Update($arParams['ID'], $arParams['MESSAGE'], $urlPreview); if (!$res) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } } CIMMessageParam::SendPull($arParams['ID'], Array('KEYBOARD', 'ATTACH', 'MENU')); return true; } public static function messageLike($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['MESSAGE_ID'])) { $arParams['ID'] = $arParams['MESSAGE_ID']; } $arParams['ID'] = intval($arParams['ID']); if ($arParams['ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['ACTION'] = strtolower($arParams['ACTION']); if (!in_array($arParams['ACTION'], Array('auto', 'plus', 'minus'))) { $arParams['ACTION'] = 'auto'; } $result = CIMMessenger::Like($arParams['ID'], $arParams['ACTION']); if ($result === false) { throw new Bitrix\Rest\RestException("Action completed without changes", "WITHOUT_CHANGES", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function messageUserGet($arParams, $offset, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); global $USER; $userId = $USER->GetID(); if ($userId <= 0) { throw new Bitrix\Rest\RestException("User ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['FIRST_ID'])) { $options['FIRST_ID'] = intval($arParams['FIRST_ID']); } else { $options['LAST_ID'] = isset($arParams['LAST_ID']) && intval($arParams['LAST_ID']) > 0? intval($arParams['LAST_ID']): 0; } $options['LIMIT'] = isset($arParams['LIMIT'])? (intval($arParams['LIMIT']) > 500? 500: intval($arParams['LIMIT'])): 50; $options['JSON'] = 'Y'; $forUser = $userId; if (isset($arParams['USER_ID']) && intval($arParams['USER_ID']) > 0 && $arParams['USER_ID'] != $userId) { if ( ( !\Bitrix\Im\User::getInstance($arParams['USER_ID'])->isActive() && !\Bitrix\Im\User::getInstance($arParams['USER_ID'])->isExtranet() || \Bitrix\Im\User::getInstance($arParams['USER_ID'])->isConnector() ) && ( $USER->IsAdmin() || \Bitrix\Main\Loader::includeModule('bitrix24') && CBitrix24::IsPortalAdmin($userId) ) ) { $forUser = intval($arParams['USER_ID']); $options['SKIP_MESSAGE'] = 'Y'; } else { throw new Bitrix\Rest\RestException("You don't have access to this user", "ACCESS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } return \Bitrix\Im\User::getMessages($forUser, $options); } public static function notifyAdd($arParams, $n, CRestServer $server) { global $USER; if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['TO'])) { $arParams['USER_ID'] = $arParams['TO']; } $arParams['USER_ID'] = intval($arParams['USER_ID']); if ($arParams['USER_ID'] <= 0) { throw new Bitrix\Rest\RestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if ($server->getMethod() == "im.notify.personal.add") { $arParams['TYPE'] = 'USER'; } else if ($server->getMethod() == "im.notify.system.add") { $arParams['TYPE'] = 'SYSTEM'; } else if (!isset($arParams['TYPE']) || !in_array($arParams['TYPE'], Array('USER', 'SYSTEM'))) { $arParams['TYPE'] = 'USER'; } $arParams['MESSAGE'] = trim($arParams['MESSAGE']); if (strlen($arParams['MESSAGE']) <= 0) { throw new Bitrix\Rest\RestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $messageOut = ""; $arParams['MESSAGE_OUT'] = trim($arParams['MESSAGE_OUT']); if ($arParams['TYPE'] == 'SYSTEM') { $fromUserId = 0; $notifyType = IM_NOTIFY_SYSTEM; $clientId = $server->getClientId(); if ($clientId) { $result = \Bitrix\Rest\AppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId))); $result = $result->fetch(); $moduleName = isset($result['APP_NAME'])? $result['APP_NAME']: $result['CODE']; $message = $moduleName."#BR#".$arParams['MESSAGE']; if (!empty($arParams['MESSAGE_OUT'])) { $messageOut = $moduleName."#BR#".$arParams['MESSAGE_OUT']; } } else { $message = $arParams['MESSAGE']; } } else { $fromUserId = $USER->GetID(); $notifyType = IM_NOTIFY_FROM; $message = $arParams['MESSAGE']; if (!empty($arParams['MESSAGE_OUT'])) { $messageOut = $arParams['MESSAGE_OUT']; } } $arMessageFields = array( "TO_USER_ID" => $arParams['USER_ID'], "FROM_USER_ID" => $fromUserId, "NOTIFY_TYPE" => $notifyType, "NOTIFY_MODULE" => "rest", "NOTIFY_EVENT" => "rest_notify", "NOTIFY_MESSAGE" => $message, "NOTIFY_MESSAGE_OUT" => $messageOut, ); $clientId = $server->getClientId(); if ($clientId) { if (!empty($arParams['TAG'])) { $appKey = substr(md5($server->getClientId()), 0, 5); $arMessageFields['NOTIFY_TAG'] = 'MP|'.$appKey.'|'.$arParams['TAG']; } if (!empty($arParams['SUB_TAG'])) { $appKey = substr(md5($server->getClientId()), 0, 5); $arMessageFields['NOTIFY_SUB_TAG'] = 'MP|'.$appKey.'|'.$arParams['SUB_TAG']; } } $attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']); if ($attach) { if ($attach->IsAllowSize()) { $arMessageFields['ATTACH'] = $attach; } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['ATTACH']) { throw new Bitrix\Rest\RestException("Incorrect attach params", "ATTACH_ERROR", CRestServer::STATUS_WRONG_REQUEST); } return CIMNotify::Add($arMessageFields); } public static function notifyDelete($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['ID']) && intval($arParams['ID']) > 0) { $CIMNotify = new CIMNotify(); $result = $CIMNotify->DeleteWithCheck($arParams['ID']); } else { $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } if (!empty($arParams['TAG'])) { $appKey = substr(md5($clientId), 0, 5); $result = CIMNotify::DeleteByTag('MP|'.$appKey.'|'.$arParams['TAG']); } else if (!empty($arParams['SUB_TAG'])) { $appKey = substr(md5($clientId), 0, 5); $result = CIMNotify::DeleteBySubTag('MP|'.$appKey.'|'.$arParams['SUB_TAG']); } else { throw new Bitrix\Rest\RestException("Incorrect params", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } return $result; } public static function notifyRead($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (isset($arParams['ID']) && intval($arParams['ID']) > 0) { $CIMNotify = new CIMNotify(); $CIMNotify->MarkNotifyRead($arParams['ID'], $arParams['ONLY_CURRENT'] != 'Y'); } return true; } public static function diskFolderGet($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $chatId = intval($arParams['CHAT_ID']); if ($chatId <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $chatRelation = CIMChat::GetRelationById($chatId); if (!$chatRelation[CIMDisk::GetUserId()]) { throw new Bitrix\Rest\RestException("You don't have access to this chat", "ACCESS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $folderModel = CIMDisk::GetFolderModel($chatId); if (!$folderModel) { throw new Bitrix\Rest\RestException("Internal server error.", "INTERNAL_ERROR", CRestServer::STATUS_INTERNAL); } return Array( 'ID' => (int)$folderModel->getId() ); } public static function diskFileCommit($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $chatId = intval($arParams['CHAT_ID']); if ($chatId <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $arParams['MESSAGE'] = trim($arParams['MESSAGE']); if (strlen($arParams['MESSAGE']) <= 0) { unset($arParams['MESSAGE']); } $arParams['SILENT_MODE'] = $arParams['SILENT_MODE'] == 'Y'; $chatRelation = CIMChat::GetRelationById($chatId); if (!$chatRelation[CIMDisk::GetUserId()]) { throw new Bitrix\Rest\RestException("You don't have access to this chat", "ACCESS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $files = Array(); if (isset($arParams['DISK_ID'])) { if (!is_array($arParams['DISK_ID'])) { $arParams['DISK_ID'] = Array($arParams['DISK_ID']); } foreach ($arParams['DISK_ID'] as $fileId) { $files[$fileId] = 'disk'.$fileId; } } else if (isset($arParams['UPLOAD_ID'])) { if (!is_array($arParams['UPLOAD_ID'])) { $arParams['UPLOAD_ID'] = Array($arParams['UPLOAD_ID']); } foreach ($arParams['UPLOAD_ID'] as $fileId) { $files[$fileId] = 'upload'.$fileId; } } if (empty($files)) { throw new Bitrix\Rest\RestException("List of files in not specified", "FILES_ERROR", CRestServer::STATUS_WRONG_REQUEST); } return CIMDisk::UploadFileFromDisk($chatId, array_values($files), $arParams['MESSAGE'], $arParams['SILENT_MODE']); } public static function diskFileDelete($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $chatId = intval($arParams['CHAT_ID']); if ($chatId <= 0) { throw new Bitrix\Rest\RestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $fileId = intval($arParams['DISK_ID']); if ($fileId <= 0) { throw new Bitrix\Rest\RestException("Disk ID can't be empty", "DISK_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } return CIMDisk::DeleteFile($chatId, $fileId); } public static function counterGet($arParams, $n, CRestServer $server) { global $USER; return \Bitrix\Im\Counter::get($USER->GetID()); } public static function notImplemented($arParams, $n, CRestServer $server) { throw new Bitrix\Rest\RestException("Method isn't implemented yet", "NOT_IMPLEMENTED", CRestServer::STATUS_NOT_FOUND); } /* BotAPI */ public static function botRegister($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $customClientId = false; $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $customClientId = true; $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } if ($customClientId) { $arApp = ['ID' => '', 'CLIENT_ID' => $arParams['CLIENT_ID']]; } else { $dbRes = \Bitrix\Rest\AppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId))); $arApp = $dbRes->fetch(); } if (isset($arParams['EVENT_HANDLER']) && !empty($arParams['EVENT_HANDLER'])) { $arParams['EVENT_MESSAGE_ADD'] = $arParams['EVENT_MESSAGE_UPDATE'] = $arParams['EVENT_MESSAGE_DELETE'] = $arParams['EVENT_WELCOME_MESSAGE'] = $arParams['EVENT_BOT_DELETE'] = $arParams['EVENT_HANDLER']; } if (isset($arParams['EVENT_MESSAGE_ADD']) && !empty($arParams['EVENT_MESSAGE_ADD'])) { if ($customClientId) { $arParams['EVENT_MESSAGE_ADD'] = $arParams['EVENT_MESSAGE_ADD'].(strpos($arParams['EVENT_MESSAGE_ADD'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['EVENT_MESSAGE_ADD'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_MESSAGE_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("Handler for \"Message add\" event isn't specified", "EVENT_MESSAGE_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['EVENT_MESSAGE_UPDATE']) && !empty($arParams['EVENT_MESSAGE_UPDATE'])) { if ($customClientId) { $arParams['EVENT_MESSAGE_UPDATE'] = $arParams['EVENT_MESSAGE_UPDATE'].(strpos($arParams['EVENT_MESSAGE_UPDATE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['EVENT_MESSAGE_UPDATE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_MESSAGE_UPDATE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['EVENT_MESSAGE_DELETE']) && !empty($arParams['EVENT_MESSAGE_DELETE'])) { if ($customClientId) { $arParams['EVENT_MESSAGE_DELETE'] = $arParams['EVENT_MESSAGE_DELETE'].(strpos($arParams['EVENT_MESSAGE_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['EVENT_MESSAGE_DELETE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_MESSAGE_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['EVENT_WELCOME_MESSAGE']) && !empty($arParams['EVENT_WELCOME_MESSAGE'])) { if ($customClientId) { $arParams['EVENT_WELCOME_MESSAGE'] = $arParams['EVENT_WELCOME_MESSAGE'].(strpos($arParams['EVENT_WELCOME_MESSAGE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['EVENT_WELCOME_MESSAGE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_WELCOME_MESSAGE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("Handler for \"Welcome message\" event isn't specified", "EVENT_WELCOME_MESSAGE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['EVENT_BOT_DELETE']) && !empty($arParams['EVENT_BOT_DELETE'])) { if ($customClientId) { $arParams['EVENT_BOT_DELETE'] = $arParams['EVENT_BOT_DELETE'].(strpos($arParams['EVENT_BOT_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['EVENT_BOT_DELETE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_BOT_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("Handler for \"Bot delete\" event isn't specified", "EVENT_BOT_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (!isset($arParams['CODE']) || empty($arParams['CODE'])) { throw new Bitrix\Rest\RestException("Bot code isn't specified", "CODE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $counter = \Bitrix\Im\Model\BotTable::getCount(array('=APP_ID' => $clientId)); if ($counter >= 5) { throw new Bitrix\Rest\RestException("Has reached the maximum number of bots for application (max: 5)", "MAX_COUNT_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['TYPE'] = in_array($arParams['TYPE'], Array('O', 'B', 'H', 'S'))? $arParams['TYPE']: 'B'; $arParams['OPENLINE'] = $arParams['OPENLINE'] == 'Y'? 'Y': 'N'; if (!(in_array($arParams['TYPE'], Array('S', 'O')) || $arParams['OPENLINE'] == 'Y')) { unset($arParams['EVENT_MESSAGE_UPDATE']); unset($arParams['EVENT_MESSAGE_DELETE']); } $properties = Array(); if (isset($arParams['PROPERTIES']['NAME'])) { $properties['NAME'] = $arParams['PROPERTIES']['NAME']; } if (isset($arParams['PROPERTIES']['LAST_NAME'])) { $properties['LAST_NAME'] = $arParams['PROPERTIES']['LAST_NAME']; } if (!(isset($properties['NAME']) || isset($properties['LAST_NAME']))) { throw new Bitrix\Rest\RestException("Bot name isn't specified", "NAME_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['PROPERTIES']['COLOR'])) { $properties['COLOR'] = $arParams['PROPERTIES']['COLOR']; } if (isset($arParams['PROPERTIES']['EMAIL'])) { $properties['EMAIL'] = $arParams['PROPERTIES']['EMAIL']; } if (isset($arParams['PROPERTIES']['PERSONAL_BIRTHDAY'])) { $birthday = new \Bitrix\Main\Type\DateTime($arParams['PROPERTIES']['PERSONAL_BIRTHDAY'].' 19:45:00', 'Y-m-d H:i:s'); $birthday = $birthday->format(\Bitrix\Main\Type\Date::convertFormatToPhp(\CSite::GetDateFormat('SHORT'))); $properties['PERSONAL_BIRTHDAY'] = $birthday; } if (isset($arParams['PROPERTIES']['WORK_POSITION'])) { $properties['WORK_POSITION'] = $arParams['PROPERTIES']['WORK_POSITION']; } if (isset($arParams['PROPERTIES']['PERSONAL_WWW'])) { $properties['PERSONAL_WWW'] = $arParams['PROPERTIES']['PERSONAL_WWW']; } if (isset($arParams['PROPERTIES']['PERSONAL_GENDER'])) { $properties['PERSONAL_GENDER'] = $arParams['PROPERTIES']['PERSONAL_GENDER']; } if (isset($arParams['PROPERTIES']['PERSONAL_PHOTO'])) { $avatar = CRestUtil::saveFile($arParams['PROPERTIES']['PERSONAL_PHOTO'], $arParams['CODE'].'.png'); if (isset($avatar) && strpos($avatar['type'], "image/") === 0) { $properties['PERSONAL_PHOTO'] = $avatar; } } $botId = \Bitrix\Im\Bot::register(Array( 'APP_ID' => $clientId, 'CODE' => $arParams['CODE'], 'TYPE' => $arParams['TYPE'], 'OPENLINE' => $arParams['OPENLINE'], 'MODULE_ID' => 'rest', 'PROPERTIES' => $properties )); if ($botId) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', $arParams['EVENT_MESSAGE_ADD']); if ($arParams['EVENT_MESSAGE_UPDATE']) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', $arParams['EVENT_MESSAGE_UPDATE']); } if ($arParams['EVENT_MESSAGE_DELETE']) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', $arParams['EVENT_MESSAGE_UPDATE']); } self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', $arParams['EVENT_WELCOME_MESSAGE']); self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', $arParams['EVENT_BOT_DELETE']); } else { throw new Bitrix\Rest\RestException("Bot can't be created", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return $botId; } public static function botUnRegister($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $customClientId = false; $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $customClientId = true; $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $result = \Bitrix\Im\Bot::unRegister(Array('BOT_ID' => $arParams['BOT_ID'])); if (!$result) { throw new Bitrix\Rest\RestException("Bot can't be deleted", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } if ($customClientId) { self::unbindEvent("", $arParams['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', true); self::unbindEvent("", $arParams['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', true); self::unbindEvent("", $arParams['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', true); self::unbindEvent("", $arParams['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', true); self::unbindEvent("", $arParams['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', true); } return true; } public static function botUpdate($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); $customClientId = false; if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $customClientId = true; $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($customClientId) { $arApp = ['ID' => '', 'CLIENT_ID' => $arParams['CLIENT_ID']]; } else { $dbRes = \Bitrix\Rest\AppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId))); $arApp = $dbRes->fetch(); } $updateEvents = Array(); if (isset($arParams['FIELDS']['EVENT_HANDLER']) && !empty($arParams['FIELDS']['EVENT_HANDLER'])) { $arParams['FIELDS']['EVENT_MESSAGE_ADD'] = $arParams['FIELDS']['EVENT_MESSAGE_UPDATE'] = $arParams['FIELDS']['EVENT_MESSAGE_DELETE'] = $arParams['FIELDS']['EVENT_WELCOME_MESSAGE'] = $arParams['FIELDS']['EVENT_BOT_DELETE'] = $arParams['FIELDS']['EVENT_HANDLER']; } if (isset($arParams['FIELDS']['EVENT_MESSAGE_ADD']) && !empty($arParams['FIELDS']['EVENT_MESSAGE_ADD'])) { $updateEvents['EVENT_MESSAGE_ADD'] = $arParams['FIELDS']['EVENT_MESSAGE_ADD']; if ($customClientId) { $updateEvents['EVENT_MESSAGE_ADD'] = $updateEvents['EVENT_MESSAGE_ADD'].(strpos($updateEvents['EVENT_MESSAGE_ADD'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['FIELDS']['EVENT_MESSAGE_ADD'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_MESSAGE_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['FIELDS']['EVENT_MESSAGE_UPDATE']) && !empty($arParams['FIELDS']['EVENT_MESSAGE_UPDATE'])) { $updateEvents['EVENT_MESSAGE_UPDATE'] = $arParams['FIELDS']['EVENT_MESSAGE_UPDATE']; if ($customClientId) { $updateEvents['EVENT_MESSAGE_UPDATE'] = $updateEvents['EVENT_MESSAGE_UPDATE'].(strpos($updateEvents['EVENT_MESSAGE_UPDATE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['FIELDS']['EVENT_MESSAGE_UPDATE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_MESSAGE_UPDATE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['FIELDS']['EVENT_MESSAGE_DELETE']) && !empty($arParams['FIELDS']['EVENT_MESSAGE_DELETE'])) { $updateEvents['EVENT_MESSAGE_DELETE'] = $arParams['FIELDS']['EVENT_MESSAGE_DELETE']; if ($customClientId) { $updateEvents['EVENT_MESSAGE_DELETE'] = $updateEvents['EVENT_MESSAGE_DELETE'].(strpos($updateEvents['EVENT_MESSAGE_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['FIELDS']['EVENT_MESSAGE_DELETE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_MESSAGE_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['FIELDS']['EVENT_WELCOME_MESSAGE']) && !empty($arParams['FIELDS']['EVENT_WELCOME_MESSAGE'])) { $updateEvents['EVENT_WELCOME_MESSAGE'] = $arParams['FIELDS']['EVENT_WELCOME_MESSAGE']; if ($customClientId) { $updateEvents['EVENT_WELCOME_MESSAGE'] = $updateEvents['EVENT_WELCOME_MESSAGE'].(strpos($updateEvents['EVENT_WELCOME_MESSAGE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['FIELDS']['EVENT_WELCOME_MESSAGE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_WELCOME_MESSAGE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['FIELDS']['EVENT_BOT_DELETE']) && !empty($arParams['FIELDS']['EVENT_BOT_DELETE'])) { $updateEvents['EVENT_BOT_DELETE'] = $arParams['FIELDS']['EVENT_BOT_DELETE']; if ($customClientId) { $updateEvents['EVENT_BOT_DELETE'] = $updateEvents['EVENT_BOT_DELETE'].(strpos($updateEvents['EVENT_BOT_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['FIELDS']['EVENT_BOT_DELETE'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_BOT_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $updateFields = Array(); if (isset($arParams['FIELDS']['CODE']) && !empty($arParams['FIELDS']['CODE'])) { $updateFields['CODE'] = $arParams['FIELDS']['CODE']; } if (isset($arParams['FIELDS']['TYPE']) && !empty($arParams['FIELDS']['TYPE']) && in_array($arParams['TYPE'], Array('O', 'B', 'H'))) { $updateFields['TYPE'] = $arParams['FIELDS']['TYPE']; } if (isset($arParams['FIELDS']['OPENLINE']) && !empty($arParams['FIELDS']['OPENLINE'])) { $updateFields['OPENLINE'] = $arParams['FIELDS']['OPENLINE']; } $properties = Array(); if (isset($arParams['FIELDS']['PROPERTIES']['NAME'])) { $properties['NAME'] = $arParams['FIELDS']['PROPERTIES']['NAME']; } if (isset($arParams['FIELDS']['PROPERTIES']['LAST_NAME'])) { $properties['LAST_NAME'] = $arParams['FIELDS']['PROPERTIES']['LAST_NAME']; } if (isset($properties['NAME']) && empty($properties['NAME']) && isset($properties['LAST_NAME']) && empty($properties['LAST_NAME'])) { throw new Bitrix\Rest\RestException("Bot name isn't specified", "NAME_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['FIELDS']['PROPERTIES']['COLOR'])) { $properties['COLOR'] = $arParams['FIELDS']['PROPERTIES']['COLOR']; } if (isset($arParams['FIELDS']['PROPERTIES']['EMAIL'])) { $properties['EMAIL'] = $arParams['FIELDS']['PROPERTIES']['EMAIL']; } if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_BIRTHDAY'])) { $birthday = new \Bitrix\Main\Type\DateTime($arParams['FIELDS']['PROPERTIES']['PERSONAL_BIRTHDAY'].' 19:45:00', 'Y-m-d H:i:s'); $birthday = $birthday->format(\Bitrix\Main\Type\Date::convertFormatToPhp(\CSite::GetDateFormat('SHORT'))); $properties['PERSONAL_BIRTHDAY'] = $birthday; } if (isset($arParams['FIELDS']['PROPERTIES']['WORK_POSITION'])) { $properties['WORK_POSITION'] = $arParams['FIELDS']['PROPERTIES']['WORK_POSITION']; } if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_WWW'])) { $properties['PERSONAL_WWW'] = $arParams['FIELDS']['PROPERTIES']['PERSONAL_WWW']; } if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_GENDER'])) { $properties['PERSONAL_GENDER'] = $arParams['FIELDS']['PROPERTIES']['PERSONAL_GENDER']; } if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_PHOTO'])) { $avatar = CRestUtil::saveFile($arParams['FIELDS']['PROPERTIES']['PERSONAL_PHOTO'], $bots[$arParams['BOT_ID']]['CODE'].'.png'); if ($avatar && strpos($avatar['type'], "image/") === 0) { $properties['PERSONAL_PHOTO'] = $avatar; } } if (!empty($properties)) { $updateFields['PROPERTIES'] = $properties; } if (empty($updateFields)) { if (empty($updateEvents)) { throw new Bitrix\Rest\RestException("Update fields can't be empty", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } } else { $result = \Bitrix\Im\Bot::update(Array('BOT_ID' => $arParams['BOT_ID']), $updateFields); if (!$result) { throw new Bitrix\Rest\RestException("Bot can't be updated", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($updateEvents['EVENT_MESSAGE_ADD'])) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', $updateEvents['EVENT_MESSAGE_ADD']); } if (isset($updateEvents['EVENT_MESSAGE_UPDATE'])) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', $updateEvents['EVENT_MESSAGE_UPDATE']); } if (isset($updateEvents['EVENT_MESSAGE_DELETE'])) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', $updateEvents['EVENT_MESSAGE_DELETE']); } if (isset($updateEvents['EVENT_WELCOME_MESSAGE'])) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', $updateEvents['EVENT_WELCOME_MESSAGE']); } if (isset($updateEvents['EVENT_BOT_DELETE'])) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', $updateEvents['EVENT_BOT_DELETE']); } return true; } public static function botMessageAdd($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (isset($arParams['BOT_ID'])) { if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { $botFound = false; foreach ($bots as $bot) { if ($bot['APP_ID'] == $clientId) { $botFound = true; $arParams['BOT_ID'] = $bot['BOT_ID']; break; } } if (!$botFound) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $arMessageFields = Array(); if (intval($arParams['FROM_USER_ID']) && intval($arParams['TO_USER_ID'])) { $arParams['SYSTEM'] = 'Y'; $arMessageFields['FROM_USER_ID'] = intval($arParams['FROM_USER_ID']); $arMessageFields['TO_USER_ID'] = intval($arParams['TO_USER_ID']); } else { $arMessageFields['DIALOG_ID'] = $arParams['DIALOG_ID']; if (!\Bitrix\Im\Common::isDialogId($arMessageFields['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } } $arMessageFields['MESSAGE'] = trim($arParams['MESSAGE']); if (strlen($arMessageFields['MESSAGE']) <= 0) { throw new Bitrix\Rest\RestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['ATTACH']) && !empty($arParams['ATTACH'])) { $attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']); if ($attach) { if ($attach->IsAllowSize()) { $arMessageFields['ATTACH'] = $attach; } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['ATTACH']) { throw new Bitrix\Rest\RestException("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 = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard); if ($keyboard) { $arMessageFields['KEYBOARD'] = $keyboard; } else { throw new Bitrix\Rest\RestException("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 = \Bitrix\Im\Bot\ContextMenu::getByJson($menu); if ($menu) { $arMessageFields['MENU'] = $menu; } else { throw new Bitrix\Rest\RestException("Incorrect menu params", "MENU_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y') { $arMessageFields['SYSTEM'] = 'Y'; } if (isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == 'N') { $arMessageFields['URL_PREVIEW'] = 'N'; } $id = \Bitrix\Im\Bot::addMessage(array('BOT_ID' => $arParams['BOT_ID']), $arMessageFields); if (!$id) { throw new Bitrix\Rest\RestException("Message isn't added", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return $id; } public static function botMessageUpdate($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (isset($arParams['BOT_ID'])) { if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { $botFound = false; foreach ($bots as $bot) { if ($bot['APP_ID'] == $clientId) { $botFound = true; $arParams['BOT_ID'] = $bot['BOT_ID']; break; } } if (!$botFound) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['MESSAGE_ID'] = intval($arParams['MESSAGE_ID']); if ($arParams['MESSAGE_ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $message = null; if (isset($arParams['ATTACH'])) { $message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']); if (!$message) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } if (empty($arParams['ATTACH']) || $arParams['ATTACH'] == 'N') { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('ATTACH' => Array())); } else { $attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']); if ($attach) { if ($attach->IsAllowSize()) { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('ATTACH' => $attach)); } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['ATTACH']) { throw new Bitrix\Rest\RestException("Incorrect attach params", "ATTACH_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } } if (isset($arParams['KEYBOARD'])) { if (is_null($message)) { $message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']); } if (!$message) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } if (empty($arParams['KEYBOARD']) || $arParams['KEYBOARD'] == 'N') { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('KEYBOARD' => 'N')); } else { $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 = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard); if ($keyboard) { if ($keyboard->isAllowSize()) { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('KEYBOARD' => $keyboard)); } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of keyboard", "KEYBOARD_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['KEYBOARD']) { throw new Bitrix\Rest\RestException("Incorrect keyboard params", "KEYBOARD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } } if (isset($arParams['MENU'])) { if (is_null($message)) { $message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']); } if (!$message) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } if (empty($arParams['MENU']) || $arParams['MENU'] == 'N') { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('MENU' => 'N')); } else { $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 = \Bitrix\Im\Bot\ContextMenu::getByJson($menu); if ($menu) { if ($menu->isAllowSize()) { CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('MENU' => $menu)); } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of menu", "MENU_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['MENU']) { throw new Bitrix\Rest\RestException("Incorrect menu params", "menu_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } } if (isset($arParams['MESSAGE'])) { $urlPreview = isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == "N"? false: true; $skipConnector = isset($arParams['SKIP_CONNECTOR']) && $arParams['SKIP_CONNECTOR'] == "Y"? true: false; $res = CIMMessenger::Update($arParams['MESSAGE_ID'], $arParams['MESSAGE'], $urlPreview, false, $arParams['BOT_ID'], $skipConnector); if (!$res) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } } CIMMessageParam::SendPull($arParams['MESSAGE_ID'], Array('KEYBOARD', 'ATTACH', 'MENU')); return true; } public static function botMessageDelete($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (isset($arParams['BOT_ID'])) { if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { $botFound = false; foreach ($bots as $bot) { if ($bot['APP_ID'] == $clientId) { $botFound = true; $arParams['BOT_ID'] = $bot['BOT_ID']; break; } } if (!$botFound) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['MESSAGE_ID'] = intval($arParams['MESSAGE_ID']); if ($arParams['MESSAGE_ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $res = CIMMessenger::Delete($arParams['MESSAGE_ID'], $arParams['BOT_ID'], $arParams['COMPLETE'] == 'Y'); if (!$res) { throw new Bitrix\Rest\RestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN); } return true; } public static function botMessageLike($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (isset($arParams['BOT_ID'])) { if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { $botFound = false; foreach ($bots as $bot) { if ($bot['APP_ID'] == $clientId) { $botFound = true; $arParams['BOT_ID'] = $bot['BOT_ID']; break; } } if (!$botFound) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $arParams['MESSAGE_ID'] = intval($arParams['MESSAGE_ID']); if ($arParams['MESSAGE_ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['ACTION'] = strtolower($arParams['ACTION']); if (!in_array($arParams['ACTION'], Array('auto', 'plus', 'minus'))) { $arParams['ACTION'] = 'auto'; } $result = CIMMessenger::Like($arParams['MESSAGE_ID'], $arParams['ACTION'], $arParams['BOT_ID']); if ($result === false) { throw new Bitrix\Rest\RestException("Action completed without changes", "WITHOUT_CHANGES", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function botSendTyping($arParams, $n, CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (isset($arParams['BOT_ID'])) { if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { $botFound = false; foreach ($bots as $bot) { if ($bot['APP_ID'] == $clientId) { $botFound = true; $arParams['BOT_ID'] = $bot['BOT_ID']; break; } } if (!$botFound) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (!\Bitrix\Im\Common::isDialogId($arParams['DIALOG_ID'])) { throw new Bitrix\Rest\RestException("Dialog ID can't be empty", "DIALOG_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } \Bitrix\Im\Bot::startWriting(Array('BOT_ID' => $arParams['BOT_ID']), $arParams['DIALOG_ID']); return true; } public static function onCommandAdd($arParams, $arHandler) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!$arHandler['APP_CODE']) { $parts = parse_url($arHandler['EVENT_HANDLER']); parse_str($parts['query'], $query); $query = array_change_key_case($query, CASE_UPPER); if ($query['CLIENT_ID']) { $arHandler['APP_CODE'] = 'custom'.$query['CLIENT_ID']; } } if (!$arHandler['APP_CODE']) { throw new Exception('Event is intended for another application'); } $bot = \Bitrix\Im\Bot::getListCache(); $commandId = Array(); foreach ($arParams[0] as $commandData) { if ($commandData['APP_ID'] == $arHandler['APP_CODE'] && $commandData['BOT_ID'] > 0) { $sendBotData = self::getAccessToken($arHandler['APP_ID'], $commandData['BOT_ID']); $sendBotData['AUTH'] = $sendBotData; $sendBotData['BOT_ID'] = $commandData['BOT_ID']; $sendBotData['BOT_CODE'] = $bot[$commandData['BOT_ID']]['CODE']; $sendBotData['COMMAND'] = $commandData['COMMAND']; $sendBotData['COMMAND_ID'] = $commandData['ID']; $sendBotData['COMMAND_PARAMS'] = $commandData['EXEC_PARAMS']; $sendBotData['COMMAND_CONTEXT'] = $commandData['CONTEXT']; $sendBotData['MESSAGE_ID'] = $arParams[1]; $commandId[$sendBotData['COMMAND_ID']] = $sendBotData; if ($commandData['CONTEXT'] != 'KEYBOARD') { if ( $arParams[2]['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE || $arParams[2]['FROM_USER_ID'] == $commandData['BOT_ID'] || $arParams[2]['TO_USER_ID'] == $commandData['BOT_ID'] ) { \Bitrix\Im\Bot::startWriting(Array('BOT_ID' => $commandData['BOT_ID']), $arParams[2]['DIALOG_ID']); } } } } if (empty($commandId)) { throw new Exception('Event is intended for another application'); } $arParams[2]['MESSAGE_ID'] = $arParams[1]; $arParams[2]['CHAT_TYPE'] = $arParams[2]['MESSAGE_TYPE']; $arParams[2]['LANGUAGE'] = \Bitrix\Im\Bot::getDefaultLanguage(); if ($arParams[2]['FROM_USER_ID'] > 0) { $fromUser = \Bitrix\Im\User::getInstance($arParams[2]['FROM_USER_ID'])->getFields(); $user = Array( 'ID' => $fromUser['id'], 'NAME' => $fromUser['name'], 'FIRST_NAME' => $fromUser['first_name'], 'LAST_NAME' => $fromUser['last_name'], 'WORK_POSITION' => $fromUser['work_position'], 'GENDER' => $fromUser['gender'], ); } else { $user = Array(); } return Array( 'COMMAND' => $commandId, 'PARAMS' => $arParams[2], 'USER' => $user ); } public static function onBotMessageAdd($arParams, $arHandler) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!$arHandler['APP_CODE']) { $parts = parse_url($arHandler['EVENT_HANDLER']); parse_str($parts['query'], $query); $query = array_change_key_case($query, CASE_UPPER); if ($query['CLIENT_ID']) { $arHandler['APP_CODE'] = 'custom'.$query['CLIENT_ID']; } } if (!$arHandler['APP_CODE']) { throw new Exception('Event is intended for another application'); } $bots = Array(); foreach ($arParams[0] as $botData) { if ($botData['APP_ID'] == $arHandler['APP_CODE']) { $sendBotData = self::getAccessToken($arHandler['APP_ID'], $botData['BOT_ID']); $sendBotData['AUTH'] = $sendBotData; $sendBotData['BOT_ID'] = $botData['BOT_ID']; $sendBotData['BOT_CODE'] = $botData['CODE']; $bots[$botData['BOT_ID']] = $sendBotData; if ($arParams[2]['CHAT_ENTITY_TYPE'] != 'LINES' && $botData['TYPE'] != \Bitrix\Im\Bot::TYPE_SUPERVISOR) { \Bitrix\Im\Bot::startWriting(Array('BOT_ID' => $botData['BOT_ID']), $arParams[2]['DIALOG_ID']); } } } if (empty($bots)) { throw new Exception('Event is intended for another application'); } $arParams[2]['MESSAGE_ID'] = $arParams[1]; $arParams[2]['CHAT_TYPE'] = $arParams[2]['MESSAGE_TYPE']; $arParams[2]['LANGUAGE'] = \Bitrix\Im\Bot::getDefaultLanguage(); if ($arParams[2]['FROM_USER_ID'] > 0) { $fromUser = \Bitrix\Im\User::getInstance($arParams[2]['FROM_USER_ID'])->getFields(); $user = Array( 'ID' => $fromUser['id'], 'NAME' => $fromUser['name'], 'FIRST_NAME' => $fromUser['first_name'], 'LAST_NAME' => $fromUser['last_name'], 'WORK_POSITION' => $fromUser['work_position'], 'GENDER' => $fromUser['gender'], 'IS_BOT' => $fromUser['bot']? 'Y':'N', 'IS_CONNECTOR' => $fromUser['connector']? 'Y':'N', 'IS_NETWORK' => $fromUser['network']? 'Y':'N', 'IS_EXTRANET' => $fromUser['extranet']? 'Y':'N', ); } else { $user = Array(); } return Array( 'BOT' => $bots, 'PARAMS' => $arParams[2], 'USER' => $user ); } public static function onBotMessageUpdate($arParams, $arHandler) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!$arHandler['APP_CODE']) { $parts = parse_url($arHandler['EVENT_HANDLER']); parse_str($parts['query'], $query); $query = array_change_key_case($query, CASE_UPPER); if ($query['CLIENT_ID']) { $arHandler['APP_CODE'] = 'custom'.$query['CLIENT_ID']; } } if (!$arHandler['APP_CODE']) { throw new Exception('Event is intended for another application'); } $bots = Array(); foreach ($arParams[0] as $botData) { if ($botData['APP_ID'] == $arHandler['APP_CODE']) { $sendBotData = self::getAccessToken($arHandler['APP_ID'], $botData['BOT_ID']); $sendBotData['AUTH'] = $sendBotData; $sendBotData['BOT_ID'] = $botData['BOT_ID']; $sendBotData['BOT_CODE'] = $botData['CODE']; $bots[$botData['BOT_ID']] = $sendBotData; } } if (empty($bots)) { throw new Exception('Event is intended for another application'); } $arParams[2]['MESSAGE_ID'] = $arParams[1]; $arParams[2]['CHAT_TYPE'] = $arParams[2]['MESSAGE_TYPE']; $arParams[2]['LANGUAGE'] = \Bitrix\Im\Bot::getDefaultLanguage(); if ($arParams[2]['FROM_USER_ID'] > 0) { $fromUser = \Bitrix\Im\User::getInstance($arParams[2]['FROM_USER_ID'])->getFields(); $user = Array( 'ID' => $fromUser['id'], 'NAME' => $fromUser['name'], 'FIRST_NAME' => $fromUser['first_name'], 'LAST_NAME' => $fromUser['last_name'], 'WORK_POSITION' => $fromUser['work_position'], 'GENDER' => $fromUser['gender'], 'IS_BOT' => $fromUser['bot']? 'Y':'N', 'IS_CONNECTOR' => $fromUser['connector']? 'Y':'N', 'IS_NETWORK' => $fromUser['network']? 'Y':'N', 'IS_EXTRANET' => $fromUser['extranet']? 'Y':'N', ); } else { $user = Array(); } return Array( 'BOT' => $bots, 'PARAMS' => $arParams[2], 'USER' => $user ); } public static function onBotMessageDelete($arParams, $arHandler) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!$arHandler['APP_CODE']) { $parts = parse_url($arHandler['EVENT_HANDLER']); parse_str($parts['query'], $query); $query = array_change_key_case($query, CASE_UPPER); if ($query['CLIENT_ID']) { $arHandler['APP_CODE'] = 'custom'.$query['CLIENT_ID']; } } if (!$arHandler['APP_CODE']) { throw new Exception('Event is intended for another application'); } $bots = Array(); foreach ($arParams[0] as $botData) { if ($botData['APP_ID'] == $arHandler['APP_CODE']) { $sendBotData = self::getAccessToken($arHandler['APP_ID'], $botData['BOT_ID']); $sendBotData['AUTH'] = $sendBotData; $sendBotData['BOT_ID'] = $botData['BOT_ID']; $sendBotData['BOT_CODE'] = $botData['CODE']; $bots[$botData['BOT_ID']] = $sendBotData; } } if (empty($bots)) { throw new Exception('Event is intended for another application'); } $arParams[2]['MESSAGE_ID'] = $arParams[1]; $arParams[2]['CHAT_TYPE'] = $arParams[2]['MESSAGE_TYPE']; $arParams[2]['LANGUAGE'] = \Bitrix\Im\Bot::getDefaultLanguage(); if ($arParams[2]['FROM_USER_ID'] > 0) { $fromUser = \Bitrix\Im\User::getInstance($arParams[2]['FROM_USER_ID'])->getFields(); $user = Array( 'ID' => $fromUser['id'], 'NAME' => $fromUser['name'], 'FIRST_NAME' => $fromUser['first_name'], 'LAST_NAME' => $fromUser['last_name'], 'WORK_POSITION' => $fromUser['work_position'], 'GENDER' => $fromUser['gender'], 'IS_BOT' => $fromUser['bot']? 'Y':'N', 'IS_CONNECTOR' => $fromUser['connector']? 'Y':'N', 'IS_NETWORK' => $fromUser['network']? 'Y':'N', 'IS_EXTRANET' => $fromUser['extranet']? 'Y':'N', ); } else { $user = Array(); } return Array( 'BOT' => $bots, 'PARAMS' => $arParams[2], 'USER' => $user ); } public static function onBotJoinChat($arParams, $arHandler) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!$arHandler['APP_CODE']) { $parts = parse_url($arHandler['EVENT_HANDLER']); parse_str($parts['query'], $query); $query = array_change_key_case($query, CASE_UPPER); if ($query['CLIENT_ID']) { $arHandler['APP_CODE'] = 'custom'.$query['CLIENT_ID']; } } if (!$arHandler['APP_CODE']) { throw new Exception('Event is intended for another application'); } $bots = Array(); if ($arParams[0]['APP_ID'] == $arHandler['APP_CODE']) { $sendBotData = self::getAccessToken($arHandler['APP_ID'], $arParams[0]['BOT_ID']); $sendBotData['AUTH'] = $sendBotData; $sendBotData['BOT_ID'] = $arParams[0]['BOT_ID']; $sendBotData['BOT_CODE'] = $arParams[0]['CODE']; $bots[$arParams[0]['BOT_ID']] = $sendBotData; } if (empty($bots)) { throw new Exception('Event is intended for another application'); } $params = $arParams[2]; $params['DIALOG_ID'] = $arParams[1]; $params['LANGUAGE'] = \Bitrix\Im\Bot::getDefaultLanguage(); if ($params['USER_ID'] > 0) { $fromUser = \Bitrix\Im\User::getInstance($params['USER_ID'])->getFields(); $user = Array( 'ID' => $fromUser['id'], 'NAME' => $fromUser['name'], 'FIRST_NAME' => $fromUser['first_name'], 'LAST_NAME' => $fromUser['last_name'], 'WORK_POSITION' => $fromUser['work_position'], 'GENDER' => $fromUser['gender'], ); } else { $user = Array(); } if ($arParams[2]['CHAT_TYPE'] != 'LINES' && $arParams[0]['TYPE'] != \Bitrix\Im\Bot::TYPE_SUPERVISOR) { \Bitrix\Im\Bot::startWriting(Array('BOT_ID' => $params['BOT_ID']), $params['DIALOG_ID']); } return Array( 'BOT' => $bots, 'PARAMS' => $params, 'USER' => $user ); } public static function onBotDelete($arParams, $arHandler) { $arParams = array_change_key_case($arParams, CASE_UPPER); if (!$arHandler['APP_CODE']) { $parts = parse_url($arHandler['EVENT_HANDLER']); parse_str($parts['query'], $query); $query = array_change_key_case($query, CASE_UPPER); if ($query['CLIENT_ID']) { $arHandler['APP_CODE'] = 'custom'.$query['CLIENT_ID']; } } if (!$arHandler['APP_CODE']) { throw new Exception('Event is intended for another application'); } $botCode = ""; if ($arParams[0]['APP_ID'] == $arHandler['APP_CODE']) { $botCode = $arParams[0]['CODE']; } if (!$botCode) { throw new Exception('Event is intended for another application'); } $botId = $arParams[1]; $result = self::unbindEvent($arHandler['APP_ID'], $arHandler['APP_CODE'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd'); if ($result) { self::unbindEvent($arHandler['APP_ID'], $arHandler['APP_CODE'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat'); self::unbindEvent($arHandler['APP_ID'], $arHandler['APP_CODE'], 'im', 'onImBotDelete', 'OnImBotDelete'); } return Array( 'BOT_ID' => $botId, 'BOT_CODE' => $botCode ); } public static function commandRegister($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $customClientId = false; $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $customClientId = true; $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } if ($customClientId) { $arApp = ['ID' => '', 'CLIENT_ID' => $arParams['CLIENT_ID']]; } else { $dbRes = \Bitrix\Rest\AppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId))); $arApp = $dbRes->fetch(); } if (isset($arParams['EVENT_COMMAND_ADD']) && !empty($arParams['EVENT_COMMAND_ADD'])) { if ($customClientId) { $arParams['EVENT_COMMAND_ADD'] = $arParams['EVENT_COMMAND_ADD'].(strpos($arParams['EVENT_COMMAND_ADD'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['EVENT_COMMAND_ADD'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_COMMAND_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("Handler for \"Command add\" event isn't specified", "EVENT_COMMAND_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (!isset($arParams['COMMAND']) || empty($arParams['COMMAND'])) { throw new Bitrix\Rest\RestException("Command isn't specified", "COMMAND_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['BOT_ID'] = intval($arParams['BOT_ID']); if ($arParams['BOT_ID'] > 0) { $bots = \Bitrix\Im\Bot::getListCache(); if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $arParams['COMMON'] = isset($arParams['COMMON']) && $arParams['COMMON'] == 'Y'? 'Y': 'N'; $arParams['HIDDEN'] = isset($arParams['HIDDEN']) && $arParams['HIDDEN'] == 'Y'? 'Y': 'N'; $arParams['EXTRANET_SUPPORT'] = isset($arParams['EXTRANET_SUPPORT']) && $arParams['EXTRANET_SUPPORT'] == 'Y'? 'Y': 'N'; if (!isset($arParams['LANG']) || empty($arParams['LANG'])) { throw new Bitrix\Rest\RestException("Lang set can't be empty", "LANG_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $commandId = \Bitrix\Im\Command::register(Array( 'APP_ID' => $clientId, 'BOT_ID' => $arParams['BOT_ID'], 'COMMAND' => $arParams['COMMAND'], 'COMMON' => $arParams['COMMON'], 'HIDDEN' => $arParams['HIDDEN'], 'SONET_SUPPORT' => $arParams['SONET_SUPPORT'], 'EXTRANET_SUPPORT' => $arParams['EXTRANET_SUPPORT'], 'MODULE_ID' => 'rest', 'LANG' => $arParams['LANG'], )); if ($commandId) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImCommandAdd', 'onImCommandAdd', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImCommandAdd', 'onImCommandAdd', $arParams['EVENT_COMMAND_ADD']); } else { throw new Bitrix\Rest\RestException("Command can't be created", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return $commandId; } public static function commandUnRegister($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $commands = \Bitrix\Im\Command::getListCache(); if (!isset($commands[$arParams['COMMAND_ID']])) { throw new Bitrix\Rest\RestException("Command not found", "COMMAND_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($commands[$arParams['COMMAND_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Command was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $result = \Bitrix\Im\Command::unRegister(Array('COMMAND_ID' => $arParams['COMMAND_ID'])); if (!$result) { throw new Bitrix\Rest\RestException("Command can't be deleted", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function commandUpdate($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); $customClientId = false; if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $customClientId = true; $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Command::getListCache(); if (!isset($bots[$arParams['COMMAND_ID']])) { throw new Bitrix\Rest\RestException("Command not found", "COMMAND_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($bots[$arParams['COMMAND_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Command was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($customClientId) { $arApp = ['ID' => '', 'CLIENT_ID' => $arParams['CLIENT_ID']]; } else { $dbRes = \Bitrix\Rest\AppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId))); $arApp = $dbRes->fetch(); } $updateEvents = Array(); if (isset($arParams['FIELDS']['EVENT_COMMAND_ADD']) && !empty($arParams['FIELDS']['EVENT_COMMAND_ADD'])) { $updateEvents['EVENT_COMMAND_ADD'] = $arParams['FIELDS']['EVENT_COMMAND_ADD']; if ($customClientId) { $updateEvents['EVENT_COMMAND_ADD'] = $updateEvents['EVENT_COMMAND_ADD'].(strpos($updateEvents['EVENT_COMMAND_ADD'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID']; } try { \Bitrix\Rest\HandlerHelper::checkCallback($arParams['FIELDS']['EVENT_COMMAND_ADD'], $arApp); } catch(Exception $e) { throw new Bitrix\Rest\RestException($e->getMessage(), "EVENT_COMMAND_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $updateFields = Array(); if (isset($arParams['FIELDS']['COMMAND']) && !empty($arParams['FIELDS']['COMMAND'])) { $updateFields['COMMAND'] = $arParams['FIELDS']['COMMAND']; } if (isset($arParams['FIELDS']['HIDDEN']) && !empty($arParams['FIELDS']['HIDDEN'])) { $updateFields['HIDDEN'] = $arParams['FIELDS']['HIDDEN'] == 'Y'? 'Y': 'N'; } if (isset($arParams['FIELDS']['EXTRANET_SUPPORT']) && !empty($arParams['FIELDS']['EXTRANET_SUPPORT'])) { $updateFields['EXTRANET_SUPPORT'] = $arParams['FIELDS']['EXTRANET_SUPPORT'] == 'Y'? 'Y': 'N'; } if (isset($arParams['FIELDS']['LANG']) && !empty($arParams['FIELDS']['LANG'])) { $updateFields['LANG'] = $arParams['FIELDS']['LANG']; } if (empty($updateFields)) { if (empty($updateEvents)) { throw new Bitrix\Rest\RestException("Update fields can't be empty", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } } else { $result = \Bitrix\Im\Command::update(Array('COMMAND_ID' => $arParams['COMMAND_ID']), $updateFields); if (!$result) { throw new Bitrix\Rest\RestException("Command can't be updated", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($updateEvents['EVENT_COMMAND_ADD'])) { self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImCommandAdd', 'onImCommandAdd', true); self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImCommandAdd', 'onImCommandAdd', $updateEvents['EVENT_COMMAND_ADD']); } return true; } public static function commandAnswer($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $commands = \Bitrix\Im\Command::getListCache(); if (isset($arParams['COMMAND_ID'])) { if (!isset($commands[$arParams['COMMAND_ID']])) { throw new Bitrix\Rest\RestException("Command not found", "COMMAND_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($commands[$arParams['COMMAND_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Command was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else if (isset($arParams['COMMAND'])) { $commandFound = false; foreach ($commands as $command) { if ($command['APP_ID'] == $clientId && $command['COMMAND'] == $arParams['COMMAND']) { $commandFound = true; $arParams['COMMAND_ID'] = $command['COMMAND_ID']; break; } } if (!$commandFound) { throw new Bitrix\Rest\RestException("Command not found", "COMMAND_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } $botId = intval($commands[$arParams['COMMAND_ID']]['BOT_ID']); $arMessageFields = Array(); $arParams['MESSAGE_ID'] = intval($arParams['MESSAGE_ID']); if ($arParams['MESSAGE_ID'] <= 0) { throw new Bitrix\Rest\RestException("Message ID can't be empty", "MESSAGE_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $arMessageFields['MESSAGE'] = trim($arParams['MESSAGE']); if (strlen($arMessageFields['MESSAGE']) <= 0) { throw new Bitrix\Rest\RestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST); } $attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']); if ($attach) { if ($attach->IsAllowSize()) { $arMessageFields['ATTACH'] = $attach; } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else if ($arParams['ATTACH']) { throw new Bitrix\Rest\RestException("Incorrect attach params", "ATTACH_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (isset($arParams['KEYBOARD']) && !empty($arParams['KEYBOARD']) && $botId > 0) { $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'] = $botId; $keyboard = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard); if ($keyboard) { if ($keyboard->isAllowSize()) { $arMessageFields['KEYBOARD'] = $keyboard; } else { throw new Bitrix\Rest\RestException("You have exceeded the maximum allowable size of keyboard", "KEYBOARD_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("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 = \Bitrix\Im\Bot\ContextMenu::getByJson($menu); if ($menu) { $arMessageFields['MENU'] = $menu; } else { throw new Bitrix\Rest\RestException("Incorrect menu params", "MENU_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } if (isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y') { $arMessageFields['SYSTEM'] = 'Y'; } if (isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == 'N') { $arMessageFields['URL_PREVIEW'] = 'N'; } $id = \Bitrix\Im\Command::addMessage(Array( 'MESSAGE_ID' => $arParams['MESSAGE_ID'], 'COMMAND_ID' => $arParams['COMMAND_ID'] ), $arMessageFields); if (!$id) { throw new Bitrix\Rest\RestException("Message isn't added", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return $id; } public static function appRegister($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } if (!isset($arParams['CODE']) || empty($arParams['CODE'])) { throw new Bitrix\Rest\RestException("App code isn't specified", "CODE_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $iframe = ''; $iframeWidth = 0; $iframeHeight = 0; $iframePopup = 'N'; $hash = ''; $js = ''; if ( isset($arParams['JS_METHOD']) && in_array($arParams['JS_METHOD'], Array('PUT', 'SEND', 'CALL', 'SUPPORT')) && isset($arParams['JS_PARAM']) && !empty($arParams['JS_PARAM']) ) { if ($arParams['JS_METHOD'] == 'SEND') { if (preg_match('/\/([a-zA-Z0-9\-\_\+]+)((\s)?([a-zA-Z0-9\-\_\+]+))+/im', $arParams['JS_PARAM'], $matches)) { $js = "BXIM.sendMessage('".$matches[0]."');"; } } else if ($arParams['JS_METHOD'] == 'PUT') { if (preg_match('/\/([a-zA-Z0-9\-\_\+]+)((\s)?([a-zA-Z0-9\-\_\+]+))+/im', $arParams['JS_PARAM'], $matches)) { $js = "BXIM.putMessage('".$matches[0]."');"; } } else if ($arParams['JS_METHOD'] == 'CALL') { if (preg_match('/\+?[ \-\d+\(\)\#]+$/im', $arParams['JS_PARAM'], $matches)) { $js = "BXIM.phoneTo('".$matches[0]."');"; } } else if ($arParams['JS_METHOD'] == 'SUPPORT') { if (preg_match('/[a-f0-9]{32}$/im', $arParams['JS_PARAM'], $matches)) { $js = "BXIM.openMessenger('networkLines".$matches[0]."');"; } } } else if (isset($arParams['IFRAME']) && !empty($arParams['IFRAME'])) { $check = parse_url($arParams['IFRAME']); if (!isset($check['scheme']) && !isset($check['host'])) { throw new Bitrix\Rest\RestException("Iframe params must be HTTPS site", "IFRAME_HTTPS", CRestServer::STATUS_WRONG_REQUEST); } else if ($check['scheme'] != 'https' || empty($check['host'])) { throw new Bitrix\Rest\RestException("Iframe params must be HTTPS site", "IFRAME_HTTPS", CRestServer::STATUS_WRONG_REQUEST); } $iframe = $arParams['IFRAME']; $iframeWidth = 320; if (isset($arParams['IFRAME_WIDTH'])) { $iframeWidth = intval($arParams['IFRAME_WIDTH']) > 250? $arParams['IFRAME_WIDTH']: 250; } $iframeHeight = 250; if (isset($arParams['IFRAME_HEIGHT'])) { $iframeHeight = intval($arParams['IFRAME_HEIGHT']) > 50? $arParams['IFRAME_HEIGHT']: 50; } $iframePopup = isset($arParams['IFRAME_POPUP']) && $arParams['IFRAME_POPUP'] == 'Y'? 'Y': 'N'; if (!isset($arParams['HASH']) || empty($arParams['HASH'])) { throw new Bitrix\Rest\RestException("Hash can't be empty", "HASH_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $hash = substr($arParams['HASH'], 0, 32); } if (!$iframe && !$js) { throw new Bitrix\Rest\RestException("Iframe or JS method isn't specified", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $iconId = 0; if (isset($arParams['ICON_FILE']) && $arParams['ICON_FILE']) { $iconFile = CRestUtil::saveFile($arParams['ICON_FILE']); if ($iconFile && strpos($iconFile['type'], "image/") === 0) { $iconId = \CFile::SaveFile($iconFile, 'imbot'); } } $context = isset($arParams['CONTEXT'])? $arParams['CONTEXT']: 'ALL'; $hidden = isset($arParams['HIDDEN']) && $arParams['HIDDEN'] == 'Y'? 'Y': 'N'; $extranetSupport = isset($arParams['EXTRANET_SUPPORT']) && $arParams['EXTRANET_SUPPORT'] == 'Y'? 'Y': 'N'; $livechatSupport = isset($arParams['LIVECHAT_SUPPORT']) && $arParams['LIVECHAT_SUPPORT'] == 'Y'? 'Y': 'N'; $arParams['BOT_ID'] = intval($arParams['BOT_ID']); if ($arParams['BOT_ID'] > 0) { $bots = \Bitrix\Im\Bot::getListCache(); if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if (!isset($arParams['LANG']) || empty($arParams['LANG'])) { throw new Bitrix\Rest\RestException("Lang set can't be empty", "LANG_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $id = \Bitrix\Im\App::register(Array( 'APP_ID' => $clientId, 'BOT_ID' => $arParams['BOT_ID'], 'CODE' => $arParams['CODE'], 'ICON_ID' => $iconId, 'HASH' => $hash, 'CONTEXT' => $context, 'HIDDEN' => $hidden, 'REGISTERED' => 'Y', 'JS' => $js, 'IFRAME' => $iframe, 'IFRAME_HEIGHT' => $iframeHeight, 'IFRAME_WIDTH' => $iframeWidth, 'IFRAME_POPUP' => $iframePopup, 'EXTRANET_SUPPORT' => $extranetSupport, 'LIVECHAT_SUPPORT' => $livechatSupport, 'MODULE_ID' => 'rest', 'LANG' => $arParams['LANG'], )); if (!$id) { throw new Bitrix\Rest\RestException("App can't be registered".\var_export(Array( 'APP_ID' => $clientId, 'BOT_ID' => $arParams['BOT_ID'], 'CODE' => $arParams['CODE'], 'ICON_ID' => $iconId, 'HASH' => $hash, 'CONTEXT' => $context, 'HIDDEN' => $hidden, 'JS' => $js, 'IFRAME' => $iframe, 'IFRAME_HEIGHT' => $iframeHeight, 'IFRAME_WIDTH' => $iframeWidth, 'IFRAME_POPUP' => $iframePopup, 'EXTRANET_SUPPORT' => $extranetSupport, 'LIVECHAT_SUPPORT' => $livechatSupport, 'MODULE_ID' => 'rest', 'LANG' => $arParams['LANG'], ),1), "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return $id; } public static function appUnRegister($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $apps = \Bitrix\Im\App::getListCache(); if (!isset($apps[$arParams['APP_ID']])) { throw new Bitrix\Rest\RestException("App not found", "CHAT_APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($apps[$arParams['APP_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("App was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $result = \Bitrix\Im\App::unRegister(Array('ID' => $arParams['APP_ID'])); if (!$result) { throw new Bitrix\Rest\RestException("App can't be deleted", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } return true; } public static function appUpdate($arParams, $n, CRestServer $server) { if ($server->getAuthType() == \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $apps = \Bitrix\Im\App::getListCache(); if (!isset($apps[$arParams['APP_ID']])) { throw new Bitrix\Rest\RestException("App not found", "CHAT_APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($apps[$arParams['APP_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("App was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } $updateFields = Array(); if (isset($arParams['FIELDS']['CONTEXT']) && !empty($arParams['FIELDS']['CONTEXT'])) { $updateFields['CONTEXT'] = $arParams['FIELDS']['CONTEXT']; } if (isset($arParams['FIELDS']['HASH']) && !empty($arParams['FIELDS']['HASH'])) { $updateFields['HASH'] = $arParams['FIELDS']['HASH']; } if ( isset($arParams['FIELDS']['JS_METHOD']) && in_array($arParams['FIELDS']['JS_METHOD'], Array('PUT', 'SEND', 'CALL', 'SUPPORT')) && isset($arParams['FIELDS']['JS_PARAM']) && !empty($arParams['FIELDS']['JS_PARAM']) ) { if ($arParams['FIELDS']['JS_METHOD'] == 'SEND') { if (preg_match('/\/([a-zA-Z0-9\-\_\+]+)((\s)?([a-zA-Z0-9\-\_\+]+))+/im', $arParams['FIELDS']['JS_PARAM'], $matches)) { $updateFields['JS'] = "BXIM.sendMessage('".$matches[0]."');"; } } else if ($arParams['FIELDS']['JS_METHOD'] == 'PUT') { if (preg_match('/\/([a-zA-Z0-9\-\_\+]+)((\s)?([a-zA-Z0-9\-\_\+]+))+/im', $arParams['FIELDS']['JS_PARAM'], $matches)) { $updateFields['JS'] = "BXIM.putMessage('".$matches[0]."');"; } } else if ($arParams['FIELDS']['JS_METHOD'] == 'CALL') { if (preg_match('/\+?[ \-\d+\(\)\#]+$/im', $arParams['FIELDS']['JS_PARAM'], $matches)) { $updateFields['JS'] = "BXIM.phoneTo('".$matches[0]."');"; } } else if ($arParams['FIELDS']['JS_METHOD'] == 'SUPPORT') { if (preg_match('/[a-f0-9]{32}$/im', $arParams['FIELDS']['JS_PARAM'], $matches)) { $updateFields['JS'] = "BXIM.openMessenger('networkLines".$matches[0]."');"; } } if (isset($updateFields['JS'])) { $updateFields['IFRAME'] = ''; } } else if (isset($arParams['FIELDS']['IFRAME']) && !empty($arParams['FIELDS']['IFRAME'])) { $check = parse_url($arParams['FIELDS']['IFRAME']); if (!isset($check['scheme']) && !isset($check['host'])) { throw new Bitrix\Rest\RestException("Iframe params must be HTTPS site", "IFRAME_HTTPS", CRestServer::STATUS_WRONG_REQUEST); } else if ($check['scheme'] != 'https' || empty($check['host'])) { throw new Bitrix\Rest\RestException("Iframe params must be HTTPS site", "IFRAME_HTTPS", CRestServer::STATUS_WRONG_REQUEST); } $updateFields['IFRAME'] = $arParams['FIELDS']['IFRAME']; $updateFields['JS'] = ''; } if (isset($arParams['FIELDS']['IFRAME_WIDTH'])) { $updateFields['IFRAME_WIDTH'] = intval($arParams['FIELDS']['IFRAME_WIDTH']); } if (isset($arParams['FIELDS']['IFRAME_HEIGHT'])) { $updateFields['IFRAME_HEIGHT'] = intval($arParams['FIELDS']['IFRAME_HEIGHT']); } if (isset($arParams['FIELDS']['IFRAME_POPUP']) && !empty($arParams['FIELDS']['IFRAME_POPUP'])) { $updateFields['IFRAME_POPUP'] = $arParams['FIELDS']['IFRAME_POPUP'] == 'Y'? 'Y': 'N'; } if (isset($arParams['FIELDS']['HIDDEN']) && !empty($arParams['FIELDS']['HIDDEN'])) { $updateFields['HIDDEN'] = $arParams['FIELDS']['HIDDEN'] == 'Y'? 'Y': 'N'; } if (isset($arParams['FIELDS']['EXTRANET_SUPPORT']) && !empty($arParams['FIELDS']['EXTRANET_SUPPORT'])) { $updateFields['EXTRANET_SUPPORT'] = $arParams['FIELDS']['EXTRANET_SUPPORT'] == 'Y'? 'Y': 'N'; } if (isset($arParams['FIELDS']['LIVECHAT_SUPPORT']) && !empty($arParams['FIELDS']['LIVECHAT_SUPPORT'])) { $updateFields['LIVECHAT_SUPPORT'] = $arParams['FIELDS']['LIVECHAT_SUPPORT'] == 'Y'? 'Y': 'N'; } if (isset($arParams['FIELDS']['LANG']) && !empty($arParams['FIELDS']['LANG'])) { $updateFields['LANG'] = $arParams['FIELDS']['LANG']; } if (isset($arParams['FIELDS']['ICON_FILE'])) { $iconFile = CRestUtil::saveFile($arParams['FIELDS']['ICON_FILE']); if ($iconFile && strpos($iconFile['type'], "image/") === 0) { $updateFields['ICON_FILE_ID'] = \CFile::SaveFile($iconFile, 'imbot'); } } if (!empty($updateFields)) { $result = \Bitrix\Im\App::update(Array('ID' => $arParams['APP_ID']), $updateFields); if (!$result) { throw new Bitrix\Rest\RestException("Command can't be updated", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST); } } return true; } private static function getAccessToken($appId, $userId) { $session = \Bitrix\Rest\Event\Session::get(); if(!$session) { return Array(); } $auth = \Bitrix\Rest\Event\Sender::getAuth( $appId, $userId, array('EVENT_SESSION' => $session) ); return $auth? $auth: Array(); } private static function bindEvent($appId, $appCode, $bitrixEventModule, $bitrixEventName, $restEventName, $restEventHandler) { $res = \Bitrix\Rest\EventTable::getList(array( 'filter' => array( '=EVENT_NAME' => toUpper($restEventName), "=APPLICATION_TOKEN" => $appCode, '=APP_ID' => $appId, ), 'select' => array('ID') )); if ($handler = $res->fetch()) { return true; } $result = \Bitrix\Rest\EventTable::add(array( "APP_ID" => $appId, "EVENT_NAME" => toUpper($restEventName), "EVENT_HANDLER" => $restEventHandler, "APPLICATION_TOKEN" => $appCode, "USER_ID" => 0, )); if($result->isSuccess()) { \Bitrix\Rest\Event\Sender::bind($bitrixEventModule, $bitrixEventName); } return true; } private static function unbindEvent($appId, $appCode, $bitrixEventModule, $bitrixEventName, $restEventName, $skipCheck = false) { if (!$skipCheck) { $res = \Bitrix\Im\Model\BotTable::getList(array( 'filter' => array( '=APP_ID' => $appCode, ), 'select' => array('BOT_ID') )); if ($handler = $res->fetch()) { return false; } } $res = \Bitrix\Rest\EventTable::getList(array( 'filter' => array( '=EVENT_NAME' => toUpper($restEventName), '=APP_ID' => $appId, '=APPLICATION_TOKEN' => $appCode, ), 'select' => array('ID', 'EVENT_HANDLER') )); while($handler = $res->fetch()) { \Bitrix\Rest\EventTable::delete($handler['ID']); } return true; } public static function mobileConfigGet($params, $n, \CRestServer $server) { if ($server->getAuthType() != \Bitrix\Rest\SessionAuth\Auth::AUTH_TYPE) { throw new \Bitrix\Rest\RestException("Get access to browser const available only for session authorization.", "WRONG_AUTH_TYPE", \CRestServer::STATUS_FORBIDDEN); } $config = Array(); $settings = CIMSettings::Get(); $config['SETTINGS'] = $settings['settings']; $userId = $GLOBALS['USER']->GetID(); if (!isset($config['CONTACT_LIST']['users'][$userId])) { $arUsers = CIMContactList::GetUserData(array( 'ID' => $userId, 'DEPARTMENT' => 'N', 'USE_CACHE' => 'Y', 'SHOW_ONLINE' => 'N' )); $config['CONTACT_LIST']['users'][$userId] = $arUsers['users'][$userId]; } $config["ACTION"] = 'DIALOG'; $config["PATH_TO_USER_PROFILE"] = SITE_DIR.'mobile/users/?user_id='.$userId.'&FROM_DIALOG=Y'; $config["PATH_TO_USER_PROFILE_TEMPLATE"] = SITE_DIR.'mobile/users/?user_id=#user_id#&FROM_DIALOG=Y'; $config['WEBRTC_MOBILE_SUPPORT'] = \Bitrix\Main\Loader::includeModule('mobileapp')? \Bitrix\MobileApp\Mobile::getInstance()->isWebRtcSupported(): false; return \CIMMessenger::GetMobileDialogTemplateJS([], $config); } private static function getBotId($arParams, \CRestServer $server) { $arParams = array_change_key_case($arParams, CASE_UPPER); $clientId = $server->getClientId(); if (!$clientId) { if (!empty($arParams['CLIENT_ID'])) { $clientId = 'custom'.$arParams['CLIENT_ID']; } else { throw new \Bitrix\Rest\AccessException("Client ID not specified"); } } $bots = \Bitrix\Im\Bot::getListCache(); if (isset($arParams['BOT_ID'])) { if (!isset($bots[$arParams['BOT_ID']])) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId) { throw new Bitrix\Rest\RestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } else { $botFound = false; foreach ($bots as $bot) { if ($bot['APP_ID'] == $clientId) { $botFound = true; $arParams['BOT_ID'] = $bot['BOT_ID']; break; } } if (!$botFound) { throw new Bitrix\Rest\RestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST); } } return $arParams['BOT_ID']; } } ?>