HEX
Server: Apache
System: Linux sys.digiflyeg.com 4.18.0-553.62.1.lve.el8.x86_64 #1 SMP Mon Jul 21 17:50:35 UTC 2025 x86_64
User: opal (1023)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/opal/public_html/wp-content/plugins/master-addons/inc/classes/Pro_Upgrade.php
<?php

namespace MasterAddons\Inc\Classes;

use MasterAddons\Inc\Helper\Master_Addons_Helper;
use MasterAddons\Inc\Classes\Notifications\Base\Date;


// No, Direct access Sir !!!
if (!defined('ABSPATH')) {
	exit;
}

/**
 * Upgrade to Pro Class
 *
 * Jewel Theme <support@jeweltheme.com>
 */
class Pro_Upgrade
{

	use Date;

	public $slug;

	protected $data = array();

	protected $modes = array(
		'development' => array(
			'sheet_id' => '1VLpfKspHHNM6JIFOQtohqDRyHR85J3KR5RLF4jqlz0Q',
			'tab_id'   => 0,
		),
		'production'  => array(
			'sheet_id' => '1VLpfKspHHNM6JIFOQtohqDRyHR85J3KR5RLF4jqlz0Q',
			'tab_id'   => 0,
		),
	);

	/**
	 * Construct method
	 */
	public function __construct()
	{
		// Check if Pro is already activated
		// pretty_log( 'Data Looking for ',  $this->get_content('show_for_premiun'));
		// if (wp_validate_boolean($this->get_content('show_for_premiun'))) {
		// 	return;
		// }

		$this->slug = Master_Addons_Helper::jltma_slug_cleanup();

		$this->maybe_sync_remote_data();
		$this->register_sync_hook();
		$this->set_data();

		add_action('admin_footer', array($this, 'display_popup'));

		add_action('wp_dashboard_setup', array($this, 'dashboard_widget'));
	}

	/**
	 * Register Dashboard widget
	 *
	 * @return void
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function dashboard_widget()
	{
		wp_add_dashboard_widget(
			'jltma_dashboard_widget',                          // Widget slug.
			esc_html__('Master Addons News & Updates', 'master-addons'), // Title.
			array($this, 'dashboard_widget_render')                    // Display function.
		);

		// Globalize the metaboxes array, this holds all the widgets for wp-admin.
		global $wp_meta_boxes;

		// Get the regular dashboard widgets array
		// (which already has our new widget but appended at the end).
		$default_dashboard = $wp_meta_boxes['dashboard']['normal']['core'];

		// Backup and delete our new dashboard widget from the end of the array.
		$example_widget_backup = array('jltma_dashboard_widget' => $default_dashboard['jltma_dashboard_widget']);
		unset($default_dashboard['jltma_dashboard_widget']);

		// Merge the two arrays together so our widget is at the beginning.
		$sorted_dashboard = array_merge($example_widget_backup, $default_dashboard);

		// Save the sorted array back into the original metaboxes .
		$wp_meta_boxes['dashboard']['normal']['core'] = $sorted_dashboard;
	}

	/**
	 * Render dashboard widget
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function dashboard_widget_render()
	{
		include_once ABSPATH . WPINC . '/feed.php';

		$feed_url = 'https://jeweltheme.com/feed.xml';

		// Get a SimplePie feed object from the specified feed source .
		$rss      = fetch_feed($feed_url);
		$maxitems = 0;

		if (!is_wp_error($rss)) { // Checks that the object is created correctly .
			// Figure out how many total items there are, and choose a limit .
			$maxitems = $rss->get_item_quantity(5);

			// Build an array of all the items, starting with element 0 (first element).
			$rss_items = $rss->get_items(0, $maxitems);

			// Get RSS title .
			$rss_title = '<a href="' . $rss->get_permalink() . '" target="_blank">' . strtoupper($rss->get_title()) . '</a>';
		}

		// Display the container .
		echo '<div class="jltma-rss-widget">';

		if (wp_validate_boolean($this->get_content('is_campaign'))) { ?>

			<div class="jltma-dashboard-promo" style="--jltma-popup-color: <?php echo esc_attr($this->get_content('btn_color')); ?>;">
				<a target="_blank" href="<?php echo esc_url($this->get_content('button_url')); ?>">
					<img src="<?php echo esc_url($this->get_content('image_url')); ?>" alt="Master Addons Promo Image" style="width: 100%; height: auto;">
				</a>

				<a class="jltma-popup-button" target="_blank" href="<?php echo esc_url($this->get_content('button_url')); ?>">
					<?php echo esc_html($this->get_content('button_text')); ?>
				</a>
			</div>

		<?php
		}

		// Starts items listing within <ul> tag
		// Check items .
		if (!empty($maxitems)) {
			echo '<ul>';
			// Loop through each feed item and display each item as a hyperlink.
			foreach ($rss_items as $item) {
				// Uncomment line below to display non human date
				// $item_date = $item->get_date( get_option('date_format').' @ '.get_option('time_format') ); .

				// Get human date (comment if you want to use non human date) .
				// $item_date = human_time_diff( $item->get_date( 'U' ), current_time( 'timestamp' ) ) . ' ' . __( 'ago', 'master-addons' );

				// Start displaying item content within a <li> tag .
				echo '<li>';
				// create item link .
				echo '<a href="' . esc_url($item->get_permalink()) . '" title="' . esc_attr($item->get_title()) . '" target="_blank">';
				// Get item title .
				echo esc_html($item->get_title());
				echo '</a>';
				// Display date .
				//echo ' <span class="rss-date">' . esc_html( $item_date ) . '</span><br />';
				// Get item content .
				$content = $item->get_content();
				// Shorten content .
				$content = wp_html_excerpt($content, 120) . ' ';
				// Display content .
				echo esc_html($content);
				// End <li> tag .
				echo '</li>';
			}
			echo '</ul>';
			// End <ul> tag .
		}
		?>

		<div class="jltma-dashboard_footer">
			<ul>
				<li class="jltma-overview__blog">
					<a href="https://jeweltheme.com/blog" target="_blank">
						Blog
						<span class="screen-reader-text">
							<?php echo esc_html__('(opens in a new window)', 'master-addons'); ?>
						</span>
						<span aria-hidden="true" class="dashicons dashicons-external"></span>
					</a>
				</li>
				<li class="jltma-overview__help">
					<a href="https://jeweltheme.com/docs" target="_blank">
						Help
						<span class="screen-reader-text">
							<?php echo esc_html__('(opens in a new window)', 'master-addons'); ?>
						</span>
						<span aria-hidden="true" class="dashicons dashicons-external"></span>
					</a>
				</li>
				<li class="jltma-overview__upgrade">
					<a href="https://jeweltheme.com" target="_blank">
						Upgrade
						<span class="screen-reader-text">
							<?php echo esc_html__('(opens in a new window)', 'master-addons'); ?>
						</span>
						<span aria-hidden="true" class="dashicons dashicons-external"></span>
					</a>
				</li>

			</ul>
		</div>
		<style>
			/* News Dashboard Widget */
			.jltma-rss-widget .hndle.ui-sortable-handle img {
				margin: -5px 10px -5px 0;
			}

			.jltma-rss-widget .jltma-dashboard_footer {
				margin: 0 -12px -12px;
				padding: 0 12px;
				border-top: 1px solid #eee;
			}

			.jltma-rss-widget .jltma-dashboard_footer ul {
				display: flex;
				list-style: none;
			}

			.jltma-rss-widget .jltma-dashboard_footer ul li:first-child {
				padding-left: 0;
				border: none;
			}

			.jltma-rss-widget .jltma-dashboard_footer li {
				padding: 0 10px;
				margin: 0;
				border-left: 1px solid #ddd;
			}

			.jltma-rss-widget .jltma-overview__go-pro a {
				color: #FCB92C;
				font-weight: 500;
			}
		</style>

	<?php
		echo '</div>';
	}


	/**
	 * Set merged data
	 *
	 * @return void
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function set_data()
	{
		$this->data = Master_Addons_Helper::get_merged_data(self::get_data());
	}

	/**
	 * Get Sheet data
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public static function get_data()
	{
		return get_option('jltma_sheet_promo_data');
	}

	/**
	 * Get Contents
	 *
	 * @param [type] $key .
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function get_content($key)
	{
		return $this->data[$key];
	}

	/**
	 * Get Option has data
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function get_data_hash()
	{
		return get_option('jltma_sheet_promo_data_hash');
	}

	/**
	 * Sync to remote data
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function maybe_sync_remote_data()
	{
		$data = self::get_data();

		if (empty($data)) {
			$this->sheet_data_remote_sync();
		}
	}

	/**
	 * Register Sync hook
	 *
	 * @return void
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function register_sync_hook()
	{
		$hook_action = 'jltma_sheet_promo_data_remote_sync';
		add_action($hook_action, array($this, 'sheet_data_remote_sync'));

		if (!wp_next_scheduled($hook_action)) {
			wp_schedule_event(time(), 'daily', $hook_action);
		}

		register_deactivation_hook(JLTMA_FILE, array($this, 'clear_register_sync_hook'));
	}

	/**
	 * Clear register sync hook
	 *
	 * @return void
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function clear_register_sync_hook()
	{
		wp_clear_scheduled_hook('jltma_sheet_promo_data_remote_sync');
	}

	/**
	 * Data sync with remote
	 *
	 * @return void
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function sheet_data_remote_sync()
	{
		$data  = self::get_data();
		$force = false;

		if (empty($data)) {
			$force = true;
		}

		$sheet_hash_data = $this->get_data_hash();
		$remote_data     = $this->get_sheet_promo_remote_data();
		$sheet_data_hash = base64_encode(json_encode($remote_data));

		if ($force || $sheet_hash_data !== $sheet_data_hash) {
			update_option('jltma_sheet_promo_data', $remote_data);
			update_option('jltma_sheet_promo_data_hash', $sheet_data_hash);
			do_action('jltma_sheet_promo_data_reset');
		}
	}

	/**
	 * Get Environment mode
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function get_mode()
	{
		return defined('WP_DEBUG') && WP_DEBUG ? 'development' : 'production';
	}

	/**
	 * Get Sheet URL
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function get_sheet_url()
	{
		$sheet_id = $this->modes[$this->get_mode()]['sheet_id'];
		$tab_id   = $this->modes[$this->get_mode()]['tab_id'];

		return "https://docs.google.com/spreadsheets/export?format=csv&id={$sheet_id}&gid={$tab_id}";
	}

	/**
	 * Promotional remote data
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function get_sheet_promo_remote_data()
	{
		$transient_key = $this->slug . '_sheet_promo_data';

		$data = get_transient($transient_key);
		if ($data !== false) return $data;

		$url = $this->get_sheet_url();

		$response = wp_remote_get($url);

		if (is_wp_error($response)) {
			return false;
		}

		$response = wp_remote_retrieve_body($response);

		if (!$response) {
			return false;
		}

		$data = array_map('str_getcsv', explode("\n", $response));

		$header = array_shift($data);

		$data = array_map(function (array $row) use ($header) {
			return array_combine($header, $row);
		}, $data);

		// filter plugin is not empty .
		$data = array_filter($data, function ($row) {
			return !empty($row['name']);
		});

		$plugin_slug = Master_Addons_Helper::jltma_slug_cleanup();
		$data        = wp_list_filter($data, array('product_slug' => $plugin_slug));

		if (!empty($data)) {
			$data = array_values($data)[0];
		}

		set_transient($transient_key, $data, HOUR_IN_SECONDS);

		return $data;
	}

	/**
	 * Display popup contents
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function display_popup()
	{
		$image_url = $this->get_content('image_url');

	?>

		<div class="jltma-popup jltma-upgrade-popup" id="jltma-popup" data-plugin="<?php echo esc_attr($this->slug); ?>" tabindex="1" style="display: none;">

			<div class="jltma-popup-overlay"></div>

			<div class="jltma-popup-modal" style="background-image: url('<?php echo esc_url($image_url); ?>'); --jltma-popup-color: <?php echo esc_attr($this->get_content('btn_color')); ?>;">

				<!-- close  -->
				<div class="jltma-popup-modal-close popup-dismiss">×</div>

				<!-- content section  -->
				<div class="jltma-popup-modal-footer">

					<!-- countdown  -->
					<div class="jltma-popup-countdown" style="display: none;">
						<?php if (!empty($this->get_content('notice'))) { ?>
							<span data-counter="notice" style="color:#F4B740; font-size:14px; padding-bottom:20px; font-style:italic;">
								<?php echo esc_html__('Notice:', 'master-addons'); ?> <?php echo $this->get_content('notice'); ?>
							</span>
						<?php } ?>
						<span class="jltma-popup-countdown-text"><?php echo esc_html__('Offer Ends In', 'master-addons'); ?></span>
						<div class="jltma-popup-countdown-time">
							<div>
								<span data-counter="days">00</span>
								<span><?php echo esc_html__('Days', 'master-addons'); ?></span>
							</div>
							<span>:</span>
							<div>
								<span data-counter="hours">00</span>
								<span><?php echo esc_html__('Hours', 'master-addons'); ?></span>
							</div>
							<span>:</span>
							<div>
								<span data-counter="minutes">00</span>
								<span><?php echo esc_html__('Minutes', 'master-addons'); ?></span>
							</div>
							<span>:</span>
							<div>
								<span data-counter="seconds">00</span>
								<span><?php echo esc_html__('Seconds', 'master-addons'); ?></span>
							</div>
						</div>
					</div>

					<!-- button  -->
					<a class="jltma-popup-button" target="_blank" href="<?php echo esc_url($this->get_content('button_url')); ?>"><?php echo esc_html($this->get_content('button_text')); ?></a>
				</div>
			</div>
		</div>

		<script>
			var $container = jQuery('#jltma-popup'),
				plugin_data = <?php echo json_encode($this->get_sheet_promo_remote_data(), true); ?>,
				events = {}; //Events

			// Update Counter
			function updateCounter(seconds) {
				const $counter = $container.find(".jltma-popup-countdown-time");
				const $days = $counter.find("[data-counter='days']");
				const $hours = $counter.find("[data-counter='hours']");
				const $minutes = $counter.find("[data-counter='minutes']");
				const $seconds = $counter.find("[data-counter='seconds']");
				const days = Math.floor(seconds / (3600 * 24));
				seconds -= days * 3600 * 24;
				const hrs = Math.floor(seconds / 3600);
				seconds -= hrs * 3600;
				const mnts = Math.floor(seconds / 60);
				seconds -= mnts * 60;

				$days.text(days);
				$hours.text(hrs);
				$minutes.text(mnts);
				$seconds.text(seconds);
			}

			// Trigger Event
			function trigger(event, args = []) {
				if (typeof(events[event]) !== 'undefined') {
					events[event].forEach(callback => {
						callback.apply(this, args);
					});
				}
			}

			// initCounter
			function initCounter(last_date) {
				$container.find(".jltma-popup-countdown-time").show();

				const countdown = () => {

					// system time
					const now = new Date().getTime();

					// set end time to 11:59:59 PM
					const endDate = new Date(last_date);
					endDate.setHours(23);
					endDate.setMinutes(59);
					endDate.setSeconds(59);

					const seconds = Math.floor((endDate.getTime() - now) / 1000);

					if (seconds < 0) {
						return false;
					}

					updateCounter(seconds);

					return true;
				}

				let result = countdown();


				if (result) {
					trigger("countdownStart", [plugin_data]);
					$container.find(".jltma-popup-countdown").show(0);
				} else {
					trigger("countdownFinish", [plugin_data]);
					$container.find(".jltma-popup-countdown").hide(0);
				}

				// update counter every 1 second
				const counter = setInterval(() => {

					const result = countdown();

					if (!result) {
						clearInterval(counter);
						trigger("counter_end", [plugin_data]);
						$container.find(".jltma-popup-countdown").hide(0);
					}

				}, 1000);
			}

			initCounter('<?php echo esc_attr($this->counter_date()); ?>');
		</script>

<?php
	}

	/**
	 * Counter Date
	 *
	 * @author Jewel Theme <support@jeweltheme.com>
	 */
	public function counter_date()
	{
		$endDate = $this->get_content('end_date');

		$is_active = $this->date_is_current_or_next($endDate);

		if ($is_active) {
			return $endDate;
		}

		return $this->date_increment($this->current_time(), 3);
	}
}