PageRenderTime 62ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/im/lib/command.php

https://gitlab.com/alexprowars/bitrix
PHP | 916 lines | 798 code | 110 blank | 8 comment | 220 complexity | 6f845c9a1533b27fece27f104e78d784 MD5 | raw file
  1. <?php
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage im
  6. * @copyright 2001-2016 Bitrix
  7. */
  8. namespace Bitrix\Im;
  9. use Bitrix\Main,
  10. Bitrix\Main\Localization\Loc,
  11. Bitrix\Main\DB\Exception;
  12. Loc::loadMessages(__FILE__);
  13. class Command
  14. {
  15. const CACHE_TTL = 31536000;
  16. const CACHE_PATH = '/bx/im/command/';
  17. public static function register(array $fields)
  18. {
  19. $moduleId = $fields['MODULE_ID'];
  20. $command = mb_substr($fields['COMMAND'], 0, 1) == '/'? mb_substr($fields['COMMAND'], 1) : $fields['COMMAND'];
  21. $botId = isset($fields['BOT_ID'])? intval($fields['BOT_ID']): 0;
  22. if ($botId > 0 && (!\Bitrix\Im\User::getInstance($botId)->isExists() || !\Bitrix\Im\User::getInstance($botId)->isBot()))
  23. {
  24. $botId = 0;
  25. }
  26. $common = isset($fields['COMMON']) && $fields['COMMON'] == 'Y'? 'Y': 'N';
  27. if ($botId <= 0)
  28. {
  29. $common = 'Y';
  30. }
  31. $hidden = isset($fields['HIDDEN']) && $fields['HIDDEN'] == 'Y'? 'Y': 'N';
  32. $sonetSupport = isset($fields['SONET_SUPPORT']) && $fields['SONET_SUPPORT'] == 'Y'? 'Y': 'N';
  33. $extranetSupport = isset($fields['EXTRANET_SUPPORT']) && $fields['EXTRANET_SUPPORT'] == 'Y'? 'Y': 'N';
  34. /* vars for module install */
  35. $class = isset($fields['CLASS'])? $fields['CLASS']: '';
  36. $methodCommandAdd = isset($fields['METHOD_COMMAND_ADD'])? $fields['METHOD_COMMAND_ADD']: '';
  37. $methodLangGet = isset($fields['METHOD_LANG_GET'])? $fields['METHOD_LANG_GET']: '';
  38. /* vars for rest install */
  39. $appId = isset($fields['APP_ID'])? $fields['APP_ID']: '';
  40. $langSet = isset($fields['LANG'])? $fields['LANG']: Array();
  41. if ($moduleId == '')
  42. {
  43. return false;
  44. }
  45. if ($moduleId == 'rest')
  46. {
  47. if (empty($appId) || empty($langSet) && $hidden == 'N')
  48. {
  49. return false;
  50. }
  51. }
  52. else
  53. {
  54. if (empty($class) || empty($methodCommandAdd))
  55. {
  56. return false;
  57. }
  58. if (empty($methodLangGet))
  59. {
  60. $hidden = 'Y';
  61. }
  62. }
  63. $commands = self::getListCache();
  64. foreach ($commands as $cmd)
  65. {
  66. if ($botId)
  67. {
  68. if ($botId == $cmd['BOT_ID'] && $command == $cmd['COMMAND'])
  69. {
  70. return $cmd['ID'];
  71. }
  72. }
  73. else if ($appId)
  74. {
  75. if ($appId == $cmd['APP_ID'] && $command == $cmd['COMMAND'])
  76. {
  77. return $cmd['ID'];
  78. }
  79. }
  80. else if ($moduleId == $cmd['MODULE_ID'] && $command == $cmd['COMMAND'])
  81. {
  82. return $cmd['ID'];
  83. }
  84. }
  85. $result = \Bitrix\Im\Model\CommandTable::add(Array(
  86. 'BOT_ID' => $botId,
  87. 'MODULE_ID' => $moduleId,
  88. 'COMMAND' => $command,
  89. 'COMMON' => $common,
  90. 'HIDDEN' => $hidden,
  91. 'SONET_SUPPORT' => $sonetSupport,
  92. 'EXTRANET_SUPPORT' => $extranetSupport,
  93. 'CLASS' => $class,
  94. 'METHOD_COMMAND_ADD' => $methodCommandAdd,
  95. 'METHOD_LANG_GET' => $methodLangGet,
  96. 'APP_ID' => $appId
  97. ));
  98. if (!$result->isSuccess())
  99. return false;
  100. $cache = \Bitrix\Main\Data\Cache::createInstance();
  101. $cache->cleanDir(self::CACHE_PATH);
  102. $commandId = $result->getId();
  103. if ($moduleId == 'rest')
  104. {
  105. foreach ($langSet as $lang)
  106. {
  107. if (!isset($lang['LANGUAGE_ID']) || empty($lang['LANGUAGE_ID']))
  108. continue;
  109. if (!isset($lang['TITLE']) && empty($lang['TITLE']))
  110. continue;
  111. try
  112. {
  113. \Bitrix\Im\Model\CommandLangTable::add(array(
  114. 'COMMAND_ID' => $commandId,
  115. 'LANGUAGE_ID' => mb_strtolower($lang['LANGUAGE_ID']),
  116. 'TITLE' => $lang['TITLE'],
  117. 'PARAMS' => isset($lang['PARAMS'])? $lang['PARAMS']: ''
  118. ));
  119. }
  120. catch(Exception $e)
  121. {
  122. }
  123. }
  124. }
  125. return $commandId;
  126. }
  127. public static function unRegister(array $command)
  128. {
  129. $commandId = intval($command['COMMAND_ID']);
  130. $moduleId = isset($command['MODULE_ID'])? $command['MODULE_ID']: '';
  131. $appId = isset($command['APP_ID'])? $command['APP_ID']: '';
  132. if (intval($commandId) <= 0)
  133. return false;
  134. if (!isset($command['FORCE']) || $command['FORCE'] == 'N')
  135. {
  136. $commands = self::getListCache();
  137. if (!isset($commands[$commandId]))
  138. return false;
  139. if ($moduleId <> '' && $commands[$commandId]['MODULE_ID'] != $moduleId)
  140. return false;
  141. if ($appId <> '' && $commands[$commandId]['APP_ID'] != $appId)
  142. return false;
  143. }
  144. \Bitrix\Im\Model\CommandTable::delete($commandId);
  145. $orm = \Bitrix\Im\Model\CommandLangTable::getList(Array(
  146. 'filter' => Array('=COMMAND_ID' => $commandId)
  147. ));
  148. while ($row = $orm->fetch())
  149. {
  150. \Bitrix\Im\Model\CommandLangTable::delete($row['ID']);
  151. }
  152. $cache = \Bitrix\Main\Data\Cache::createInstance();
  153. $cache->cleanDir(self::CACHE_PATH);
  154. if (\Bitrix\Main\Loader::includeModule('pull'))
  155. {
  156. \CPullStack::AddShared(Array(
  157. 'module_id' => 'im',
  158. 'command' => 'commandDelete',
  159. 'params' => Array(
  160. 'commandId' => $commandId
  161. ),
  162. 'extra' => \Bitrix\Im\Common::getPullExtra()
  163. ));
  164. }
  165. return true;
  166. }
  167. public static function update(array $command, array $updateFields)
  168. {
  169. $commandId = $command['COMMAND_ID'];
  170. $moduleId = isset($command['MODULE_ID'])? $command['MODULE_ID']: '';
  171. $appId = isset($command['APP_ID'])? $command['APP_ID']: '';
  172. if (intval($commandId) <= 0)
  173. return false;
  174. $commands = self::getListCache();
  175. if (!isset($commands[$commandId]))
  176. return false;
  177. if ($moduleId <> '' && $commands[$commandId]['MODULE_ID'] != $moduleId)
  178. return false;
  179. if ($appId <> '' && $commands[$commandId]['APP_ID'] != $appId)
  180. return false;
  181. if (isset($updateFields['LANG']) && $commands[$commandId]['MODULE_ID'] == 'rest')
  182. {
  183. $orm = \Bitrix\Im\Model\CommandLangTable::getList(Array(
  184. 'filter' => Array('=COMMAND_ID' => $commandId)
  185. ));
  186. while ($row = $orm->fetch())
  187. {
  188. \Bitrix\Im\Model\CommandLangTable::delete($row['ID']);
  189. }
  190. foreach ($updateFields['LANG'] as $lang)
  191. {
  192. if (!isset($lang['LANGUAGE_ID']) || empty($lang['LANGUAGE_ID']))
  193. continue;
  194. if (!isset($lang['TITLE']) && empty($lang['TITLE']))
  195. continue;
  196. try
  197. {
  198. \Bitrix\Im\Model\CommandLangTable::add(array(
  199. 'COMMAND_ID' => $commandId,
  200. 'LANGUAGE_ID' => mb_strtolower($lang['LANGUAGE_ID']),
  201. 'TITLE' => $lang['TITLE'],
  202. 'PARAMS' => isset($lang['PARAMS'])? $lang['PARAMS']: ''
  203. ));
  204. }
  205. catch(Exception $e)
  206. {
  207. }
  208. }
  209. }
  210. $update = Array();
  211. if (isset($updateFields['CLASS']) && !empty($updateFields['CLASS']))
  212. {
  213. $update['CLASS'] = $updateFields['CLASS'];
  214. }
  215. if (isset($updateFields['METHOD_COMMAND_ADD']))
  216. {
  217. $update['METHOD_COMMAND_ADD'] = $updateFields['METHOD_COMMAND_ADD'];
  218. }
  219. if (isset($updateFields['METHOD_LANG_GET']))
  220. {
  221. $update['METHOD_LANG_GET'] = $updateFields['METHOD_LANG_GET'];
  222. }
  223. if (isset($updateFields['COMMON']))
  224. {
  225. if ($commands[$commandId]['BOT_ID'] <= 0)
  226. {
  227. $update['COMMON'] = 'Y';
  228. }
  229. else
  230. {
  231. $update['COMMON'] = $updateFields['COMMON'] == 'Y'? 'Y': 'N';
  232. }
  233. }
  234. if (isset($updateFields['HIDDEN']))
  235. {
  236. $update['HIDDEN'] = $updateFields['HIDDEN'] == 'Y'? 'Y': 'N';
  237. }
  238. if (isset($updateFields['EXTRANET_SUPPORT']))
  239. {
  240. $update['EXTRANET_SUPPORT'] = $updateFields['EXTRANET_SUPPORT'] == 'Y'? 'Y': 'N';
  241. }
  242. if (isset($updateFields['SONET_SUPPORT']))
  243. {
  244. $update['SONET_SUPPORT'] = $updateFields['SONET_SUPPORT'] == 'Y'? 'Y': 'N';
  245. }
  246. if (!empty($update))
  247. {
  248. \Bitrix\Im\Model\CommandTable::update($commandId, $update);
  249. $cache = \Bitrix\Main\Data\Cache::createInstance();
  250. $cache->cleanDir(self::CACHE_PATH);
  251. }
  252. return true;
  253. }
  254. public static function onCommandAdd($messageId, $messageFields)
  255. {
  256. if ($messageFields['SKIP_COMMAND'] == 'Y' || $messageFields['SYSTEM'] == 'Y')
  257. {
  258. return true;
  259. }
  260. $commands = self::getListCache();
  261. if (empty($commands))
  262. {
  263. return false;
  264. }
  265. $commandList = Array();
  266. if (preg_match_all("/^\\/(?P<COMMAND>[^\\040\\n]*)(\\040?)(?P<PARAMS>.*)$/m", $messageFields['MESSAGE'], $matches))
  267. {
  268. foreach($matches['COMMAND'] as $idx => $cmd)
  269. {
  270. $commandData = self::findCommands(Array('COMMAND' => $cmd, 'EXEC_PARAMS' => $matches['PARAMS'][$idx], 'MESSAGE_FIELDS' => $messageFields));
  271. if (!$commandData)
  272. {
  273. continue;
  274. }
  275. $commandList = array_merge($commandList, $commandData);
  276. }
  277. }
  278. if (empty($commandList))
  279. {
  280. return false;
  281. }
  282. $messageFields['DIALOG_ID'] = self::getDialogId($messageFields);
  283. unset(
  284. $messageFields['MESSAGE_OUT'],
  285. $messageFields['NOTIFY_EVENT'],
  286. $messageFields['NOTIFY_MODULE'],
  287. $messageFields['URL_PREVIEW']
  288. );
  289. $count = 0;
  290. $executed = Array();
  291. foreach ($commandList as $params)
  292. {
  293. if (!$params['MODULE_ID'] || !\Bitrix\Main\Loader::includeModule($params['MODULE_ID']))
  294. {
  295. continue;
  296. }
  297. $hash = md5($params['EXEC_PARAMS'].$params['COMMAND_ID']);
  298. if ($executed[$hash])
  299. {
  300. continue;
  301. }
  302. $executed[$hash] = true;
  303. if ($count >= 10)
  304. {
  305. break;
  306. }
  307. $count++;
  308. if ($params['BOT_ID'] > 0)
  309. {
  310. Bot\Token::add($params['BOT_ID'], $messageFields['DIALOG_ID']);
  311. if ($messageFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
  312. {
  313. Bot\Token::add($params['BOT_ID'], $messageFields['TO_USER_ID']);
  314. }
  315. }
  316. $messageFields['COMMAND'] = $params['COMMAND'];
  317. $messageFields['COMMAND_ID'] = $params['COMMAND_ID'];
  318. $messageFields['COMMAND_PARAMS'] = $params['EXEC_PARAMS'];
  319. if ($params["METHOD_COMMAND_ADD"] && class_exists($params["CLASS"]) && method_exists($params["CLASS"], $params["METHOD_COMMAND_ADD"]))
  320. {
  321. if ($params['BOT_ID'] > 0)
  322. {
  323. \Bitrix\Im\Model\BotTable::update($params['BOT_ID'], array(
  324. "COUNT_COMMAND" => new \Bitrix\Main\DB\SqlExpression("?# + 1", "COUNT_COMMAND")
  325. ));
  326. }
  327. call_user_func_array(array($params["CLASS"], $params["METHOD_COMMAND_ADD"]), Array($messageId, $messageFields));
  328. }
  329. }
  330. unset(
  331. $messageFields['COMMAND'],
  332. $messageFields['COMMAND_ID'],
  333. $messageFields['COMMAND_PARAMS'],
  334. $messageFields['COMMAND_CONTEXT']
  335. );
  336. foreach(\Bitrix\Main\EventManager::getInstance()->findEventHandlers("im", "onImCommandAdd") as $event)
  337. {
  338. ExecuteModuleEventEx($event, Array($commandList, $messageId, $messageFields));
  339. }
  340. return true;
  341. }
  342. public static function addMessage(array $access, array $messageFields)
  343. {
  344. $messageId = intval($access['MESSAGE_ID']);
  345. $commandId = intval($access['COMMAND_ID']);
  346. $moduleId = isset($access['MODULE_ID'])? $access['MODULE_ID']: '';
  347. $appId = isset($access['APP_ID'])? $access['APP_ID']: '';
  348. if ($messageId <= 0 || $commandId <= 0)
  349. return false;
  350. $commands = self::getListCache();
  351. if (!isset($commands[$commandId]))
  352. return false;
  353. if ($moduleId <> '' && $commands[$commandId]['MODULE_ID'] != $moduleId)
  354. return false;
  355. if ($appId <> '' && $commands[$commandId]['APP_ID'] != $appId)
  356. return false;
  357. $botId = intval($commands[$commandId]['BOT_ID']);
  358. $orm = \Bitrix\Im\Model\MessageTable::getById($messageId);
  359. if (!($message = $orm->fetch()))
  360. return false;
  361. $orm = \Bitrix\Im\Model\ChatTable::getById($message['CHAT_ID']);
  362. if (!($chat = $orm->fetch()))
  363. return false;
  364. $relations = \CIMChat::GetRelationById($message['CHAT_ID']);
  365. $chatWithBot = false;
  366. foreach ($relations as $userId => $relation)
  367. {
  368. if ($relation['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
  369. {
  370. $messageFields['DIALOG_ID'] = 'chat'.$message['CHAT_ID'];
  371. break;
  372. }
  373. if ($message['AUTHOR_ID'] == $botId)
  374. {
  375. $chatWithBot = true;
  376. if ($botId != $relation['USER_ID'])
  377. {
  378. $messageFields['DIALOG_ID'] = $relation['USER_ID'];
  379. break;
  380. }
  381. }
  382. else if ($message['AUTHOR_ID'] != $relation['USER_ID'])
  383. {
  384. $messageFields['DIALOG_ID'] = $relation['USER_ID'];
  385. break;
  386. }
  387. }
  388. if ($botId > 0)
  389. {
  390. $grantAccess = false;
  391. if (Bot\Token::isActive($botId, $messageFields['DIALOG_ID']))
  392. {
  393. $grantAccess = true;
  394. }
  395. }
  396. else
  397. {
  398. $grantAccess = false;
  399. if (preg_match_all("/^\\/(?P<COMMAND>[^\\040\\n]*)(\\040?)(?P<PARAMS>.*)$/m", $message['MESSAGE'], $matches))
  400. {
  401. foreach($matches['COMMAND'] as $idx => $cmd)
  402. {
  403. if ($commands[$commandId]['COMMAND'] == $cmd)
  404. {
  405. $grantAccess = true;
  406. break;
  407. }
  408. }
  409. }
  410. }
  411. if (!$grantAccess)
  412. return true;
  413. $messageFields['ATTACH'] = $messageFields['ATTACH']? $messageFields['ATTACH']: null;
  414. $messageFields['KEYBOARD'] = $messageFields['KEYBOARD']? $messageFields['KEYBOARD']: null;
  415. $messageFields['MENU'] = $messageFields['MENU']? $messageFields['MENU']: null;
  416. if (Common::isChatId($messageFields['DIALOG_ID']))
  417. {
  418. $chatId = \Bitrix\Im\Dialog::getChatId($messageFields['DIALOG_ID']);
  419. if ($chatId <= 0)
  420. return false;
  421. if (isset($relations[$botId]) && $messageFields['SYSTEM'] != 'Y')
  422. {
  423. $ar = Array(
  424. "FROM_USER_ID" => $botId,
  425. "TO_CHAT_ID" => $chatId,
  426. "ATTACH" => $messageFields['ATTACH'],
  427. "KEYBOARD" => $messageFields['KEYBOARD'],
  428. "MENU" => $messageFields['MENU'],
  429. );
  430. if (isset($messageFields['MESSAGE']))
  431. {
  432. $ar['MESSAGE'] = $messageFields['MESSAGE'];
  433. }
  434. }
  435. else
  436. {
  437. $ar = Array(
  438. "FROM_USER_ID" => $botId,
  439. "TO_CHAT_ID" => $chatId,
  440. "ATTACH" => $messageFields['ATTACH'],
  441. "KEYBOARD" => $messageFields['KEYBOARD'],
  442. "MENU" => $messageFields['MENU'],
  443. "SYSTEM" => 'Y',
  444. );
  445. if (isset($messageFields['MESSAGE']))
  446. {
  447. $ar['MESSAGE'] = $messageFields['MESSAGE'];
  448. }
  449. if ($botId > 0)
  450. {
  451. $ar['MESSAGE'] = Loc::getMessage("COMMAND_BOT_ANSWER", Array("#BOT_NAME#" => "[USER=".$botId."][/USER]\n ")).$ar['MESSAGE'];
  452. }
  453. else
  454. {
  455. $ar['MESSAGE'] = "[B]".Loc::getMessage("COMMAND_SYSTEM_ANSWER", Array("#COMMAND#" => "/".$commands[$commandId]['COMMAND']))."[/B]\n ".$ar['MESSAGE'];
  456. }
  457. }
  458. if (isset($messageFields['URL_PREVIEW']) && $messageFields['URL_PREVIEW'] == 'N')
  459. {
  460. $ar['URL_PREVIEW'] = 'N';
  461. }
  462. $ar['SKIP_USER_CHECK'] = 'Y';
  463. $ar['SKIP_COMMAND'] = 'Y';
  464. $id = \CIMChat::AddMessage($ar);
  465. }
  466. else
  467. {
  468. if ($chatWithBot)
  469. {
  470. $message['AUTHOR_ID'] = intval($messageFields['DIALOG_ID']);
  471. $userId = $botId;
  472. }
  473. else
  474. {
  475. $userId = intval($messageFields['DIALOG_ID']);
  476. }
  477. \CModule::IncludeModule('imbot');
  478. if ($botId == $userId && $messageFields['SYSTEM'] != 'Y')
  479. {
  480. $ar = Array(
  481. "FROM_USER_ID" => $userId,
  482. "TO_USER_ID" => $message['AUTHOR_ID'],
  483. "ATTACH" => $messageFields['ATTACH'],
  484. "KEYBOARD" => $messageFields['KEYBOARD'],
  485. );
  486. if (isset($messageFields['MESSAGE']))
  487. {
  488. $ar['MESSAGE'] = $messageFields['MESSAGE'];
  489. }
  490. }
  491. else
  492. {
  493. $ar = Array(
  494. "FROM_USER_ID" => $message['AUTHOR_ID'],
  495. "TO_USER_ID" => $userId,
  496. "ATTACH" => $messageFields['ATTACH'],
  497. "KEYBOARD" => $messageFields['KEYBOARD'],
  498. "SYSTEM" => "Y",
  499. );
  500. if (isset($messageFields['MESSAGE']))
  501. {
  502. $ar['MESSAGE'] = $messageFields['MESSAGE'];
  503. }
  504. if ($botId > 0)
  505. {
  506. $ar['MESSAGE'] = Loc::getMessage("COMMAND_BOT_ANSWER", Array("#BOT_NAME#" => "[USER=".$botId."][/USER]\n ")).$ar['MESSAGE'];
  507. }
  508. else
  509. {
  510. $ar['MESSAGE'] = "[B]".Loc::getMessage("COMMAND_SYSTEM_ANSWER", Array("#COMMAND#" => "/".$commands[$commandId]['COMMAND']))."[/B]\n ".$ar['MESSAGE'];
  511. }
  512. }
  513. if (isset($messageFields['URL_PREVIEW']) && $messageFields['URL_PREVIEW'] == 'N')
  514. {
  515. $ar['URL_PREVIEW'] = 'N';
  516. }
  517. $ar['SKIP_COMMAND'] = 'Y';
  518. $id = \CIMMessage::Add($ar);
  519. }
  520. return $id;
  521. }
  522. public static function getDialogId($messageFields)
  523. {
  524. if ($messageFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
  525. {
  526. $dialogId = $messageFields['FROM_USER_ID'];
  527. }
  528. else
  529. {
  530. $dialogId = 'chat'.$messageFields['TO_CHAT_ID'];
  531. }
  532. return $dialogId;
  533. }
  534. private static function findCommands($fields)
  535. {
  536. $command = mb_substr($fields['COMMAND'], 0, 1) == '/'? mb_substr($fields['COMMAND'], 1) : $fields['COMMAND'];
  537. $execParams = isset($fields['EXEC_PARAMS'])? $fields['EXEC_PARAMS']: '';
  538. $messageFields = isset($fields['MESSAGE_FIELDS'])? $fields['MESSAGE_FIELDS']: Array();
  539. if ($messageFields['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
  540. {
  541. $relations = \CIMChat::GetRelationById($messageFields['TO_CHAT_ID']);
  542. }
  543. $result = Array();
  544. if ($command == '')
  545. return $result;
  546. $isExtranet = \Bitrix\Im\User::getInstance($messageFields['FROM_USER_ID'])->isExtranet();
  547. $commands = self::getListCache();
  548. $bots = Bot::getListCache();
  549. foreach ($commands as $value)
  550. {
  551. if ($messageFields['CHAT_ENTITY_TYPE'] == 'LIVECHAT' || $messageFields['CHAT_ENTITY_TYPE'] == 'LINES' && $bots[$value['BOT_ID']]['OPENLINE'] != 'Y')
  552. {
  553. continue;
  554. }
  555. if ($value['COMMAND'] == $command)
  556. {
  557. if ($value['EXTRANET_SUPPORT'] == 'N' && $isExtranet)
  558. {
  559. continue;
  560. }
  561. if ($value['COMMON'] == 'N')
  562. {
  563. if ($messageFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
  564. {
  565. if ($messageFields['TO_USER_ID'] != $value['BOT_ID'])
  566. {
  567. continue;
  568. }
  569. }
  570. else
  571. {
  572. if (!isset($relations[$value['BOT_ID']]))
  573. {
  574. continue;
  575. }
  576. }
  577. }
  578. $result[$value['COMMAND_ID']] = $value;
  579. $result[$value['COMMAND_ID']]['CONTEXT'] = $messageFields['COMMAND_CONTEXT'];
  580. $result[$value['COMMAND_ID']]['EXEC_PARAMS'] = $execParams;
  581. }
  582. }
  583. return $result;
  584. }
  585. private static function mergeWithDefaultCommands($commands)
  586. {
  587. $defaultCommands = Array(
  588. Array('COMMAND' => 'me', 'TITLE' => Loc::getMessage("COMMAND_DEF_ME_TITLE"), 'PARAMS' => Loc::getMessage("COMMAND_DEF_ME_PARAMS"), 'HIDDEN' => 'N', 'EXTRANET_SUPPORT' => 'Y'),
  589. Array('COMMAND' => 'loud', 'TITLE' => Loc::getMessage("COMMAND_DEF_LOUD_TITLE"), 'PARAMS' => Loc::getMessage("COMMAND_DEF_LOUD_PARAMS"), 'HIDDEN' => 'N', 'EXTRANET_SUPPORT' => 'Y'),
  590. Array('COMMAND' => '>>', 'TITLE' => Loc::getMessage("COMMAND_DEF_QUOTE_TITLE"), 'PARAMS' => Loc::getMessage("COMMAND_DEF_QUOTE_PARAMS"), 'HIDDEN' => 'N', 'EXTRANET_SUPPORT' => 'Y'),
  591. Array('COMMAND' => 'rename', 'TITLE' => Loc::getMessage("COMMAND_DEF_RENAME_TITLE"), 'PARAMS' => Loc::getMessage("COMMAND_DEF_RENAME_PARAMS"), 'HIDDEN' => 'N', 'EXTRANET_SUPPORT' => 'Y', 'CATEGORY' => Loc::getMessage("COMMAND_DEF_CATEGORY_CHAT"), 'CONTEXT' => 'chat'),
  592. Array('COMMAND' => 'getDialogId', 'TITLE' => Loc::getMessage("COMMAND_DEF_DIALOGID_TITLE"), 'HIDDEN' => 'N', 'EXTRANET_SUPPORT' => 'N', 'CATEGORY' => Loc::getMessage("COMMAND_DEF_CATEGORY_CHAT")),
  593. Array('COMMAND' => 'webrtcDebug', 'TITLE' => Loc::getMessage("COMMAND_DEF_WD_TITLE"), 'HIDDEN' => 'N', 'EXTRANET_SUPPORT' => 'Y', 'CATEGORY' => Loc::getMessage("COMMAND_DEF_CATEGORY_DEBUG"), 'CONTEXT' => 'call'),
  594. );
  595. $imCommands = Array();
  596. foreach ($defaultCommands as $i => $command)
  597. {
  598. $newCommand['ID'] = 'def'.$i;
  599. $newCommand['BOT_ID'] = 0;
  600. $newCommand['APP_ID'] = '';
  601. $newCommand['COMMAND'] = $command['COMMAND'];
  602. $newCommand['HIDDEN'] = isset($command['HIDDEN'])? $command['HIDDEN']: 'N';
  603. $newCommand['COMMON'] = 'Y';
  604. $newCommand['EXTRANET_SUPPORT'] = isset($command['EXTRANET_SUPPORT'])? $command['EXTRANET_SUPPORT']: 'N';
  605. $newCommand['SONET_SUPPORT'] = isset($command['SONET_SUPPORT'])? $command['SONET_SUPPORT']: 'N';
  606. $newCommand['CLASS'] = '';
  607. $newCommand['METHOD_COMMAND_ADD'] = '';
  608. $newCommand['METHOD_LANG_GET'] = '';
  609. if (!$command['TITLE'])
  610. {
  611. $newCommand['HIDDEN'] = 'Y';
  612. }
  613. $newCommand['MODULE_ID'] = 'im';
  614. $newCommand['COMMAND_ID'] = $newCommand['ID'];
  615. $newCommand['CATEGORY'] = isset($command['CATEGORY'])? $command['CATEGORY']: Loc::getMessage('COMMAND_IM_CATEGORY');
  616. $newCommand['CONTEXT'] = isset($command['CONTEXT'])? $command['CONTEXT']: '';
  617. $newCommand['TITLE'] = isset($command['TITLE'])? $command['TITLE']: '';
  618. $newCommand['PARAMS'] = isset($command['PARAMS'])? $command['PARAMS']: '';
  619. $imCommands[$newCommand['COMMAND_ID']] = $newCommand;
  620. }
  621. $result = $imCommands;
  622. if (is_array($commands))
  623. {
  624. foreach ($commands as $i => $v)
  625. {
  626. $result[$i] = $v;
  627. }
  628. }
  629. return $result;
  630. }
  631. public static function getListCache($lang = LANGUAGE_ID)
  632. {
  633. $cache = \Bitrix\Main\Data\Cache::createInstance();
  634. if($cache->initCache(self::CACHE_TTL, 'list_v5_'.$lang, self::CACHE_PATH))
  635. {
  636. $result = $cache->getVars();
  637. }
  638. else
  639. {
  640. $loadRestLang = false;
  641. $result = Array();
  642. $orm = \Bitrix\Im\Model\CommandTable::getList();
  643. while ($row = $orm->fetch())
  644. {
  645. $row['COMMAND_ID'] = $row['ID'];
  646. $row['CONTEXT'] = '';
  647. if ($row['BOT_ID'] > 0)
  648. {
  649. $row['CATEGORY'] = \Bitrix\Im\User::getInstance($row['BOT_ID'])->getFullName();
  650. }
  651. else if ($row['MODULE_ID'] == 'im')
  652. {
  653. $row['CATEGORY'] = Loc::getMessage('COMMAND_IM_CATEGORY');
  654. }
  655. else
  656. {
  657. $moduleClass = new \CModule();
  658. $module = $moduleClass->createModuleObject($row['MODULE_ID']);
  659. $row['CATEGORY'] = $module->MODULE_NAME;
  660. }
  661. if (!empty($row['CLASS']) && !empty($row['METHOD_LANG_GET']))
  662. {
  663. if (\Bitrix\Main\Loader::includeModule($row['MODULE_ID']) && class_exists($row["CLASS"]) && method_exists($row["CLASS"], $row["METHOD_LANG_GET"]))
  664. {
  665. $localize = call_user_func_array(array($row["CLASS"], $row["METHOD_LANG_GET"]), Array($row['COMMAND'], $lang));
  666. if ($localize)
  667. {
  668. $row['TITLE'] = $localize['TITLE'];
  669. $row['PARAMS'] = $localize['PARAMS'];
  670. }
  671. else
  672. {
  673. $row['HIDDEN'] = 'Y';
  674. $row['METHOD_LANG_GET'] = '';
  675. }
  676. }
  677. else
  678. {
  679. $row['HIDDEN'] = 'Y';
  680. $row['METHOD_LANG_GET'] = '';
  681. }
  682. }
  683. else
  684. {
  685. $row['TITLE'] = '';
  686. $row['PARAMS'] = '';
  687. if ($row['MODULE_ID'] == 'rest')
  688. {
  689. $loadRestLang = true;
  690. if ($row['BOT_ID'] <= 0 && $row['APP_ID'])
  691. {
  692. $res = \CBitrix24App::getList(array(), array('APP_ID' => $row['APP_ID']));
  693. if ($app = $res->fetch())
  694. {
  695. $row['CATEGORY'] = isset($app['APP_NAME'])? $app['APP_NAME']: $app['CODE'];
  696. }
  697. }
  698. }
  699. }
  700. $result[$row['COMMAND_ID']] = $row;
  701. }
  702. if ($loadRestLang)
  703. {
  704. $langSet = Array();
  705. $orm = \Bitrix\Im\Model\CommandLangTable::getList();
  706. while ($row = $orm->fetch())
  707. {
  708. if (!isset($result[$row['COMMAND_ID']]))
  709. continue;
  710. $langSet[$row['COMMAND_ID']][$row['LANGUAGE_ID']]['TITLE'] = $row['TITLE'];
  711. $langSet[$row['COMMAND_ID']][$row['LANGUAGE_ID']]['PARAMS'] = $row['PARAMS'];
  712. }
  713. $langAlter = \Bitrix\Im\Bot::getDefaultLanguage();
  714. foreach ($result as $commandId => $commandData)
  715. {
  716. if (isset($langSet[$commandId][$lang]))
  717. {
  718. $result[$commandId]['TITLE'] = $langSet[$commandId][$lang]['TITLE'];
  719. $result[$commandId]['PARAMS'] = $langSet[$commandId][$lang]['PARAMS'];
  720. }
  721. else if (isset($langSet[$commandId][$langAlter]))
  722. {
  723. $result[$commandId]['TITLE'] = $langSet[$commandId][$langAlter]['TITLE'];
  724. $result[$commandId]['PARAMS'] = $langSet[$commandId][$langAlter]['PARAMS'];
  725. }
  726. else if (isset($langSet[$commandId]))
  727. {
  728. $langSetCommand = array_values($langSet[$commandId]);
  729. $result[$commandId]['TITLE'] = $langSetCommand[0]['TITLE'];
  730. $result[$commandId]['PARAMS'] = $langSetCommand[0]['PARAMS'];
  731. }
  732. }
  733. foreach ($result as $key => $value)
  734. {
  735. if (empty($value['TITLE']))
  736. {
  737. $result[$key]['HIDDEN'] = 'Y';
  738. $row['METHOD_LANG_GET'] = '';
  739. }
  740. }
  741. }
  742. if (!empty($result))
  743. {
  744. \Bitrix\Main\Type\Collection::sortByColumn(
  745. $result,
  746. Array('MODULE_ID' => SORT_ASC),
  747. '',
  748. null,
  749. true
  750. );
  751. }
  752. $result = self::mergeWithDefaultCommands($result);
  753. $cache->startDataCache();
  754. $cache->endDataCache($result);
  755. }
  756. return $result;
  757. }
  758. public static function getListForJs($lang = LANGUAGE_ID)
  759. {
  760. $commands = self::getListCache($lang);
  761. $result = Array();
  762. foreach ($commands as $command)
  763. {
  764. if ($command['HIDDEN'] == 'Y')
  765. continue;
  766. $result[] = Array(
  767. 'id' => $command['COMMAND_ID'],
  768. 'bot_id' => $command['BOT_ID'],
  769. 'command' => '/'.$command['COMMAND'],
  770. 'category' => $command['CATEGORY'],
  771. 'common' => $command['COMMON'] == 'Y',
  772. 'context' => $command['CONTEXT'],
  773. 'title' => $command['TITLE'],
  774. 'params' => $command['PARAMS'],
  775. 'extranet' => $command['EXTRANET_SUPPORT'] == 'Y',
  776. );
  777. }
  778. return $result;
  779. }
  780. public static function getListSonetForJs($lang = LANGUAGE_ID)
  781. {
  782. $commands = self::getListCache($lang);
  783. $result = Array();
  784. foreach ($commands as $command)
  785. {
  786. if ($command['HIDDEN'] == 'Y')
  787. continue;
  788. if ($command['SONET_SUPPORT'] != 'Y')
  789. continue;
  790. $result[] = Array(
  791. 'id' => $command['COMMAND_ID'],
  792. 'command' => '/'.$command['COMMAND'],
  793. 'title' => $command['TITLE'],
  794. 'params' => $command['PARAMS'],
  795. 'extranet' => $command['EXTRANET_SUPPORT'] == 'Y',
  796. );
  797. }
  798. return $result;
  799. }
  800. public static function clearCache()
  801. {
  802. $cache = \Bitrix\Main\Data\Cache::createInstance();
  803. $cache->cleanDir(self::CACHE_PATH);
  804. return true;
  805. }
  806. }