| Current Path : /var/www/html/administrator/components/com_jchat/Model/ |
| Current File : /var/www/html/administrator/components/com_jchat/Model/ConfigModel.php |
<?php
namespace JExtstore\Component\JChat\Administrator\Model;
/**
*
* @package JCHAT::CONFIG::administrator::components::com_jchat
* @subpackage models
* @author Joomla! Extensions Store
* @copyright (C) 2024 - Joomla! Extensions Store
* @license GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html
*/
defined ( '_JEXEC' ) or die ( 'Restricted access' );
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\MVC\Model\FormModel;
use Joomla\CMS\Table\Extension;
use Joomla\CMS\Form\Form;
use Joomla\Event\Event;
use JExtstore\Component\JChat\Administrator\Framework\Helpers\Users;
use JExtstore\Component\JChat\Administrator\Framework\Exception\Exceptions;
use JExtstore\Component\JChat\Administrator\Framework\Exception as JChatException;
/**
* Config model responsibilities
*
* @package JCHAT::CONFIG::administrator::components::com_jchat
* @subpackage models
* @since 1.0
*/
interface IConfigModel {
/**
* Ottiene i dati di configurazione da db params field record component
*
* @access public
* @return Object
*/
public function &getData();
/**
* Effettua lo store dell'entity config
*
* @access public
* @return boolean
*/
public function storeEntity();
}
/**
* Config model concrete implementation
*
* @package JCHAT::CONFIG::administrator::components::com_jchat
* @subpackage models
* @since 1.0
*/
class ConfigModel extends FormModel implements IConfigModel {
use Exceptions;
/**
* Variables in request array
*
* @access protected
* @var Object
*/
protected $requestArray;
/**
* App reference
*
* @access protected
* @var Object
*/
protected $appInstance;
/**
* Database reference
*
* @access protected
* @var Object
*/
protected $dbInstance;
/**
* Clean the cache
* @param string $group The cache group
* @param integer $client_id The ID of the client
* @return void
* @since 11.1
*/
private function cleanComponentCache($group = null, $client_id = 0) {
// Initialise variables;
$conf = $this->appInstance->getConfig();
$options = array(
'defaultgroup' => ($group) ? $group : $this->appInstance->getInput()->get('option'),
'cachebase' => ($client_id) ? JPATH_ADMINISTRATOR . '/cache' : $conf->get('cache_path', JPATH_CACHE));
$cache = Factory::getContainer()->get(\Joomla\CMS\Cache\CacheControllerFactoryInterface::class)->createCacheController( 'callback', $options );
$cache->clean();
// Trigger the onContentCleanCache event.
$this->appInstance->getDispatcher()->dispatch('onContentCleanCache', new Event('onContentCleanCache', $options));
}
/**
* Ottiene i dati di configurazione da db params field record component
*
* @access public
* @return Object
*/
private function &getConfigData() {
$instance = ComponentHelper::getParams('com_jchat');
return $instance;
}
/**
* Method to get a form object.
*
* @param array $data Data for the form.
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
*
* @return mixed A \Joomla\CMS\Form\Form object on success, false on failure
* @since 1.6
*/
public function getForm($data = array(), $loadData = true) {
Form::addFormPath ( JPATH_ADMINISTRATOR . '/components/com_jchat' );
// Get the form.
$form = $this->loadForm ( 'com_jchat.component', 'config', array ('control' => 'params', 'load_data' => $loadData ), false, '/config' );
if (empty ( $form )) {
return false;
}
return $form;
}
/**
* Ottiene i dati di configurazione del componente
*
* @access public
* @return Object
*/
public function &getData() {
return $this->getConfigData ();
}
/**
* Effettua lo store dell'entity config
*
* @access public
* @return boolean
*/
public function storeEntity() {
$table = new Extension($this->dbInstance);
// Replace SEF images links
$base = Uri::root(true) . '/';
$protocols = '[a-zA-Z0-9]+:';
$regex = '#(src|href|poster)="(?!/|' . $protocols . '|\#|\')([^"]*)"#m';
try {
// Found as installed extension
if (!$extensionID = $table->find(array('element' => 'com_jchat'))) {
throw new JChatException($table->getError (), 'error');
}
$table->load($extensionID);
$decodedParams = json_decode($table->params);
$existingChatGPTAiBotEnabled = isset($decodedParams->chatgpt_ai_bot_enabled) ? $decodedParams->chatgpt_ai_bot_enabled : 0;
// Translate posted jform array to params for ORM table binding
$post = $this->appInstance->getInput()->post;
if (!$table->bind ($post->getArray($this->requestArray))) {
throw new JChatException($table->getError (), 'error');
}
// Unserialize and replace offline_message param as RAW no filter
$unserializedParams = json_decode($table->params);
// Evaluate the ChatGPT switcher on/off to enable/disable the ChatBot user by artificial session
$currentChatGPTAiBotEnabled = $this->requestArray ['params'] ['chatgpt_ai_bot_enabled'];
if ($currentChatGPTAiBotEnabled != $existingChatGPTAiBotEnabled) {
$sessionTable = Users::getEmptySessionTable();
switch ($currentChatGPTAiBotEnabled) {
case 1 :
// Add a new guest user session for the ChatGPT bot
$sessionTable->removePrimaryKey();
$sessionTable->session_id = Users::$chatGPTSessionIdentifier;
$sessionTable->client_id = 0;
$sessionTable->guest = 1;
$sessionTable->time = '2145916800';
$sessionTable->data = null;
$sessionTable->userid = 0;
$sessionTable->username = '';
$sessionTable->store();
// Add a new xxx_sessionstatus override_name for the ChatGPT bot
$query = "INSERT INTO #__jchat_sessionstatus (sessionid, " .
$this->dbInstance->quoteName('override_name') . ") VALUES (" .
$this->dbInstance->quote(Users::$chatGPTSessionIdentifier) . ", " .
$this->dbInstance->quote($this->requestArray['params']['chatgpt_ai_bot_name']) . ") " .
"\n ON DUPLICATE KEY UPDATE " .
$this->dbInstance->quoteName('override_name') . " = " . $this->dbInstance->quote($this->requestArray['params']['chatgpt_ai_bot_name']);
$this->dbInstance->setQuery($query);
try {
$this->dbInstance->execute ();
} catch (JChatException $e) {
return false;
} catch (\Exception $e) {
return false;
}
break;
case 0 :
// Delete the guest user session for the ChatGPT bot
$sessionTable->delete(Users::$chatGPTSessionIdentifier);
$query = "DELETE FROM #__jchat_sessionstatus" .
"\n WHERE " . $this->dbInstance->quoteName('sessionid') . " = " . $this->dbInstance->quote(Users::$chatGPTSessionIdentifier);
$this->dbInstance->setQuery($query);
try {
$this->dbInstance->execute ();
} catch (JChatException $e) {
return false;
} catch (\Exception $e) {
return false;
}
break;
}
} elseif ($currentChatGPTAiBotEnabled) {
// Add a new xxx_sessionstatus override_name for the ChatGPT bot
$query = "INSERT INTO #__jchat_sessionstatus (sessionid, " .
$this->dbInstance->quoteName('override_name') . ") VALUES (" .
$this->dbInstance->quote(Users::$chatGPTSessionIdentifier) . ", " .
$this->dbInstance->quote($this->requestArray['params']['chatgpt_ai_bot_name']) . ") " .
"\n ON DUPLICATE KEY UPDATE " .
$this->dbInstance->quoteName('override_name') . " = " . $this->dbInstance->quote($this->requestArray['params']['chatgpt_ai_bot_name']);
$this->dbInstance->setQuery($query);
try {
$this->dbInstance->execute ();
} catch (JChatException $e) {
return false;
} catch (\Exception $e) {
return false;
}
}
$unserializedParams->offline_message = $this->requestArray['params']['offline_message'];
$unserializedParams->offline_message = preg_replace($regex, "$1=\"$base\$2\"", $unserializedParams->offline_message);
$unserializedParams->suggestion_tooltip_text = $this->requestArray['params']['suggestion_tooltip_text'];
$unserializedParams->suggestion_tooltip_text = preg_replace($regex, "$1=\"$base\$2\"", $unserializedParams->suggestion_tooltip_text);
$unserializedParams->auto_open_agentbox_defaultmessage = $this->requestArray['params']['auto_open_agentbox_defaultmessage'];
$unserializedParams->auto_open_agentbox_defaultmessage = preg_replace($regex, "$1=\"$base\$2\"", $unserializedParams->auto_open_agentbox_defaultmessage);
$table->params = json_encode($unserializedParams);
// pre-save checks
if (!$table->check()) {
throw new JChatException($table->getError (), 'error');
}
// save the changes
if (!$table->store()) {
throw new JChatException($table->getError (), 'error');
}
} catch (JChatException $e) {
$this->setException($e);
return false;
} catch (\Exception $e) {
$jchatException = new JChatException($e->getMessage(), 'error');
$this->setException($jchatException);
return false;
}
// Clean the cache.
$this->cleanComponentCache('_system', 0);
$this->cleanComponentCache('_system', 1);
return true;
}
/**
* Class contructor
*
* @access public
* @return Object&
*/
public function __construct($config = array(), ?MVCFactoryInterface $factory = null) {
parent::__construct ( $config, $factory );
// App reference
$this->appInstance = Factory::getApplication();
$this->requestArray = &$_POST;
// Joomla 4.2+
if(method_exists($this, 'getDatabase')) {
$this->dbInstance = $this->getDatabase();
} else {
$this->dbInstance = $this->getDbo();
}
}
}