HEX
Server: nginx/1.27.1
System: Linux in-4 5.15.0-131-generic #141-Ubuntu SMP Fri Jan 10 21:18:28 UTC 2025 x86_64
User: ilikadirect (1186)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source
Upload Files
File: /storage/v6964/mangomitra/public_html/wp-content/plugins/totalcontest-lite/src/Admin/Bootstrap.php
<?php

namespace TotalContest\Admin;

use TotalContestVendors\TotalCore\Admin\Pages\Page;
use TotalContestVendors\TotalCore\Contracts\Foundation\Environment;
use TotalContestVendors\TotalCore\Helpers\Arrays;
use TotalContestVendors\TotalCore\Helpers\Strings;
use TotalContestVendors\TotalCore\Http\Request;

/**
 * Class Bootstrap
 *
 * @package TotalContest\Admin
 */
class Bootstrap
{
    /**
     * @var array $pages
     */
    public $pages = [];

    /**
     * @var string|null $requestedPage
     */
    public $requestedPage = null;

    /**
     * @var Page|null $currentPage
     */
    public $currentPage = null;

    /**
     * @var Environment $env
     */
    public $env;
    /**
     * @var Request
     */
    public $request;

    /**
     * @var array
     */
    protected $messages = [];

    /**
     * @var array
     */
    protected $onboarding = [];

    /**
     * Bootstrap constructor.
     *
     * @param  Request  $request
     * @param  Environment  $env
     */
    public function __construct(Request $request, Environment $env)
    {
        $this->onboarding = get_option('totalcontest_onboarding', ['status' => 'init']);

        $this->messages = [
            'reset-contest-success' => [esc_html__('Contest has been reset', 'totalcontest'), 'updated'],
            'reset-contest-error'   => [esc_html__('Contest reset failed', 'totalcontest'), 'error']
        ];

        $this->request = $request;
        $this->env = $env;

        // TotalContest pages.
        $this->pages = [
            'dashboard'      => [
                'title'      => esc_html__('Dashboard', 'totalcontest'),
                'name'       => esc_html__('Dashboard', 'totalcontest'),
                'capability' => 'manage_options',
            ],
            'log'            => [
                'title'      => esc_html__('Logs', 'totalcontest'),
                'name'       => esc_html__('Logs', 'totalcontest'),
                'capability' => 'manage_options',
            ],
            'templates'      => [
                'title'      => esc_html__('Templates', 'totalcontest'),
                'name'       => esc_html__('Templates', 'totalcontest'),
                'capability' => 'manage_options',
            ],
            'extensions'     => [
                'title'      => esc_html__('Extensions', 'totalcontest'),
                'name'       => esc_html__('Extensions', 'totalcontest'),
                'capability' => 'manage_options',
            ],
            'options'        => [
                'title'      => esc_html__('Options', 'totalcontest'),
                'name'       => esc_html__('Options', 'totalcontest'),
                'capability' => 'manage_options',
            ],
            
            'upgrade-to-pro' => [
                'title'      => esc_html__('Upgrade to Pro', 'totalcontest'),
                'name'       => esc_html__('Upgrade to Pro', 'totalcontest'),
                'capability' => 'manage_options',
            ],
            
        ];

        if(Arrays::getDotNotation($this->onboarding, 'status', 'init') === 'init' && current_user_can('manage_options')) {
            $this->pages['onboarding'] = [
                'title'      => esc_html__( 'Onboarding', 'totalcontest' ),
                'name'       => esc_html__( 'Onboarding', 'totalcontest' ),
                'capability' => 'manage_options',
            ];
        }

        // Hook into WordPress menu and screen
        add_action('current_screen', [$this, 'screen']);
        add_action('admin_menu', [$this, 'menu']);
        add_filter('admin_body_class', [$this, 'directionClass']);
        add_action('admin_post_reset_contest', [$this, 'resetContest']);
        add_action('admin_notices', [$this, 'showMessages']);

        // Requested page
        $this->requestedPage = $request->request('page');

        // Bootstrap the page, if present
        if ($GLOBALS['pagenow'] === 'edit.php' && $request->request('post_type') === TC_CONTEST_CPT_NAME):
            if (array_key_exists($this->requestedPage, $this->pages)):
                $this->currentPage = TotalContest("admin.pages.{$this->requestedPage}");
            endif;
        endif;

        // Register admin assets
        $this->registerAssets();



        /**
         * Fires when admin is bootstrapped.
         *
         * @since 2.0.0
         * @order 10
         */
        do_action('totalcontest/actions/bootstrap-admin');
    }

    public function resetContest()
    {
        $contest = $this->request->query('contest', 0);
        $url = wp_get_referer();

        if (check_admin_referer('reset_contest')) {
            $this->contestCleanup($contest);
            $url = add_query_arg('message', 'reset-contest-success', $url);
        } else {
            $url = add_query_arg('message', 'reset-contest-error', $url);
        }
        wp_redirect($url);
        exit();
    }

    /**
     * @param $contest_id
     */
    public function contestCleanup($contest_id)
    {
        $contest = get_post($contest_id);

        if ($contest && $contest->post_type == TC_CONTEST_CPT_NAME):
            $submissions = get_posts([
                'post_type'      => TC_SUBMISSION_CPT_NAME,
                'posts_per_page' => -1,
                'post_parent'    => $contest->ID
            ]);

            foreach ($submissions as $submission) {
                wp_delete_post($submission->ID, false);
            }

            TotalContest('log.repository')->delete(['contest_id' => $contest->ID]);

        endif;
    }

    /**
     * Show admin messages / admin notice hook.
     */
    function showMessages()
    {
        $message = $this->request->query('message');

        if (array_key_exists($message, $this->messages)) {
            list($content, $type) = $this->messages[$message];
            printf('<div class="notice %s"><p>%s</p></div>', $type, $content);
        }
    }

    public function screen()
    {
        $isTotalContest = $GLOBALS['current_screen']->post_type === TC_CONTEST_CPT_NAME || $GLOBALS['current_screen']->post_type === TC_SUBMISSION_CPT_NAME;
        $isContestEditor = $GLOBALS['current_screen']->base === 'post' && $GLOBALS['current_screen']->post_type === TC_CONTEST_CPT_NAME;
        $isSubmissionEditor = $GLOBALS['current_screen']->base === 'post' && $GLOBALS['current_screen']->post_type === TC_SUBMISSION_CPT_NAME;
        $isContestsListing = $GLOBALS['current_screen']->base === 'edit' && $GLOBALS['current_screen']->post_type === TC_CONTEST_CPT_NAME;
        $isSubmissionsListing = $GLOBALS['current_screen']->base === 'edit' && $GLOBALS['current_screen']->post_type === TC_SUBMISSION_CPT_NAME;

        if ($isContestEditor):
            // Bootstrap contest editor
            TotalContest('admin.contest.editor');

        elseif ($isSubmissionEditor):
            // Bootstrap submission editor
            TotalContest('admin.submission.editor');

        elseif ($isContestsListing):
            // Contests listing
            TotalContest('admin.contest.listing');

        elseif ($isSubmissionsListing):
            // Submission listing
            $exportAs = (string)$this->request->request('export', '');
            if ($exportAs):
                TotalContest('admin.submission.listing')->download($exportAs);
            endif;

            TotalContest('admin.submission.listing');
        endif;

        if ($isTotalContest):
            add_filter('admin_footer_text', [$this, 'footerText']);
            add_filter('update_footer', [$this, 'footerVersion']);
        endif;
    }

    public function menu()
    {
        $slug = 'edit.php?post_type=' . TC_CONTEST_CPT_NAME;

        // Add it directly to super global because add_sub menu_page function does not support custom URL for sub menu items.
        if (current_user_can('edit_contest_submissions')):
            $GLOBALS['submenu'][$slug][] = [
                esc_html__('Submissions', 'totalcontest'),
                'edit_posts',
                'edit.php?post_type=' . TC_SUBMISSION_CPT_NAME,
            ];
        endif;

        

        foreach ($this->pages as $pageSlug => $page):
            add_submenu_page($slug, $page['title'], $page['name'], empty($page['capability']) ? 'manage_options' : $page['capability'], $pageSlug, [$this, 'page']);
        endforeach;

        add_filter('parent_file',
            function ($file) use ($slug) {
                foreach ($GLOBALS['submenu'][$slug] as $itemIndex => $item):
                    if ($item[2] === 'dashboard'):
                        unset($GLOBALS['submenu'][$slug][$itemIndex]);
                        array_unshift($GLOBALS['submenu'][$slug], $item);
                    endif;
                endforeach;

                $pages = array_keys($this->pages);
                foreach ($GLOBALS['submenu'][$slug] as $index => $item):
                    if (in_array($item[2], $pages, true)):
                        $GLOBALS['submenu'][$slug][$index][4] = !empty($GLOBALS['plugin_page']) && $GLOBALS['plugin_page'] === $item[2] && $GLOBALS['typenow'] === TC_CONTEST_CPT_NAME ? 'current' : '';
                        $GLOBALS['submenu'][$slug][$index][2] = add_query_arg(['page' => $item[2]], $slug);
                    endif;
                endforeach;

                if ($GLOBALS['current_screen']->taxonomy === TC_SUBMISSION_CATEGORY_TAX_NAME):
                    $GLOBALS['current_screen']->post_type = TC_SUBMISSION_CPT_NAME;
                endif;

                return $file;
            });
    }

    public function registerAssets()
    {
        // Add a dynamic part to assets URL when debugging to prevent cache.
        $assetsVersion = WP_DEBUG ? time() : $this->env['version'];
        $baseUrl = $this->env['url'];

        wp_register_script('jquery-datetimepicker', "{$baseUrl}assets/dist/scripts/vendor/jquery.datetimepicker.full.min.js", ['jquery'], $assetsVersion);
        wp_register_style('jquery-datetimepicker', "{$baseUrl}assets/dist/styles/vendor/datetimepicker.css", [], $assetsVersion);

        wp_register_script('angular', "{$baseUrl}assets/dist/scripts/vendor/angular.min.js", ['media-views'], $assetsVersion);
        wp_register_script('angular-dnd-lists', "{$baseUrl}assets/dist/scripts/vendor/angular-drag-and-drop-lists.min.js", ['angular'], $assetsVersion);
        wp_register_script('angular-resource', "{$baseUrl}assets/dist/scripts/vendor/angular-resource.min.js", ['angular'], $assetsVersion);
        wp_register_script('angular-file-input', "{$baseUrl}assets/dist/scripts/vendor/ng-file-input.min.js", ['angular'], $assetsVersion);

        wp_register_script('platformjs', "{$baseUrl}assets/dist/scripts/vendor/platform.js", ['angular'], $assetsVersion);

        wp_register_style('totalcontest-admin-totalcore', "{$baseUrl}assets/dist/styles/admin-totalcore.css", [], $assetsVersion);

        wp_register_script('totalcontest-admin-dashboard', "{$baseUrl}assets/dist/scripts/dashboard.js", ['angular', 'angular-resource'], $assetsVersion);
        wp_register_style('totalcontest-admin-dashboard', "{$baseUrl}assets/dist/styles/admin-dashboard.css", ['totalcontest-admin-totalcore'], $assetsVersion);

        wp_register_script('totalcontest-admin-contest-editor',
            "{$baseUrl}assets/dist/scripts/contest-editor.js",
            ['jquery-datetimepicker', 'wp-color-picker', 'angular', 'angular-dnd-lists', 'angular-resource'],
            $assetsVersion);
        wp_register_style('totalcontest-admin-contest-editor',
            "{$baseUrl}assets/dist/styles/admin-contest-editor.css",
            ['jquery-datetimepicker', 'wp-color-picker', 'totalcontest-admin-totalcore'],
            $assetsVersion);

        wp_register_script('totalcontest-admin-submission-editor', "{$baseUrl}assets/dist/scripts/submission-editor.js", ['angular', 'angular-resource'], $assetsVersion);
        wp_register_style('totalcontest-admin-submission-editor', "{$baseUrl}assets/dist/styles/admin-submission-editor.css", ['totalcontest-admin-totalcore'], $assetsVersion);

        wp_register_style('totalcontest-admin-contests-listing', "{$baseUrl}assets/dist/styles/admin-contests-listing.css", [], $assetsVersion);

        wp_register_script('totalcontest-admin-submissions-listing', "{$baseUrl}assets/dist/scripts/submissions-listing.js", ['angular', 'angular-resource'], $assetsVersion);
        wp_register_style('totalcontest-admin-submissions-listing', "{$baseUrl}assets/dist/styles/admin-submissions-listing.css", ['totalcontest-admin-totalcore'], $assetsVersion);

        wp_register_script('totalcontest-admin-log',
            "{$baseUrl}assets/dist/scripts/log.js",
            ['angular', 'angular-resource', 'platformjs', 'jquery-datetimepicker'],
            $assetsVersion);
        wp_register_style('totalcontest-admin-log', "{$baseUrl}assets/dist/styles/admin-log.css", ['totalcontest-admin-totalcore', 'jquery-datetimepicker'], $assetsVersion);

        wp_register_script('totalcontest-admin-modules', "{$baseUrl}assets/dist/scripts/modules.js", ['angular', 'angular-resource', 'angular-file-input'], $assetsVersion);
        wp_register_style('totalcontest-admin-modules', "{$baseUrl}assets/dist/styles/admin-modules.css", ['totalcontest-admin-totalcore'], $assetsVersion);

        wp_register_script('totalcontest-admin-options', "{$baseUrl}assets/dist/scripts/options.js", ['angular', 'angular-resource'], $assetsVersion);
        wp_register_style('totalcontest-admin-options', "{$baseUrl}assets/dist/styles/admin-options.css", ['totalcontest-admin-totalcore'], $assetsVersion);

        wp_register_script('totalcontest-admin-onboarding', "{$baseUrl}assets/dist/scripts/onboarding.js", ['angular', 'jquery', 'wp-util', 'angular-resource'], $assetsVersion);

        
        // ------------------------------
        // Upgrade to pro
        // ------------------------------
        /**
         * @asset-script totalcontest-admin-options
         */
        wp_register_style('totalcontest-admin-upgrade-to-pro', "{$baseUrl}assets/dist/styles/admin-upgrade-to-pro.css", ['totalcontest-admin-totalcore'], $assetsVersion);
        
    }

    public function page()
    {
        echo $this->currentPage;
    }

    /**
     * @return mixed
     */
    public function footerText()
    {
	    $text = wp_kses(__( '{{product}} is part of <a href="{{totalsuite}}" target="_blank">TotalSuite</a>, a suite of robust and maintained plugins for WordPress.', 'totalcontest' ), ['a' => ['href' => []]]);

        return Strings::template($text,
            [
                'product'    => $this->env['name'],
                'totalsuite' => add_query_arg([
                    'utm_source'   => 'in-app',
                    'utm_medium'   => 'footer',
                    'utm_campaign' => 'totalcontest',
                ],
                    $this->env['links.totalsuite']),
            ]);
    }

    /**
     * @return string
     */
    public function footerVersion()
    {
        return "{$this->env['name']} {$this->env['version']}";
    }

    /**
     * Add direction (rtl|ltr) to body css classes.
     *
     * @param $classes
     *
     * @return string
     */
    public function directionClass($classes)
    {
        return $classes . (is_rtl() ? 'is-rtl' : ' is-ltr');
    }
}