PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.7
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.7
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
visualizer / vendor / codeinwp / themeisle-sdk / src / Modules / Logger.php

Logger.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.11.7, at vendor/codeinwp/themeisle-sdk/src/Modules/Logger.php

275 lines 7.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * The logger model class for ThemeIsle SDK
4 *
5 * @package ThemeIsleSDK
6 * @subpackage Modules
7 * @copyright Copyright (c) 2017, Marius Cristea
8 * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9 * @since 1.0.0
10 */
11
12 namespace ThemeisleSDK\Modules;
13
14 use ThemeisleSDK\Common\Abstract_Module;
15 use ThemeisleSDK\Loader;
16 use ThemeisleSDK\Product;
17
18 // Exit if accessed directly.
19 if ( ! defined( 'ABSPATH' ) ) {
20 exit;
21 }
22
23 /**
24 * Logger module for ThemeIsle SDK.
25 */
26 class Logger extends Abstract_Module {
27 /**
28 * Endpoint where to collect logs.
29 */
30 const TRACKING_ENDPOINT = 'https://api.themeisle.com/tracking/log';
31
32 /**
33 * Endpoint where to collect telemetry.
34 */
35 const TELEMETRY_ENDPOINT = 'https://api.themeisle.com/tracking/events';
36
37
38 /**
39 * Check if we should load the module for this product.
40 *
41 * @param Product $product Product to load the module for.
42 *
43 * @return bool Should we load ?
44 */
45 public function can_load( $product ) {
46 return apply_filters( $product->get_slug() . '_sdk_enable_logger', true );
47 }
48
49 /**
50 * Load module logic.
51 *
52 * @param Product $product Product to load.
53 *
54 * @return Logger Module object.
55 */
56 public function load( $product ) {
57 $this->product = $product;
58 $this->setup_notification();
59 $this->setup_actions();
60 return $this;
61 }
62
63 /**
64 * Setup notification on admin.
65 */
66 public function setup_notification() {
67 if ( ! $this->product->is_wordpress_available() ) {
68 return;
69 }
70
71 add_filter( 'themeisle_sdk_registered_notifications', [ $this, 'add_notification' ] );
72
73 }
74
75 /**
76 * Setup tracking actions.
77 */
78 public function setup_actions() {
79 if ( ! $this->is_logger_active() ) {
80 return;
81 }
82
83 $can_load_telemetry = apply_filters( 'themeisle_sdk_enable_telemetry', false );
84
85 if ( $can_load_telemetry ) {
86 add_action( 'admin_enqueue_scripts', array( $this, 'load_telemetry' ) );
87 }
88
89 $action_key = $this->product->get_key() . '_log_activity';
90 if ( ! wp_next_scheduled( $action_key ) ) {
91 wp_schedule_single_event( time() + ( wp_rand( 1, 24 ) * 3600 ), $action_key );
92 }
93 add_action( $action_key, array( $this, 'send_log' ) );
94 }
95
96 /**
97 * Check if the logger is active.
98 *
99 * @return bool Is logger active?
100 */
101 private function is_logger_active() {
102 $default = 'no';
103
104 if ( ! $this->product->is_wordpress_available() ) {
105 $default = 'yes';
106 } else {
107 $pro_slug = $this->product->get_pro_slug();
108
109 if ( ! empty( $pro_slug ) ) {
110 $all_products = Loader::get_products();
111 if ( isset( $all_products[ $pro_slug ] ) ) {
112 $default = 'yes';
113 }
114 }
115 }
116
117 return ( get_option( $this->product->get_key() . '_logger_flag', $default ) === 'yes' );
118 }
119
120 /**
121 * Add notification to queue.
122 *
123 * @param array $all_notifications Previous notification.
124 *
125 * @return array All notifications.
126 */
127 public function add_notification( $all_notifications ) {
128
129 $message = apply_filters( $this->product->get_key() . '_logger_heading', Loader::$labels['logger']['notice'] );
130
131 $message = str_replace(
132 array( '{product}' ),
133 $this->product->get_friendly_name(),
134 $message
135 );
136 $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', Loader::$labels['logger']['cta_y'] );
137 $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', Loader::$labels['logger']['cta_n'] );
138
139 $all_notifications[] = [
140 'id' => $this->product->get_key() . '_logger_flag',
141 'message' => $message,
142 'ctas' => [
143 'confirm' => [
144 'link' => '#',
145 'text' => $button_submit,
146 ],
147 'cancel' => [
148 'link' => '#',
149 'text' => $button_cancel,
150 ],
151 ],
152 ];
153
154 return $all_notifications;
155 }
156
157 /**
158 * Send the statistics to the api endpoint.
159 */
160 public function send_log() {
161 $environment = array();
162 $theme = wp_get_theme();
163 $environment['theme'] = array();
164 $environment['theme']['name'] = $theme->get( 'Name' );
165 $environment['theme']['author'] = $theme->get( 'Author' );
166 $environment['theme']['parent'] = $theme->parent() !== false ? $theme->parent()->get( 'Name' ) : $theme->get( 'Name' );
167 $environment['plugins'] = get_option( 'active_plugins' );
168 global $wp_version;
169 wp_remote_post(
170 self::TRACKING_ENDPOINT,
171 array(
172 'method' => 'POST',
173 'timeout' => 3,
174 'redirection' => 5,
175 'body' => array(
176 'site' => get_site_url(),
177 'slug' => $this->product->get_slug(),
178 'version' => $this->product->get_version(),
179 'wp_version' => $wp_version,
180 'locale' => get_locale(),
181 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
182 'environment' => $environment,
183 'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
184 ),
185 )
186 );
187 }
188
189 /**
190 * Load telemetry.
191 *
192 * @return void
193 */
194 public function load_telemetry() {
195 // See which products have telemetry enabled.
196 try {
197 $products_with_telemetry = array();
198 $all_products = Loader::get_products();
199 $all_products[ $this->product->get_slug() ] = $this->product; // Add current product to the list of products to check for telemetry.
200
201 // Register telemetry params for eligible products.
202 foreach ( $all_products as $product_slug => $product ) {
203
204 // Ignore PRO products.
205 if ( false !== strstr( $product_slug, 'pro' ) ) {
206 continue;
207 }
208
209 $pro_slug = $product->get_pro_slug();
210 $logger_key = $product->get_key() . '_logger_flag';
211
212 // If the product is not available in the WordPress store, or it's PRO version is installed, activate the logger if it was not initialized -- Pro users are opted in by default.
213 if ( ! $product->is_wordpress_available() || ( ! empty( $pro_slug ) && isset( $all_products[ $pro_slug ] ) ) ) {
214 $logger_flag = get_option( $logger_key );
215
216 if ( false === $logger_flag ) {
217 update_option( $logger_key, 'yes' );
218 }
219 }
220
221 if ( 'yes' === get_option( $product->get_key() . '_logger_flag', 'no' ) ) {
222
223 $main_slug = explode( '-', $product_slug );
224 $main_slug = $main_slug[0];
225 $track_hash = Licenser::create_license_hash( str_replace( '-', '_', ! empty( $pro_slug ) ? $pro_slug : $product_slug ) );
226
227 // Check if product was already tracked.
228 $active_telemetry = false;
229 foreach ( $products_with_telemetry as $product_with_telemetry ) {
230 if ( $product_with_telemetry['slug'] === $main_slug ) {
231 $active_telemetry = true;
232 break;
233 }
234 }
235
236 if ( $active_telemetry ) {
237 continue;
238 }
239
240 $products_with_telemetry[] = array(
241 'slug' => $main_slug,
242 'trackHash' => $track_hash ? $track_hash : 'free',
243 'consent' => true,
244 );
245 }
246 }
247
248 $products_with_telemetry = apply_filters( 'themeisle_sdk_telemetry_products', $products_with_telemetry );
249
250 if ( 0 === count( $products_with_telemetry ) ) {
251 return;
252 }
253
254 $tracking_handler = apply_filters( 'themeisle_sdk_dependency_script_handler', 'tracking' );
255 if ( ! empty( $tracking_handler ) ) {
256 do_action( 'themeisle_sdk_dependency_enqueue_script', 'tracking' );
257 wp_localize_script(
258 $tracking_handler,
259 'tiTelemetry',
260 array(
261 'products' => $products_with_telemetry,
262 'endpoint' => self::TELEMETRY_ENDPOINT,
263 )
264 );
265 }
266 } catch ( \Exception $e ) {
267 if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
268 error_log( $e->getMessage() ); // phpcs:ignore
269 }
270 } finally {
271 return;
272 }
273 }
274 }
275