<?php
defined('ABSPATH') || exit;
defined('ABSPATH') || exit;
final class GPLVault_Client
{
protected static $singleton = null;
protected $version;
protected $plugin_name;
protected $plugin_basename;
protected $emitter;
public static function instance()
{
if (is_null(self::$singleton)) {
self::$singleton = new self();
}
return self::$singleton;
}
private function __construct()
{
$this->version = GV_UPDATER_VERSION;
$this->plugin_name = GV_UPDATER_NAME;
$this->plugin_basename = plugin_basename(GV_UPDATER_FILE);
do_action('gv_client_loading');
$this->base_includes();
$this->set_locale();
do_action('gv_instantiated');
do_action('gv_client_loaded');
}
public function version()
{
return $this->version;
}
public function plugin_basename()
{
return $this->plugin_basename;
}
public function plugin_name()
{
return $this->plugin_name;
}
private function set_locale()
{
add_action('plugins_loaded', array($this, 'load_text_domain'));
}
public function load_text_domain()
{
load_plugin_textdomain('gplvault', false, GV_UPDATER_PATH . 'languages');
}
private function base_includes()
{
require_once $this->includes_path('/class-gplvault-helper.php');
require_once $this->includes_path('/gplvault-helpers.php');
require_once $this->includes_path('/class-gplvault-ajax.php');
require_once $this->includes_path('/class-gplvault-hooks.php');
require_once $this->includes_path('/settings/class-gplvault-settings-manager.php');
require_once $this->includes_path('/class-gplvault-util.php');
require_once $this->includes_path('/gplvault-functions.php');
require_once $this->includes_path('/api/class-gplvault-api-manager.php');
require_once $this->admin_path('/class-gplvault-admin.php');
require_once $this->includes_path('/class-gplvault-items.php');
require_once $this->includes_path('/class-gplvault-updater.php');
require_once $this->includes_path('/upgrader/class-gplvault-upgrade-manager.php');
}
public function run()
{
$this->initial_hooks();
GPLVault_Ajax::instance()->init();
if (is_admin()) {
GPLVault_Admin::instance()->init();
}
GPLVault_Items::instance()->init();
GPLVault_Updater::instance()->init();
GPLVault_Upgrade_Manager::instance()->init();
}
public function initial_hooks()
{
$gv_util = GPLVault_Util::instance();
if (gv_settings_manager()->license_is_activated()) {
add_filter('cron_schedules', array($this, 'cron_schedules'));
add_action('admin_init', array($gv_util, 'disable_woothemes_notice'));
} else {
remove_filter('cron_schedules', array($this, 'cron_schedules'));
remove_action('admin_init', array($gv_util, 'disable_woothemes_notice'));
}
if (defined('GPLVAULT_RENAME_PLUGINS') && GPLVAULT_RENAME_PLUGINS) {
add_filter('all_plugins', array($gv_util, 'rename_plugins'));
}
add_action('gv_api_license_activated', array($this, 'load_initial_schema'));
if (gv_settings_manager()->license_is_activated()) {
add_action('init', array($this, 'gv_initialize_cron'));
add_action('gplvault_six_hours_cron', array($this, 'update_schema'));
add_action('gv_two_hours_cron', array($this, 'scheduled_license_check'));
if (!gv_settings_manager()->has_plugins()) {
$this->load_initial_schema();
}
if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
add_action('init', array($this, 'update_schema'));
}
} else {
remove_action('gplvault_six_hours_cron', array($this, 'update_schema'));
if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
remove_action('init', array($this, 'update_schema'));
}
wp_clear_scheduled_hook('gplvault_six_hours_cron');
wp_clear_scheduled_hook('gv_two_hours_cron');
remove_action('gv_two_hours_cron', array($this, 'scheduled_license_check'));
remove_action('init', array($this, 'gv_initialize_cron'));
}
}
public function scheduled_license_check()
{
$old_checks = gv_settings_manager()->status_checks();
$status_response = gv_api_manager()->status();
if (!is_wp_error($status_response)) {
gv_settings_manager()->remove_status_checks();
if (isset($status_response['data'])) {
gv_settings_manager()->save_license_status($status_response['data']);
}
return;
}
$old_checks[] = time();
if (count($old_checks) >= 24) {
gv_settings_manager()->disable_activation_status();
gv_settings_manager()->clear_api_settings();
gv_settings_manager()->remove_license_status();
gv_settings_manager()->save_status_checks();
} else {
gv_settings_manager()->save_status_checks($old_checks);
}
}
public function update_schema()
{
if (gv_settings_manager()->license_is_activated()) {
$current_time = current_time('timestamp');
if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
$next_run = gv_settings_manager()->get('gplvault_next_fetch_schema', 0);
if ($next_run > $current_time) {
return;
}
}
$schema = gv_api_manager()->schema();
if (!is_wp_error($schema)) {
$this->update_plugins($schema);
$this->update_themes($schema);
if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
$next_run = $current_time + 6 * HOUR_IN_SECONDS;
gv_settings_manager()->update('gplvault_next_fetch_schema', $next_run);
}
}
}
}
private function update_plugins($schema)
{
$decoded_plugins = $schema['plugins'];
gv_settings_manager()->update_plugins_catalog($decoded_plugins);
}
private function update_themes($schema)
{
$decoded_themes = $schema['themes'];
gv_settings_manager()->update_themes_catalog($decoded_themes);
}
public function load_initial_schema()
{
$schema = gv_api_manager()->schema();
if (!is_wp_error($schema)) {
$this->update_plugins($schema);
$this->update_themes($schema);
GPLVault_Admin::gv_update_plugins();
GPLVault_Admin::gv_update_themes();
}
}
public function cron_schedules($schedules)
{
$schedules['gv_thricedaily'] = array('interval' => 8 * HOUR_IN_SECONDS, 'display' => __('Thrice daily', 'gplvault'));
$schedules['gv_fourtimes'] = array('interval' => 6 * HOUR_IN_SECONDS, 'display' => __('Four times daily', 'gplvault'));
$schedules['gv_two_hours'] = array('interval' => 2 * HOUR_IN_SECONDS, 'display' => __('Every two hours', 'gplvault'));
return $schedules;
}
public function gv_initialize_cron()
{
if (!wp_next_scheduled('gplvault_six_hours_cron')) {
wp_schedule_event(time(), 'gv_fourtimes', 'gplvault_six_hours_cron');
}
if (!wp_next_scheduled('gv_two_hours_cron')) {
wp_schedule_event(time(), 'gv_two_hours', 'gv_two_hours_cron');
}
}
public function user_subs_pending_notice()
{
include GV_UPDATER_STATIC_PATH . 'notices/notice-pending-subscription.php';
}
private function dismiss_third_party_notices()
{
if (!gv_settings_manager()->license_is_activated()) {
return;
}
add_action('admin_notices', array($this, 'gv_discard_bsf_update_notices'), -10);
add_action('after_setup_theme', array($this, 'gv_discard_elementor_update_notices'), PHP_INT_MAX);
}
public function gv_discard_bsf_update_notices()
{
define('BSF_PRODUCTS_NOTICES', false);
}
public function gv_discard_elementor_update_notices()
{
if (class_exists('\\ElementorPro\\Plugin', false)) {
remove_action('admin_notices', array(\ElementorPro\Plugin::instance()->license_admin, 'admin_license_details'), 20);
}
}
public function path($tail = '')
{
return untrailingslashit(dirname(GV_UPDATER_FILE)) . $tail;
}
public function admin_path($tail = '')
{
return $this->path('/admin' . $tail);
}
public function includes_path($tail = '')
{
return $this->path('/includes' . $tail);
}
public function url($tail = '')
{
return untrailingslashit(plugin_dir_url($this->plugin_basename)) . $tail;
}
public function admin_assets_url($tail = '')
{
return $this->url('/admin/assets' . $tail);
}
}