wp-plugin-cloudflare-cache/.svn/pristine/a2/a26a5c784310e52058bcc6ca08a...

280 lines
7.5 KiB
Plaintext

<?php
/**
* The logger model class for ThemeIsle SDK
*
* @package ThemeIsleSDK
* @subpackage Modules
* @copyright Copyright (c) 2017, Marius Cristea
* @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
* @since 1.0.0
*/
namespace ThemeisleSDK\Modules;
use ThemeisleSDK\Common\Abstract_Module;
use ThemeisleSDK\Loader;
use ThemeisleSDK\Product;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Logger module for ThemeIsle SDK.
*/
class Logger extends Abstract_Module {
/**
* Endpoint where to collect logs.
*/
const TRACKING_ENDPOINT = 'https://api.themeisle.com/tracking/log';
/**
* Endpoint where to collect telemetry.
*/
const TELEMETRY_ENDPOINT = 'https://api.themeisle.com/tracking/events';
/**
* Check if we should load the module for this product.
*
* @param Product $product Product to load the module for.
*
* @return bool Should we load ?
*/
public function can_load( $product ) {
return apply_filters( $product->get_slug() . '_sdk_enable_logger', true );
}
/**
* Load module logic.
*
* @param Product $product Product to load.
*
* @return Logger Module object.
*/
public function load( $product ) {
$this->product = $product;
$this->setup_notification();
$this->setup_actions();
return $this;
}
/**
* Setup notification on admin.
*/
public function setup_notification() {
if ( ! $this->product->is_wordpress_available() ) {
return;
}
add_filter( 'themeisle_sdk_registered_notifications', [ $this, 'add_notification' ] );
}
/**
* Setup tracking actions.
*/
public function setup_actions() {
if ( ! $this->is_logger_active() ) {
return;
}
$can_load_telemetry = apply_filters( 'themeisle_sdk_enable_telemetry', false );
if ( $can_load_telemetry ) {
add_action( 'admin_enqueue_scripts', array( $this, 'load_telemetry' ) );
}
$action_key = $this->product->get_key() . '_log_activity';
if ( ! wp_next_scheduled( $action_key ) ) {
wp_schedule_single_event( time() + ( wp_rand( 1, 24 ) * 3600 ), $action_key );
}
add_action( $action_key, array( $this, 'send_log' ) );
}
/**
* Check if the logger is active.
*
* @return bool Is logger active?
*/
private function is_logger_active() {
$default = 'no';
if ( ! $this->product->is_wordpress_available() ) {
$default = 'yes';
} else {
$pro_slug = $this->product->get_pro_slug();
if ( ! empty( $pro_slug ) ) {
$all_products = Loader::get_products();
if ( isset( $all_products[ $pro_slug ] ) ) {
$default = 'yes';
}
}
}
return ( get_option( $this->product->get_key() . '_logger_flag', $default ) === 'yes' );
}
/**
* Add notification to queue.
*
* @param array $all_notifications Previous notification.
*
* @return array All notifications.
*/
public function add_notification( $all_notifications ) {
$message = apply_filters( $this->product->get_key() . '_logger_heading', 'Do you enjoy <b>{product}</b>? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.' );
$message = str_replace(
array( '{product}' ),
$this->product->get_friendly_name(),
$message
);
$button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', 'Sure, I would love to help.' );
$button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', 'No, thanks.' );
$all_notifications[] = [
'id' => $this->product->get_key() . '_logger_flag',
'message' => $message,
'ctas' => [
'confirm' => [
'link' => '#',
'text' => $button_submit,
],
'cancel' => [
'link' => '#',
'text' => $button_cancel,
],
],
];
return $all_notifications;
}
/**
* Send the statistics to the api endpoint.
*/
public function send_log() {
$environment = array();
$theme = wp_get_theme();
$environment['theme'] = array();
$environment['theme']['name'] = $theme->get( 'Name' );
$environment['theme']['author'] = $theme->get( 'Author' );
$environment['theme']['parent'] = $theme->parent() !== false ? $theme->parent()->get( 'Name' ) : $theme->get( 'Name' );
$environment['plugins'] = get_option( 'active_plugins' );
global $wp_version;
wp_remote_post(
self::TRACKING_ENDPOINT,
array(
'method' => 'POST',
'timeout' => 3,
'redirection' => 5,
'body' => array(
'site' => get_site_url(),
'slug' => $this->product->get_slug(),
'version' => $this->product->get_version(),
'wp_version' => $wp_version,
'locale' => get_locale(),
'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
'environment' => $environment,
'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
),
)
);
}
/**
* Load telemetry.
*
* @return void
*/
public function load_telemetry() {
// See which products have telemetry enabled.
try {
$products_with_telemetry = array();
$all_products = Loader::get_products();
$all_products[ $this->product->get_slug() ] = $this->product; // Add current product to the list of products to check for telemetry.
foreach ( $all_products as $product_slug => $product ) {
// Ignore pro products.
if ( false !== strstr( $product_slug, 'pro' ) ) {
continue;
}
$default = 'no';
if ( ! $product->is_wordpress_available() ) {
$default = 'yes';
} else {
$pro_slug = $product->get_pro_slug();
if ( ! empty( $pro_slug ) && isset( $all_products[ $pro_slug ] ) ) {
$default = 'yes';
}
}
if ( 'yes' === get_option( $product->get_key() . '_logger_flag', $default ) ) {
$main_slug = explode( '-', $product_slug );
$main_slug = $main_slug[0];
$pro_slug = $product->get_pro_slug();
$track_hash = Licenser::create_license_hash( str_replace( '-', '_', ! empty( $pro_slug ) ? $pro_slug : $product_slug ) );
// Check if product was already tracked.
$active_telemetry = false;
foreach ( $products_with_telemetry as &$product_with_telemetry ) {
if ( $product_with_telemetry['slug'] === $main_slug ) {
$active_telemetry = true;
break;
}
}
if ( $active_telemetry ) {
continue;
}
$products_with_telemetry[] = array(
'slug' => $main_slug,
'trackHash' => $track_hash ? $track_hash : 'free',
'consent' => true,
);
}
}
$products_with_telemetry = apply_filters( 'themeisle_sdk_telemetry_products', $products_with_telemetry );
if ( 0 === count( $products_with_telemetry ) ) {
return;
}
$tracking_handler = apply_filters( 'themeisle_sdk_dependency_script_handler', 'tracking' );
if ( ! empty( $tracking_handler ) ) {
do_action( 'themeisle_sdk_dependency_enqueue_script', 'tracking' );
wp_localize_script(
$tracking_handler,
'tiTelemetry',
array(
'products' => $products_with_telemetry,
'endpoint' => self::TELEMETRY_ENDPOINT,
)
);
}
} catch ( \Exception $e ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
error_log( $e->getMessage() ); // phpcs:ignore
}
} catch ( \Error $e ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
error_log( $e->getMessage() ); // phpcs:ignore
}
} finally {
return;
}
}
}