Explorar o código

Ticket #4711 - Automations.

AntonLV %!s(int64=2) %!d(string=hai) anos
pai
achega
c75f066955

+ 61 - 0
inc/classes/BxDolAI.php

@@ -11,11 +11,17 @@ define('BX_DOL_AI_AUTOMATOR_EVENT', 'event');
 define('BX_DOL_AI_AUTOMATOR_SCHEDULER', 'scheduler');
 define('BX_DOL_AI_AUTOMATOR_WEBHOOK', 'webhook');
 
+define('BX_DOL_AI_AUTOMATOR_STATUS_AUTO', 'auto');
+define('BX_DOL_AI_AUTOMATOR_STATUS_MANUAL', 'manual');
+define('BX_DOL_AI_AUTOMATOR_STATUS_READY', 'ready');
+
 class BxDolAI extends BxDolFactory implements iBxDolSingleton
 {
     protected $_oDb;
     protected $_sPathInst;
     protected $_iProfileId;
+    
+    protected $_aExcludeAlertUnits;
 
     protected function __construct()
     {
@@ -27,6 +33,10 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         $this->_oDb = new BxDolAIQuery();
         $this->_sPathInst = BX_DIRECTORY_PATH_ROOT . 'ai/instructions/';
         $this->_iProfileId = (int)getParam('sys_profile_bot'); 
+
+        $this->_aExcludeAlertUnits = [
+            'system', 'module_template_method_call'
+        ];
     }
 
     /**
@@ -82,6 +92,28 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
 
         return $aAutomator;
     }
+    
+    public function getAutomatorsEvent($sUnit, $sAction)
+    {
+        if(in_array($sUnit, $this->_aExcludeAlertUnits))
+            return [];
+
+        return $this->_oDb->getAutomatorsBy([
+            'sample' => 'events', 
+            'alert_unit' => $sUnit,
+            'alert_action' => $sAction,
+            'active' => true
+        ]);
+    }
+    public function getAutomatorsScheduler()
+    {
+        $aAutomators = $this->_oDb->getAutomatorsBy(['sample' => 'schedulers', 'active' => true]);
+        foreach($aAutomators as &$aAutomator)
+            if(!empty($aAutomator['params']))
+                $aAutomator['params'] = json_decode($aAutomator['params'], true);
+
+        return $aAutomators;
+    }
 
     public function chat($sEndpoint, $sModel, $sApiKey, $aParams, $aMessages)
     {
@@ -103,4 +135,33 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
 
         return trim(str_replace(['```json', '```php', '```'], '', $aRv['choices'][0]['message']['content']));
     }
+
+    public function callAutomator($sType, $aParams = [])
+    {
+        $sMethod = '_callAutomator' . bx_gen_method_name($sType);
+        if(!method_exists($this, $sMethod))
+            return false;
+
+        return $this->$sMethod($aParams);
+    }
+
+    protected function _callAutomatorEvent($aParams = [])
+    {
+        if(!isset($aParams['automator'], $aParams['alert']) || !is_a($aParams['alert'], 'BxDolAlerts'))
+            return false;
+
+        $oAlert = &$aParams['alert'];
+
+        //TODO: Call the code in appropriate way using data from $oAlert
+        eval($aParams['automator']['code']);
+    }
+
+    protected function _callAutomatorScheduler($aParams = [])
+    {
+        if(!isset($aParams['automator']))
+            return false;
+
+        //TODO: Call the code in appropriate way
+        eval($aParams['automator']['code']);
+    }
 }

+ 30 - 0
inc/classes/BxDolAIQuery.php

@@ -78,6 +78,36 @@ class BxDolAIQuery extends BxDolDb
                 $sJoinClause .= " LEFT JOIN `sys_agents_models` AS `tam` ON `taa`.`model_id`=`tam`.`id`";
                 $sWhereClause .= " AND `taa`.`id`=:id";
                 break;
+            
+            case 'events':
+                $aMethod['params'][1] = [
+                    'type' => BX_DOL_AI_AUTOMATOR_EVENT,
+                    'alert_unit' => $aParams['alert_unit'],
+                    'alert_action' => $aParams['alert_action']
+                ];
+
+                $sWhereClause .= " AND `taa`.`type`=:type AND `taa`.`alert_unit`=:alert_unit AND `taa`.`alert_action`=:alert_action";
+
+                if(isset($aParams['active'])) {
+                    $aMethod['params'][1]['active'] = (int)$aParams['active'];
+
+                    $sWhereClause .= " AND `taa`.`active`=:active";
+                }
+                break;
+                
+            case 'schedulers':
+                $aMethod['params'][1] = [
+                    'type' => BX_DOL_AI_AUTOMATOR_SCHEDULER,
+                ];
+
+                $sWhereClause .= " AND `taa`.`type`=:type";
+
+                if(isset($aParams['active'])) {
+                    $aMethod['params'][1]['active'] = (int)$aParams['active'];
+
+                    $sWhereClause .= " AND `taa`.`active`=:active";
+                }
+                break;
         }
 
         $aMethod['params'][0] = "SELECT " . $sSelectClause . "

+ 10 - 0
inc/classes/BxDolAlerts.php

@@ -143,6 +143,16 @@ class BxDolAlerts extends BxDol
                 $this->_oCacheObject->delData($a['cache_key']);
             }
         }
+
+        // call automators
+        $oAi = BxDolAI::getInstance();
+
+        $aAutomators = $oAi->getAutomatorsEvent($this->sUnit, $this->sAction);
+        foreach($aAutomators as $aAutomator)
+            $oAi->callAutomator(BX_DOL_AI_AUTOMATOR_EVENT, [
+                'automator' => $aAutomator,
+                'alert' => $this
+            ]);
     }
 
     /**

+ 1 - 0
modules/boonex/english/data/langs/system/en.xml

@@ -2140,6 +2140,7 @@
         <string name="_sys_agents_automators_txt_status"><![CDATA[Status]]></string>
         <string name="_sys_agents_automators_btn_add"><![CDATA[Add]]></string>
         <string name="_sys_agents_automators_btn_tune"><![CDATA[Tune]]></string>
+        <string name="_sys_agents_automators_btn_approve"><![CDATA[Approve]]></string>
         <string name="_sys_agents_automators_popup_add"><![CDATA[Add automator]]></string>
         <string name="_sys_agents_automators_popup_edit"><![CDATA[Edit automator]]></string>
         <string name="_sys_agents_automators_field_model_id"><![CDATA[Model]]></string>

+ 1 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -2115,6 +2115,7 @@
         <string name="_sys_agents_automators_txt_status"><![CDATA[Статус]]></string>
         <string name="_sys_agents_automators_btn_add"><![CDATA[Добавить]]></string>
         <string name="_sys_agents_automators_btn_tune"><![CDATA[Настройка]]></string>
+        <string name="_sys_agents_automators_btn_approve"><![CDATA[Одобрить]]></string>
         <string name="_sys_agents_automators_popup_add"><![CDATA[Добавить автоматизатор]]></string>
         <string name="_sys_agents_automators_popup_edit"><![CDATA[Редактировать автоматизатор]]></string>
         <string name="_sys_agents_automators_field_model_id"><![CDATA[Модель]]></string>

+ 11 - 0
periodic/cron.php

@@ -159,4 +159,15 @@ foreach($aJobs as $aRow) {
             runJob($aRow);
 }
 
+// run automators (schedulers)
+bx_import('BxDolAI');
+$oAi = BxDolAI::getInstance();
+
+$aAutomators = $oAi->getAutomatorsScheduler();
+foreach($aAutomators as $aAutomator) {
+    if(checkCronJob($aAutomator['params']['scheduler_time'], $aDate))
+        $oAi->callAutomator(BX_DOL_AI_AUTOMATOR_SCHEDULER, [
+            'automator' => $aAutomator
+        ]);
+}
 /** @} */

+ 30 - 2
studio/classes/BxDolStudioAgentsAutomatorsCmts.php

@@ -10,7 +10,9 @@
 class BxDolStudioAgentsAutomatorsCmts extends BxTemplCmts
 {
     protected $_oQueryAgents;
+    protected $_sUrlPageAgents;
     protected $_iProfileIdAi;
+
     protected $_bAuto;
 
     public function __construct($sSystem, $iId, $iInit = true, $oTemplate = false)
@@ -21,7 +23,9 @@ class BxDolStudioAgentsAutomatorsCmts extends BxTemplCmts
         $this->_bLiveUpdates = false;
 
         $this->_oQueryAgents = new BxDolStudioAgentsQuery();
-        $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId(); 
+        $this->_sUrlPageAgents = BX_DOL_URL_STUDIO . 'agents.php?page=automators';
+        $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId();
+
         $this->_bAuto = false;
     }
 
@@ -50,6 +54,27 @@ class BxDolStudioAgentsAutomatorsCmts extends BxTemplCmts
             'content' => $sContent
         ]);
     }
+    
+    public function actionApproveCode()
+    {
+        if(!$this->isEnabled())
+            return echoJson([]);
+
+        $iCmt = bx_process_input(bx_get('Cmt'), BX_DATA_INT);
+        $aCmt = $this->getCommentRow($iCmt);
+        if(empty($aCmt) || !is_array($aCmt))
+            return echoJson([]);
+
+        if(!$this->_oQueryAgents->updateAutomators(['code' => $aCmt['cmt_text'], 'status' => 'ready'], ['id' => (int)$this->getId()]))
+            return echoJson([]);
+
+        return echoJson(['redirect' => $this->_sUrlPageAgents]);
+    }
+
+    public function getPageJsObject()
+    {
+        return 'oBxDolStudioPageAgents';
+    }
 
     public function getCommentsBlock($aBp = [], $aDp = [])
     {
@@ -175,7 +200,10 @@ class BxDolStudioAgentsAutomatorsCmts extends BxTemplCmts
         if((int)$aCmt['cmt_author_id'] != $this->_iProfileIdAi)
             return parent::_getActionsBox($aCmt, $aBp, array_merge($aDp, ['view_only' => true]));
 
-        return '<a class="bx-btn bx-btn-small" onclick="alert(\'Under construction\')">Approve</a>';
+        return $this->_oTemplate->parseLink('javascript:void(0)', _t('_sys_agents_automators_btn_approve'), [
+            'class' => 'bx-btn bx-btn-small',
+            'onclick' => $this->getPageJsObject() . '.approveCode(this, ' . $aCmt['cmt_id'] . ')',
+        ]);
     }
 
     protected function _getCountersBox(&$aCmt, $aBp = [], $aDp = [])

+ 41 - 7
studio/js/agents_automators.js → studio/js/agents.js

@@ -5,19 +5,28 @@
  * @defgroup    UnaStudio UNA Studio
  * @{
  */
-function BxDolStudioAgentsAutomators(oOptions) {
-    this.sActionsUrl = oOptions.sActionUrl;
+function BxDolStudioPageAgents(oOptions)
+{
+    BxDolStudioPage.call(this, oOptions);
+
     this.sPageUrl = oOptions.sPageUrl;
+    this.sObjName = oOptions.sObjName == undefined ? 'oBxDolStudioPageAgents' : oOptions.sObjName;
+
+    this.sActionUrlCmts = oOptions.sActionUrlCmts == undefined ? this.sActionUrl : oOptions.sActionUrlCmts;
+
+    /*
+     * Note. Are needed for Grid and don't used for now.
+     * 
     this.sObjNameGrid = oOptions.sObjNameGrid;
-    this.sObjName = oOptions.sObjName == undefined ? 'oBxDolStudioAgentsAutomators' : oOptions.sObjName;
-    this.sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
-    this.iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
     this.sParamsDivider = oOptions.sParamsDivider == undefined ? '#-#' : oOptions.sParamsDivider;
-
     this.sTextSearchInput = oOptions.sTextSearchInput == undefined ? '' : oOptions.sTextSearchInput;
+    */
 }
 
-BxDolStudioAgentsAutomators.prototype.onChangeType = function(oSelect) {
+BxDolStudioPageAgents.prototype = Object.create(BxDolStudioPage.prototype);
+BxDolStudioPageAgents.prototype.constructor = BxDolStudioPageAgents;
+
+BxDolStudioPageAgents.prototype.onChangeType = function(oSelect) {
     var aHide = [];
     var aShow = [];
     switch($(oSelect).val()) {
@@ -50,4 +59,29 @@ BxDolStudioAgentsAutomators.prototype.onChangeType = function(oSelect) {
     $(sShow.substring(0, sShow.length - 1)).bx_anim('show', this.sAnimationEffect, 0);
 };
 
+BxDolStudioPageAgents.prototype.approveCode = function(oSource, iCmtId) {
+    var $this = this;
+    var oData = this._getDefaultData();
+    oData = jQuery.extend({}, oData, {action: 'approveCode', Cmt: iCmtId});
+
+    oSource = $(oSource);
+    bx_loading_btn(oSource, true);
+
+    jQuery.post (
+        this.sActionUrlCmts,
+        oData,
+        function(oData) {
+            bx_loading_btn(oSource, false);
+
+            processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxDolStudioPageAgents.prototype._getDefaultData = function() {
+    var oDate = new Date();
+    return jQuery.extend({}, this._oRequestParams, {_t:oDate.getTime()});
+};
+
 /** @} */

+ 0 - 10
studio/template/agents_automator.html

@@ -1,10 +0,0 @@
-__content__
-<script language="javascript">
-    var __js_object__ = new BxDolStudioAgentsAutomators({
-        sActionUrl: '<bx_url_root />grid.php',
-        sPageUrl: '__page_url__',
-        sObjNameGrid: '__grid_object__',
-        sParamsDivider: '__params_divider__',
-        sTextSearchInput: '<bx_text_js:_sys_grid_search />'
-    });
-</script>

+ 0 - 0
studio/template/css/agents_automators.css → studio/template/css/agents.css


+ 25 - 8
studio/template/scripts/BxBaseStudioAgents.php

@@ -11,6 +11,7 @@
 class BxBaseStudioAgents extends BxDolStudioAgents
 {
     protected $sSubpageUrl;
+    protected $aPageJsOptions;
     protected $aMenuItems;
     protected $aGridObjects;
 
@@ -18,10 +19,18 @@ class BxBaseStudioAgents extends BxDolStudioAgents
     {
         parent::__construct($sPage);
 
-        $this->aPageCss = array_merge($this->aPageCss, ['cmts.css', 'agents_automators.css']);
-
         $this->sSubpageUrl = BX_DOL_URL_STUDIO . 'agents.php?page=';
 
+        $this->aPageJs = array_merge($this->aPageJs, ['agents.js']);
+        $this->aPageCss = array_merge($this->aPageCss, ['cmts.css', 'agents.css']);
+
+        $this->sPageJsClass = 'BxDolStudioPageAgents';
+        $this->sPageJsObject = 'oBxDolStudioPageAgents';
+        $this->aPageJsOptions = [
+            'sActionUrl' => BX_DOL_URL_STUDIO . 'agents.php',
+            'sPageUrl' => $this->sSubpageUrl
+        ];
+
         $this->aMenuItems = [
             BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS => ['icon' => 'cogs'],
             BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS => ['icon' => 'cogs'],
@@ -34,11 +43,7 @@ class BxBaseStudioAgents extends BxDolStudioAgents
 
     public function getPageJsCode($aOptions = [], $bWrap = true)
     {
-        $aOptions = array_merge($aOptions, [
-            'sActionUrl' => BX_DOL_URL_STUDIO . 'agents.php'
-        ]);
-
-        return parent::getPageJsCode($aOptions, $bWrap);
+        return parent::getPageJsCode(array_merge($aOptions, $this->aPageJsOptions), $bWrap);
     }
 
     public function getPageMenu($aMenu = [], $aMarkers = [])
@@ -73,9 +78,21 @@ class BxBaseStudioAgents extends BxDolStudioAgents
     protected function getAutomators()
     {
         $oTemplate = BxDolStudioTemplate::getInstance();
+        
+        $this->aPageJsOptions['sPageUrl'] .= 'automators';
 
         if(($iId = bx_get('id')) !== false) {
-            $oCmts = BxDolCmts::getObjectInstance('sys_agents_automators', (int)$iId, true, $oTemplate);
+            $sCmts = 'sys_agents_automators';
+
+            $this->aPageJsOptions = array_merge($this->aPageJsOptions, [
+                'sPageUrl' => $this->sSubpageUrl . 'automators&id=' . $iId,
+                'sActionUrlCmts' => bx_append_url_params(BX_DOL_URL_ROOT . 'cmts.php', [
+                    'sys' => $sCmts,
+                    'id' => $iId
+                ])
+            ]);
+
+            $oCmts = BxDolCmts::getObjectInstance($sCmts, (int)$iId, true, $oTemplate);
             return $oCmts->getCommentsBlock();
         }
 

+ 9 - 12
studio/template/scripts/BxBaseStudioAgentsAutomators.php

@@ -10,7 +10,7 @@
 
 class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
 {
-    protected $_sUrlPage;   
+    protected $_sUrlPage;
 
     public function __construct ($aOptions, $oTemplate = false)
     {
@@ -19,9 +19,9 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
         $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=automators';
     }
 
-    public function getJsObject()
+    public function getPageJsObject()
     {
-        return 'oBxDolStudioAgentsAutomators';
+        return 'oBxDolStudioPageAgents';
     }
 
     public function performActionAdd()
@@ -202,15 +202,12 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
         return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
     }
 
-    public function getCode($isDisplayHeader = true)
+    protected function _getCellSwitcher ($mixedValue, $sKey, $aField, $aRow)
     {
-        return $this->_oTemplate->parseHtmlByName('agents_automator.html', [
-            'content' => parent::getCode($isDisplayHeader),
-            'js_object' => $this->getJsObject(),
-            'page_url' => $this->_sUrlPage,
-            'grid_object' => $this->_sObject,
-            'params_divider' => $this->sParamsDivider
-        ]);
+        if(empty($aRow['code']) || $aRow['status'] != BX_DOL_AI_AUTOMATOR_STATUS_READY)
+            return parent::_getCellDefault('', $sKey, $aField, $aRow);
+
+        return parent::_getCellSwitcher ($mixedValue, $sKey, $aField, $aRow);
     }
 
     protected function _getCellModelId($mixedValue, $sKey, $aField, $aRow)
@@ -349,7 +346,7 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
                         'webhook' => _t('_sys_agents_automators_field_type_webhook'),
                     ],
                     'attrs' => [
-                        'onchange' => $this->getJsObject() . '.onChangeType(this)',
+                        'onchange' => $this->getPageJsObject() . '.onChangeType(this)',
                     ],
                     'required' => '1',
                     'db' => [