Your IP : 216.73.216.84


Current Path : /home/h/e/l/helpink/www/libraries/astroid/
Upload File :
Current File : /home/h/e/l/helpink/www/libraries/astroid/script.php

<?php

/**
 * @package   Astroid Framework
 * @author    Astroid Framework Team https://astroidframe.work
 * @copyright Copyright (C) 2024 AstroidFrame.work
 * @license https://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later
 */

// no direct access
use Joomla\CMS\Application\AdministratorApplication;
use Joomla\CMS\Installer\InstallerAdapter;
use Joomla\CMS\Installer\InstallerScriptInterface;
use Joomla\CMS\Language\Text;
use Joomla\Database\DatabaseInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Exception\FilesystemException;
use Astroid\Helper\Overrides;
use Joomla\CMS\Installer\Installer;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

return new class () implements ServiceProviderInterface {
    public function register(Container $container)
    {
        $container->set(
            InstallerScriptInterface::class,
            new class (
                $container->get(AdministratorApplication::class),
                $container->get(DatabaseInterface::class)
            ) implements InstallerScriptInterface {
                private AdministratorApplication $app;
                private DatabaseInterface $db;

                public function __construct(AdministratorApplication $app, DatabaseInterface $db)
                {
                    $this->app = $app;
                    $this->db  = $db;
                }

                public function install(InstallerAdapter $parent): bool
                {
                    $this->app->enqueueMessage('Astroid Library has been successful installed.');

                    return true;
                }

                public function update(InstallerAdapter $parent): bool
                {
                    $this->app->enqueueMessage('Astroid Library has been successful updated.');

                    return true;
                }

                public function uninstall(InstallerAdapter $parent): bool
                {
                    $this->app->enqueueMessage('Astroid Library has been successful uninstalled.');

                    return true;
                }

                public function preflight(string $type, InstallerAdapter $parent): bool
                {
                    $plugin_dir = JPATH_LIBRARIES . '/' . 'astroid' . '/' . 'plugins' . '/';
                    $plugins = array_filter(glob($plugin_dir . '*'), 'is_dir');
                    foreach ($plugins as $plugin) {
                        if ($type == "uninstall") {
                            $this->uninstallPlugin($plugin, $plugin_dir);
                        }
                    }

                    $module_dir = JPATH_LIBRARIES . '/' . 'astroid' . '/' . 'modules' . '/';
                    $modules = array_filter(glob($module_dir . '*'), 'is_dir');
                    foreach ($modules as $module) {
                        if ($type == "uninstall") {
                            $this->uninstallModule($module, $module_dir);
                        }
                    }
                    return true;
                }

                public function postflight(string $type, InstallerAdapter $parent): bool
                {
                    $plugin_dir = JPATH_LIBRARIES . '/' . 'astroid' . '/' . 'plugins' . '/';
                    $plugins = array_filter(glob($plugin_dir . '*'), 'is_dir');
                    foreach ($plugins as $plugin) {
                        if ($type == "install" || $type == "update") {
                            $this->installPlugin($plugin, $plugin_dir);
                        }
                    }

                    $module_dir = JPATH_LIBRARIES . '/' . 'astroid' . '/' . 'modules' . '/';
                    $modules = array_filter(glob($module_dir . '*'), 'is_dir');
                    foreach ($modules as $module) {
                        if ($type == "install" || $type == "update") {
                            $this->installModule($module, $module_dir);
                        }
                    }

                    if ($type == "update") {
                        Overrides::fix();
                    }

                    return true;
                }

                private function installPlugin($plugin, $plugin_dir)
                {
                    $db = $this->db;
                    $plugin_name = str_replace($plugin_dir, '', $plugin);

                    $installer = new Installer;
                    if ($installer->install($plugin)) {
                        $this->app->enqueueMessage(Text::_(strtoupper($plugin_name)) . ' Plugin has been successfully installed.');
                    } else {
                        $this->app->enqueueMessage(Text::_(strtoupper($plugin_name)) . ' Plugin has been failed to install.');
                    }

                    $query = $db->getQuery(true);
                    $query->update('#__extensions');
                    $query->set($db->quoteName('enabled') . ' = 1');
                    $query->where($db->quoteName('element') . ' = ' . $db->quote($plugin_name));
                    $query->where($db->quoteName('type') . ' = ' . $db->quote('plugin'));
                    $db->setQuery($query);
                    $db->execute();
                    return true;
                }

                private function installModule($module, $module_dir)
                {
                    $db = $this->db;
                    $module_name = str_replace($module_dir, '', $module);

                    $installer = new Installer;
                    if ($installer->install($module)) {
                        $this->app->enqueueMessage(Text::_(strtoupper($module_name)) . ' Module has been successfully installed.');
                    } else {
                        $this->app->enqueueMessage(Text::_(strtoupper($module_name)) . ' Module has been failed to install.');
                    }

                    $query = $db->getQuery(true);
                    $query->update('#__extensions');
                    $query->set($db->quoteName('enabled') . ' = 1');
                    $query->where($db->quoteName('element') . ' = ' . $db->quote($module_name));
                    $query->where($db->quoteName('type') . ' = ' . $db->quote('module'));
                    $db->setQuery($query);
                    $db->execute();

                    if ($module_name === 'mod_astroid_clear_cache') {
                        $query = $db->getQuery(true);
                        $query->update('#__modules');
                        $query->set($db->quoteName('published') . ' = 1');
                        $query->set($db->quoteName('position') . ' = ' . $db->quote('status'));
                        $query->set($db->quoteName('params') . ' = ' . $db->quote('{"layout":"_:default","moduleclass_sfx":"","style":"0","module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":""}'));
                        $query->where($db->quoteName('module') . ' = ' . $db->quote($module_name));
                        $db->setQuery($query);
                        $db->execute();
                    }

                    // Retrieve ID
                    $query = $db->getQuery(true);
                    $query->select($db->quoteName('id'));
                    $query->from($db->quoteName('#__modules'));
                    $query->where($db->quoteName('module') . ' = ' . $db->quote($module_name));
                    $db->setQuery($query);
                    $id = (int) $db->loadResult();

                    if ($id) {
                        $query = $db->getQuery(true);
                        $query->select($db->quoteName('moduleid'));
                        $query->from($db->quoteName('#__modules_menu'));
                        $query->where($db->quoteName('moduleid') . ' = ' . $id);
                        $db->setQuery($query);
                        if (!$db->loadResult()) {
                            $db->getQuery(true);
                            $db->setQuery("INSERT INTO #__modules_menu (`moduleid`,`menuid`) VALUES (".$id.", 0)");
                            $db->execute();
                        }
                    }
                    return true;
                }

                private function uninstallPlugin($plugin, $plugin_dir)
                {
                    try {
                        $db = $this->db;
                        $plugin_name = str_replace($plugin_dir, '', $plugin);
                        $query = $db->getQuery(true);
                        $query->update('#__extensions');
                        $query->set($db->quoteName('enabled') . ' = 0');
                        $query->where($db->quoteName('element') . ' = ' . $db->quote($plugin_name));
                        $query->where($db->quoteName('type') . ' = ' . $db->quote('plugin'));
                        $db->setQuery($query);
                        if ($db->execute()) {
                            $this->app->enqueueMessage('Astroid Plugins has been successfully uninstalled.');
                        } else {
                            $this->app->enqueueMessage('Astroid Plugins has been failed to uninstall.');
                        }
                    } catch (\Exception $e) {
                        echo $e->getMessage() . '<br>';
                    }

                    return true;
                }

                private function uninstallModule($module, $module_dir)
                {
                    try {
                        $db = $this->db;
                        $module_name = str_replace($module_dir, '', $module);
                        $query = $db->getQuery(true);
                        $query->update('#__extensions');
                        $query->set($db->quoteName('enabled') . ' = 0');
                        $query->where($db->quoteName('element') . ' = ' . $db->quote($module_name));
                        $query->where($db->quoteName('type') . ' = ' . $db->quote('module'));
                        $db->setQuery($query);
                        if ($db->execute()) {
                            $this->app->enqueueMessage('Astroid Modules has been successfully uninstalled.');
                        } else {
                            $this->app->enqueueMessage('Astroid Modules has been failed to uninstall.');
                        }
                    } catch (\Exception $e) {
                        echo $e->getMessage() . '<br>';
                    }
                    return true;
                }
            }
        );
    }
};