first commit

This commit is contained in:
2024-07-15 11:28:08 +02:00
commit f52d538ea5
21891 changed files with 6161164 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
{
"name": "wpdesk\/wp-wpdesk-helper",
"authors": [
{
"name": "Krzysiek",
"email": "krzysiek@wpdesk.pl"
}
],
"require": {
"php": ">=5.6",
"wpdesk\/wp-logs": "^1.6.0",
"wpdesk\/wp-wpdesk-license": "^2.5",
"wpdesk\/wp-wpdesk-tracker": "^2.0.4",
"wpdesk\/wp-builder": "^1.2",
"wpdesk\/wp-notice": "^3.1.1"
},
"require-dev": {
"phpunit\/phpunit": "<7",
"wp-coding-standards\/wpcs": "^0.14.1",
"squizlabs\/php_codesniffer": "^3.0.2",
"mockery\/mockery": "*",
"10up\/wp_mock": "*",
"wimg\/php-compatibility": "^8"
},
"autoload": {
"psr-4": {
"FSVendor\\WPDesk\\Helper\\": "src\/"
}
},
"autoload-dev": {
"classmap": [
"tests\/"
]
},
"scripts": {
"test": "echo composer is alive",
"phpcs": "phpcs",
"phpunit-unit": "phpunit --configuration phpunit-unit.xml --coverage-text --colors=never",
"phpunit-unit-fast": "phpunit --configuration phpunit-unit.xml --no-coverage",
"phpunit-integration": "phpunit --configuration phpunit-integration.xml --coverage-text --colors=never",
"phpunit-integration-fast": "phpunit --configuration phpunit-integration.xml --no-coverage",
"docs": "apigen generate"
}
}

View File

@@ -0,0 +1,97 @@
<?php
namespace FSVendor\WPDesk\Helper\Debug;
/**
* Can gather info about used libraries
*
* @package WPDesk\Helper\Debug
*/
class LibraryDebug
{
const COMPOSER_KEY_VERSION = 'version';
const COMPOSER_KEY_NAME = 'name';
const COMPOSER_KEY_PACKAGES = 'packages';
const REPORT_KEY_LIBRARY_NAME = 'library_name';
const REPORT_KEY_LIBRARY_VERSION = 'library_version';
const LIBRARY_VERSION_UNKNOWN = 'unknown';
/**
* Prepares array with report about used libraries
*
* @param array $vendor_files_report
*
* @return array
*/
public function get_libraries_report(array $vendor_files_report)
{
$libraries = [];
foreach ($vendor_files_report as $file) {
$library_name = $file[self::REPORT_KEY_LIBRARY_NAME];
if (isset($libraries[$library_name])) {
$libraries[$library_name][] = $file[self::REPORT_KEY_LIBRARY_VERSION];
} else {
$libraries[$file[self::REPORT_KEY_LIBRARY_NAME]] = [$file[self::REPORT_KEY_LIBRARY_VERSION]];
}
$libraries[$library_name] = \array_unique($libraries[$library_name]);
}
return $libraries;
}
/**
* Returns array with used wpdesk files from vendor dir
*
* @return array
*/
private function get_used_wpdesk_vendor_files()
{
$all_files = \get_included_files();
$vendor_files = \array_filter($all_files, function ($filename) {
return \preg_match('/\\/vendor\\/wpdesk\\//', $filename);
});
return $vendor_files;
}
/**
* Returns array with report about used files
*
* @return array
*/
public function get_wpdesk_vendor_files_report()
{
$vendor_files = $this->get_used_wpdesk_vendor_files();
$loaded = [];
foreach ($vendor_files as $vendor_file) {
$library_name = \preg_match('/\\/wpdesk\\/([^\\/]+)/', $vendor_file, $matches) ? $matches[1] : '';
$plugin_path = \preg_match('/(.+\\/plugins\\/[^\\/]+)/', $vendor_file, $matches) ? $matches[1] : '';
$loaded[] = ['plugin_name' => \preg_match('/\\/plugins\\/([^\\/]+)/', $vendor_file, $matches) ? $matches[1] : '', 'plugin_path' => $plugin_path, self::REPORT_KEY_LIBRARY_NAME => $library_name, self::REPORT_KEY_LIBRARY_VERSION => $this->get_library_version($plugin_path, $library_name), 'file' => $vendor_file];
}
return $loaded;
}
/**
* @param string $plugin_path Path to the plugin that loads the library
* @param string $library_name Library name without vendor ie. wp-logs
*
* @return string Returns 'unknown' when version can't be found
*/
private function get_library_version($plugin_path, $library_name)
{
$lock_file = $plugin_path . '/composer.lock';
static $cache;
if (\file_exists($lock_file)) {
if (!\is_array($cache)) {
$cache = [];
}
if (!isset($cache[$lock_file])) {
$cache[$lock_file] = \json_decode(\file_get_contents($lock_file), \true);
}
$library_version = \array_reduce($cache[$lock_file][self::COMPOSER_KEY_PACKAGES], function ($carry, $package_info) use($library_name) {
if ($package_info[self::COMPOSER_KEY_NAME] === 'wpdesk/' . $library_name) {
return $package_info[self::COMPOSER_KEY_VERSION];
}
return $carry;
});
if ($library_version) {
return $library_version;
}
}
return self::LIBRARY_VERSION_UNKNOWN;
}
}

View File

@@ -0,0 +1,130 @@
<?php
namespace FSVendor\WPDesk\Helper;
use WP_Hook;
use FSVendor\WPDesk\Helper\Integration\LicenseIntegration;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
use FSVendor\WPDesk\PluginBuilder\Storage\Exception\ClassNotExists;
use FSVendor\WPDesk\PluginBuilder\Storage\StorageFactory;
/**
* Tries to remove all traces of helper
*
* @package WPDesk\Helper
*/
class HelperRemover implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
const DEFAULT_FILTER_PRIORITY = 10;
const MAIN_WPDESK_MENU_POSITION = 99.99941337;
const CALLBACK_KEY = 'function';
const CALLBACK_KEY_WITH_FUNCTION_NAME = 1;
const REMOVE_WPDESK_MENU_PRIORITY = 11;
/**
* Prevents attaching hooks more than once when used in many plugins
*
* @var bool
*/
private static $already_hooked;
public function hooks()
{
if (!self::$already_hooked && \is_admin()) {
self::$already_hooked = \true;
$this->hide_notice_about_helper_need();
$this->remove_helper_updates();
$this->remove_wpdesk_menu();
$this->remove_message_about_log();
}
}
/**
* Hides notice from plugin that helper is needed
*
* @return void
*/
private function hide_notice_about_helper_need()
{
\remove_action('admin_notices', 'wpdesk_helper_notice');
$this->remove_object_action_by_name('admin_notices', 10, 'wpdesk_helper_notice');
}
/**
* Removes action/filter using object method callbacks name. You don't need an object instance to use this.
*
* @param string $action_name
* @param int $priority
* @param string $function_name
*/
private function remove_object_action_by_name($action_name, $priority, $function_name)
{
global $wp_filter;
/** @var WP_Hook $admin_notices_tag */
$admin_notices_tag = $wp_filter[$action_name];
if (isset($admin_notices_tag->callbacks[$priority])) {
$default_priority_callbacks = $admin_notices_tag->callbacks[$priority];
foreach ($default_priority_callbacks as $callback) {
if (\is_array($callback) && \is_array($callback[self::CALLBACK_KEY]) && isset($callback[self::CALLBACK_KEY][self::CALLBACK_KEY_WITH_FUNCTION_NAME])) {
$found_function_name = $callback[self::CALLBACK_KEY][self::CALLBACK_KEY_WITH_FUNCTION_NAME];
if ($found_function_name === $function_name) {
$admin_notices_tag->remove_filter($action_name, $callback[self::CALLBACK_KEY], $priority);
}
}
}
}
}
/**
* Removes wpdesk helper menu if was added by helper.
*
* @return void
*/
private function remove_wpdesk_menu()
{
\add_action('admin_menu', function () {
$this->handle_remove_wpdesk_menu();
}, self::REMOVE_WPDESK_MENU_PRIORITY);
}
/**
* Removes wpdesk helper update routines if was added by helper.
*
* @return void
*/
private function remove_helper_updates()
{
// have to be in plugins_loaded because helper is loaded simultaneously with this plugin
\add_action('plugins_loaded', function () {
\remove_action('plugins_loaded', [$this->get_helper_instance(), 'init_helper_plugins'], \FSVendor\WPDesk\Helper\Integration\LicenseIntegration::PRIORITY_HELPER_UPDATE);
});
}
/**
* @return void
*/
private function handle_remove_wpdesk_menu()
{
$wpdesk_helper = $this->get_helper_instance();
if ($wpdesk_helper) {
\remove_submenu_page('wpdesk-helper', 'wpdesk-licenses');
\remove_action('wp-desk_page_wpdesk-licenses', [$wpdesk_helper, 'wpdesk_licenses']);
\remove_submenu_page('wpdesk-helper', 'wpdesk-helper-settings');
\remove_action('wp-desk_page_wpdesk-helper-settings', [$wpdesk_helper, 'wpdesk_helper_settings']);
\remove_menu_page('wpdesk-helper');
}
}
/**
* @return void
*/
private function remove_message_about_log()
{
\add_filter('wpdesk_helper_show_log_notices', '__return_false');
}
/**
* Fetches WPDesk_Helper instance if it's available.
*
* @return \WPDesk_Helper|null
*/
private function get_helper_instance()
{
$storage = new \FSVendor\WPDesk\PluginBuilder\Storage\StorageFactory();
try {
return $storage->create_storage()->get_from_storage('WPDesk_Helper');
} catch (\FSVendor\WPDesk\PluginBuilder\Storage\Exception\ClassNotExists $e) {
return null;
}
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace FSVendor\WPDesk\Helper\Integration;
use FSVendor\WPDesk\License\Page\LicensePage;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
use FSVendor\WPDesk\License\InstalledPlugins;
/**
* Integrates WP Desk licenses with WordPress
*
* @package WPDesk\Helper
*/
class LicenseIntegration implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
/** @var LicensePage */
private $license_page;
/** @var InstalledPlugins */
private $plugin_registry;
const PRIORITY_HELPER_UPDATE = 9999999;
const PRIORITY_AFTER_WPDESK_NEW_MENU_ADDED = 20;
public function __construct()
{
$plugin_registry = new \FSVendor\WPDesk\License\InstalledPlugins();
$this->license_page = new \FSVendor\WPDesk\License\Page\LicensePage($plugin_registry);
$this->plugin_registry = $plugin_registry;
}
/**
* @return void
*/
public function hooks()
{
$this->license_page->hooks();
$this->add_helper_updates();
$this->add_license_page();
}
/**
* @return void
*/
private function add_helper_updates()
{
// have to be in plugins_loaded because helper is loaded simultaneously with this plugin
\add_action('plugins_loaded', function () {
\add_action('plugins_loaded', [$this->plugin_registry, 'refresh_plugin_update_info'], self::PRIORITY_HELPER_UPDATE);
});
}
/**
* Replace licenses page if helper exists or add that page if helper not exists.
*
* @return void
*/
private function add_license_page()
{
\add_action('admin_menu', function () {
$this->license_page->handle_add_page_submenu_item();
}, self::PRIORITY_AFTER_WPDESK_NEW_MENU_ADDED);
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace FSVendor\WPDesk\Helper\Integration;
use FSVendor\Monolog\Logger;
use FSVendor\WPDesk\Helper\Page\SettingsPage;
use FSVendor\WPDesk\Logger\WPDeskLoggerFactory;
use FSVendor\WPDesk\Notice\Notice;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Integrates WP Desk log with WordPress
*
* @package WPDesk\Helper
*/
class LogsIntegration implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
const DEBUG_LOG_SETTING_KEY = 'debug_log';
/** @var SettingsPage */
private $settings_page;
/** @var Logger */
private $logger;
public function __construct(\FSVendor\WPDesk\Helper\Page\SettingsPage $settings_page)
{
$this->settings_page = $settings_page;
}
public function hooks()
{
\add_action('admin_init', function () {
$this->handle_page_settings_logs_section();
});
$this->wpdesk_log_init();
$this->maybe_show_logging_notice();
}
private function handle_page_settings_logs_section()
{
\add_settings_section('wpdesk_helper_debug', \__('Debug', 'wpdesk-helper'), null, $this->settings_page->get_page_name());
\add_settings_field(self::DEBUG_LOG_SETTING_KEY, \__('WP Desk Debug Log', 'wpdesk-helper'), function () {
$this->handle_render_page_settings_log_section();
}, $this->settings_page->get_page_name(), 'wpdesk_helper_debug');
}
private function handle_render_page_settings_log_section()
{
$options = $this->settings_page->get_saved_options();
if (empty($options[self::DEBUG_LOG_SETTING_KEY])) {
$options[self::DEBUG_LOG_SETTING_KEY] = '0';
}
?>
<input type="checkbox" id="wpdesk_helper_options[<?php
echo self::DEBUG_LOG_SETTING_KEY;
?>]"
name="wpdesk_helper_options[<?php
echo self::DEBUG_LOG_SETTING_KEY;
?>]"
value="1" <?php
\checked(1, $options[self::DEBUG_LOG_SETTING_KEY], \true);
?>>
<label for="wpdesk_helper_options[<?php
echo self::DEBUG_LOG_SETTING_KEY;
?>]"><?php
\_e('Enable', 'wpdesk-helper');
?></label>
<p class="description" id="admin-email-description">
<?php
echo \sprintf(\__('Writes error log to %s.', 'wpdesk-helper'), '<a target="_blank" href="' . \content_url('uploads/wpdesk-logs/wpdesk_debug.log') . '">' . \content_url('uploads/wpdesk-logs/wpdesk_debug.log') . '</a>');
?>
</p>
<?php
}
private function is_logger_active()
{
$options = $this->settings_page->get_saved_options();
return isset($options[self::DEBUG_LOG_SETTING_KEY]) && '1' === $options[self::DEBUG_LOG_SETTING_KEY];
}
private function wpdesk_log_init()
{
$logger_factory = new \FSVendor\WPDesk\Logger\WPDeskLoggerFactory();
/** support for very old FS*/
if (\property_exists($logger_factory, 'shouldLoggerBeActivated')) {
$logger_factory::$shouldLoggerBeActivated = $this->is_logger_active();
$this->logger = $logger_factory->createWPDeskLogger();
} else {
$this->logger = new \FSVendor\Monolog\Logger('fallback');
}
}
private function maybe_show_logging_notice()
{
$debug_log_enabled = $this->is_logger_active();
if ($debug_log_enabled) {
if (\apply_filters('wpdesk_helper_show_log_notices_library', \true)) {
new \FSVendor\WPDesk\Notice\Notice(\sprintf(
// Translators: link.
\__('WP Desk Debug Log is enabled. %1$sPlease disable it after testing%2$s.', 'wpdesk-helper'),
'<a href="' . \admin_url('admin.php?page=wpdesk-helper-settings') . '">',
'</a>'
), \FSVendor\WPDesk\Notice\Notice::NOTICE_TYPE_INFO);
}
}
}
public function get_logger()
{
return $this->logger;
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace FSVendor\WPDesk\Helper\Integration;
use FSVendor\WPDesk\Helper\Page\SettingsPage;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
use FSVendor\WPDesk\PluginBuilder\Plugin\HookableCollection;
use FSVendor\WPDesk\PluginBuilder\Plugin\HookableParent;
/**
* Integrates WP Desk main settings page with WordPress
*
* @package WPDesk\Helper
*/
class SettingsIntegration implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable, \FSVendor\WPDesk\PluginBuilder\Plugin\HookableCollection
{
use HookableParent;
/** @var SettingsPage */
private $settings_page;
public function __construct(\FSVendor\WPDesk\Helper\Page\SettingsPage $settingsPage)
{
$this->add_hookable($settingsPage);
}
/**
* @return void
*/
public function hooks()
{
$this->hooks_on_hookable_objects();
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace FSVendor\WPDesk\Helper\Integration;
use FSVendor\WPDesk\Helper\Page\SettingsPage;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Integrates WP Desk tracker with WordPress
*
* @package WPDesk\Helper
*/
class TrackerIntegration implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
/** @var SettingsPage */
private $settings_page;
/** @var \WPDesk_Tracker */
private $tracker;
public function __construct(\FSVendor\WPDesk\Helper\Page\SettingsPage $settings_page)
{
$this->settings_page = $settings_page;
}
public function hooks()
{
$tracker_enabled = \apply_filters('wpdesk_tracker_enabled', \true);
if ($tracker_enabled) {
\add_action('admin_init', function () {
$this->handle_page_settings_track_section();
});
$this->tracker = $this->initialize_main_tracker();
}
}
/**
* @return \WPDesk_Tracker_Interface
*/
private function initialize_main_tracker()
{
return \apply_filters('wpdesk_tracker_instance', null);
}
/**
* @return \WPDesk_Tracker_Interface
*/
public function get_tracker()
{
return $this->tracker;
}
/**
* @return void
*/
private function handle_page_settings_track_section()
{
\add_settings_section('wpdesk_helper_tracking', \__('Plugin usage tracking', 'wpdesk-helper'), null, $this->settings_page->get_page_name());
\add_settings_field('wpdesk_tracker_agree', \__('Allow WP Desk to track plugin usage', 'wpdesk-helper'), function () {
$this->handle_render_page_settings_track_section();
}, $this->settings_page->get_page_name(), 'wpdesk_helper_tracking');
}
/**
* @return void
*/
private function handle_render_page_settings_track_section()
{
$options = $this->settings_page->get_saved_options();
if (empty($options['wpdesk_tracker_agree'])) {
$options['wpdesk_tracker_agree'] = '0';
}
?>
<input type="checkbox" id="wpdesk_helper_options[wpdesk_tracker_agree]"
name="wpdesk_helper_options[wpdesk_tracker_agree]" value="1" <?php
\checked(1, $options['wpdesk_tracker_agree'], \true);
?>>
<label for="wpdesk_helper_options[wpdesk_tracker_agree]"><?php
\_e('Enable', 'wpdesk-helper');
?></label>
<p class="description" id="admin-email-description">
<?php
$terms_url = \get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/dane-uzytkowania/' : 'https://www.wpdesk.net/usage-tracking/';
\printf(\__('No sensitive data is tracked, %sread more%s.', 'wpdesk-helper'), '<a target="_blank" href="' . $terms_url . '">', '</a>');
?>
</p>
<?php
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace FSVendor\WPDesk\Helper\Logs;
use FSVendor\Monolog\Processor\ProcessorInterface;
use FSVendor\WPDesk\Helper\Debug\LibraryDebug;
/**
* Can add context with libraries to the logs
*
* @package WPDesk\Helper\Logs
*/
class LibraryInfoProcessor implements \FSVendor\Monolog\Processor\ProcessorInterface
{
/** @var LibraryDebug */
private $library_debug;
public function __construct(\FSVendor\WPDesk\Helper\Debug\LibraryDebug $library_debug)
{
$this->library_debug = $library_debug;
}
/*
* @see https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors
*/
public function __invoke(array $record)
{
try {
$files_report = $this->library_debug->get_wpdesk_vendor_files_report();
$record['extra']['library_report'] = $this->library_debug->get_libraries_report($files_report);
} catch (\Exception $e) {
$record['extra']['library_report'] = 'Exception ' . $e->getMessage();
}
return $record;
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace FSVendor\WPDesk\Helper\Page;
use FSVendor\WPDesk\Helper\Debug\LibraryDebug;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Adds library debug page to the admin panel
*
* @package WPDesk\Helper
*/
class LibraryDebugPage implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
const PRIOTITY_LONG_AFTER_ALL_IS_LOADED = 999;
/** @var LibraryDebug */
private $library_debug;
public function __construct(\FSVendor\WPDesk\Helper\Debug\LibraryDebug $library_debug)
{
$this->library_debug = $library_debug;
}
public function hooks()
{
\add_action('admin_menu', function () {
$menu_visible = $this->is_wpdesk_user();
$parent_slug = null;
if ($menu_visible) {
$parent_slug = 'wpdesk-helper';
}
\add_submenu_page($parent_slug, \__('Library report', 'wpdesk-helper'), \__('Library report', 'wpdesk-helper'), 'manage_options', 'wpdesk-helper-library-report', function () {
$this->handle_render_library_report_page();
});
}, self::PRIOTITY_LONG_AFTER_ALL_IS_LOADED);
}
/**
* @return void
*/
private function handle_render_library_report_page()
{
$vendor_files_report = $this->library_debug->get_wpdesk_vendor_files_report();
echo '<pre>';
/** @noinspection ForgottenDebugOutputInspection */
\print_r(['used_libraries' => $this->library_debug->get_libraries_report($vendor_files_report), 'used_files' => $vendor_files_report]);
echo '</pre>';
}
/**
* Checks if user from WPDesk domain is logged in
*
* @return bool
*/
private function is_wpdesk_user()
{
$userdata = \get_userdata(\get_current_user_id());
return \preg_match('/@wpdesk\\..+/', $userdata->user_email) >= 1;
}
}

View File

@@ -0,0 +1,92 @@
<?php
namespace FSVendor\WPDesk\Helper\Page;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Can render and manage license page.
*
* @package WPDesk\Helper
*/
class SettingsPage implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
const PRIORITY_AFTER_LICENSE = 25;
public function hooks()
{
\add_action('admin_init', function () {
$this->handle_register_settings();
});
\add_action('admin_menu', function () {
$this->handle_add_settings_menu();
}, self::PRIORITY_AFTER_LICENSE);
}
/**
* Register WordPress settings that can be used on settings page
*
* @return void
*/
private function handle_register_settings()
{
\register_setting($this->get_option_name(), $this->get_option_name());
}
/**
* Unique settings option id
*
* @return string
*/
public function get_option_name()
{
return 'wpdesk_helper_options';
}
/**
* @return void
*/
private function handle_add_settings_menu()
{
\add_submenu_page('wpdesk-helper', \__('Settings', 'wpdesk-helper'), \__('Settings', 'wpdesk-helper'), 'manage_options', 'wpdesk-helper-settings', function () {
$this->handle_render_wpdesk_helper_settings();
});
}
/**
* @return void
*/
private function handle_render_wpdesk_helper_settings()
{
?>
<div class="wrap">
<h1><?php
\_e('WP Desk Helper Settings', 'wpdesk-helper');
?></h1>
<form method="post" action="options.php">
<?php
\settings_fields('wpdesk_helper_options');
\do_settings_sections($this->get_page_name());
\submit_button();
?>
</form>
</div>
<?php
}
/**
* Unique page id
*
* @return string
*/
public function get_page_name()
{
return 'wpdesk_helper';
}
/**
* Options saved in settings as array
*
* @return array
*/
public function get_saved_options()
{
$options = \get_option($this->get_option_name(), []);
if (!\is_array($options)) {
$options = [];
}
return $options;
}
}

View File

@@ -0,0 +1,132 @@
<?php
namespace FSVendor\WPDesk\Helper;
use Psr\Log\LoggerInterface;
use FSVendor\WPDesk\Helper\Debug\LibraryDebug;
use FSVendor\WPDesk\Helper\Integration\LicenseIntegration;
use FSVendor\WPDesk\Helper\Integration\LogsIntegration;
use FSVendor\WPDesk\Helper\Integration\SettingsIntegration;
use FSVendor\WPDesk\Helper\Integration\TrackerIntegration;
use FSVendor\WPDesk\Helper\Logs\LibraryInfoProcessor;
use FSVendor\WPDesk\Helper\Page\LibraryDebugPage;
use FSVendor\WPDesk\Helper\Page\SettingsPage;
use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Manager all functionalities understood as helper
*
* @package WPDesk\Helper
*/
class PrefixedHelperAsLibrary implements \FSVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
const LIBRARY_TEXT_DOMAIN = 'wpdesk-helper';
const MAIN_WPDESK_MENU_POSITION = 99.99941337;
const PRIORITY_AFTER_WPDESK_MENU_REMOVAL = 15;
const PRIORITY_AFTER_ALL = 200;
/** @var LoggerInterface */
private static $logger;
/** @var \WPDesk_Tracker */
private static $tracker;
public function hooks()
{
if (\is_admin() && !$this->is_already_hooked_touch()) {
$this->initialize();
\do_action('wpdesk_helper_initialized', $this);
}
}
/**
* Check if prefixed helpers is not already hooked. Also touch flag so we know that is hooked now
*
* @return bool
*/
private function is_already_hooked_touch()
{
$is_loaded = \apply_filters('wpdesk_prefixed_helper_is_loaded', \false);
\add_filter('wpdesk_prefixed_helper_is_loaded', function () {
return \true;
});
return $is_loaded;
}
private function initialize()
{
$this->init_translations();
$this->add_wpdesk_menu();
$subscription_integration = new \FSVendor\WPDesk\Helper\Integration\LicenseIntegration();
$subscription_integration->hooks();
$settingsPage = new \FSVendor\WPDesk\Helper\Page\SettingsPage();
$settings_integration = new \FSVendor\WPDesk\Helper\Integration\SettingsIntegration($settingsPage);
$tracker_integration = new \FSVendor\WPDesk\Helper\Integration\TrackerIntegration($settingsPage);
$logger_integration = new \FSVendor\WPDesk\Helper\Integration\LogsIntegration($settingsPage);
$settings_integration->add_hookable($logger_integration);
$settings_integration->add_hookable($tracker_integration);
$settings_integration->hooks();
self::$tracker = $tracker_integration->get_tracker();
self::$logger = $logger_integration->get_logger();
$this->clean_wpdesk_menu();
$library_debug_info = new \FSVendor\WPDesk\Helper\Debug\LibraryDebug();
(new \FSVendor\WPDesk\Helper\Page\LibraryDebugPage($library_debug_info))->hooks();
self::$logger->pushProcessor(new \FSVendor\WPDesk\Helper\Logs\LibraryInfoProcessor($library_debug_info));
}
/**
* Adds text domain used in a library
*/
private function init_translations()
{
if (\function_exists('determine_locale')) {
$locale = \determine_locale();
} else {
// before WP 5.0 compatibility
$locale = \get_locale();
}
$locale = \apply_filters('plugin_locale', $locale, self::LIBRARY_TEXT_DOMAIN);
$mo_file_tracker = __DIR__ . '/../lang/' . self::LIBRARY_TEXT_DOMAIN . '-' . $locale . '.mo';
if (\file_exists($mo_file_tracker)) {
\load_textdomain(self::LIBRARY_TEXT_DOMAIN, $mo_file_tracker);
}
$tracker_domain = 'wpdesk-tracker';
$mo_file_tracker = __DIR__ . '/../lang/' . $tracker_domain . '-' . $locale . '.mo';
if (\file_exists($mo_file_tracker)) {
\load_textdomain($tracker_domain, $mo_file_tracker);
}
}
/**
* Adds WP Desk to main menu
*/
private function add_wpdesk_menu()
{
\add_action('admin_menu', function () {
$this->handle_add_wpdesk_menu();
}, self::PRIORITY_AFTER_WPDESK_MENU_REMOVAL);
}
/**
* @return void
*/
private function handle_add_wpdesk_menu()
{
\add_menu_page('WP Desk', 'WP Desk', 'manage_options', 'wpdesk-helper', function () {
}, 'dashicons-controls-play', self::MAIN_WPDESK_MENU_POSITION);
}
/**
* Removed unnecessary submenu item for WP Desk
*/
private function clean_wpdesk_menu()
{
\add_action('admin_menu', static function () {
\remove_submenu_page('wpdesk-helper', 'wpdesk-helper');
}, self::PRIORITY_AFTER_ALL);
}
/**
* @return \WPDesk_Tracker
*/
public function get_tracker()
{
return self::$tracker;
}
/**
* @return LoggerInterface
*/
public function get_logger()
{
return self::$logger;
}
}