Skip to content

Commit

Permalink
Ticket unacms#4711 - Automations.
Browse files Browse the repository at this point in the history
  • Loading branch information
AntonLV committed May 16, 2024
1 parent b1b4ff0 commit c75f066
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 39 deletions.
61 changes: 61 additions & 0 deletions inc/classes/BxDolAI.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,17 @@
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()
{
Expand All @@ -27,6 +33,10 @@ protected function __construct()
$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'
];
}

/**
Expand Down Expand Up @@ -82,6 +92,28 @@ public function getAutomator($iId, $bFullInfo = false)

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)
{
Expand All @@ -103,4 +135,33 @@ public function chat($sEndpoint, $sModel, $sApiKey, $aParams, $aMessages)

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 changes: 30 additions & 0 deletions inc/classes/BxDolAIQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,36 @@ public function getAutomatorsBy($aParams = [])
$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 . "
Expand Down
10 changes: 10 additions & 0 deletions inc/classes/BxDolAlerts.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,16 @@ public function alert()
$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
]);
}

/**
Expand Down
1 change: 1 addition & 0 deletions modules/boonex/english/data/langs/system/en.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
1 change: 1 addition & 0 deletions modules/boonex/russian/data/langs/system/ru.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
11 changes: 11 additions & 0 deletions periodic/cron.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,15 @@ function runJob($aJob)
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
]);
}
/** @} */
32 changes: 30 additions & 2 deletions studio/classes/BxDolStudioAgentsAutomatorsCmts.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -21,7 +23,9 @@ public function __construct($sSystem, $iId, $iInit = true, $oTemplate = false)
$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;
}

Expand Down Expand Up @@ -50,6 +54,27 @@ public function actionGetCmt ()
'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 = [])
{
Expand Down Expand Up @@ -175,7 +200,10 @@ protected function _getActionsBox(&$aCmt, $aBp = [], $aDp = [])
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 = [])
Expand Down
48 changes: 41 additions & 7 deletions studio/js/agents_automators.js → studio/js/agents.js
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -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()});
};

/** @} */
10 changes: 0 additions & 10 deletions studio/template/agents_automator.html

This file was deleted.

File renamed without changes.
33 changes: 25 additions & 8 deletions studio/template/scripts/BxBaseStudioAgents.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,26 @@
class BxBaseStudioAgents extends BxDolStudioAgents
{
protected $sSubpageUrl;
protected $aPageJsOptions;
protected $aMenuItems;
protected $aGridObjects;

public function __construct($sPage = '')
{
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'],
Expand All @@ -34,11 +43,7 @@ public function __construct($sPage = '')

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 = [])
Expand Down Expand Up @@ -73,9 +78,21 @@ protected function getSettings()
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();
}

Expand Down
Loading

0 comments on commit c75f066

Please sign in to comment.