PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.10
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.10
4.0.8 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 All 149 releases
visualizer / vendor / codeinwp / themeisle-sdk / src / Modules / Logger.php

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

281 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 add_action(
84 'admin_enqueue_scripts',
85 function() {
86 if ( ! apply_filters( 'themeisle_sdk_enable_telemetry', false ) ) {
87 return;
88 }
89
90 $this->load_telemetry();
91 },
92 PHP_INT_MAX
93 );
94
95 $action_key = $this->product->get_key() . '_log_activity';
96 if ( ! wp_next_scheduled( $action_key ) ) {
97 wp_schedule_single_event( time() + ( wp_rand( 1, 24 ) * 3600 ), $action_key );
98 }
99 add_action( $action_key, array( $this, 'send_log' ) );
100 }
101
102 /**
103 * Check if the logger is active.
104 *
105 * @return bool Is logger active?
106 */
107 private function is_logger_active() {
108 $default = 'no';
109
110 if ( ! $this->product->is_wordpress_available() ) {
111 $default = 'yes';
112 } else {
113 $pro_slug = $this->product->get_pro_slug();
114
115 if ( ! empty( $pro_slug ) ) {
116 $all_products = Loader::get_products();
117 if ( isset( $all_products[ $pro_slug ] ) ) {
118 $default = 'yes';
119 }
120 }
121 }
122
123 return ( get_option( $this->product->get_key() . '_logger_flag', $default ) === 'yes' );
124 }
125
126 /**
127 * Add notification to queue.
128 *
129 * @param array $all_notifications Previous notification.
130 *
131 * @return array All notifications.
132 */
133 public function add_notification( $all_notifications ) {
134
135 $message = apply_filters( $this->product->get_key() . '_logger_heading', Loader::$labels['logger']['notice'] );
136
137 $message = str_replace(
138 array( '{product}' ),
139 $this->product->get_friendly_name(),
140 $message
141 );
142 $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', Loader::$labels['logger']['cta_y'] );
143 $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', Loader::$labels['logger']['cta_n'] );
144
145 $all_notifications[] = [
146 'id' => $this->product->get_key() . '_logger_flag',
147 'message' => $message,
148 'ctas' => [
149 'confirm' => [
150 'link' => '#',
151 'text' => $button_submit,
152 ],
153 'cancel' => [
154 'link' => '#',
155 'text' => $button_cancel,
156 ],
157 ],
158 ];
159
160 return $all_notifications;
161 }
162
163 /**
164 * Send the statistics to the api endpoint.
165 */
166 public function send_log() {
167 $environment = array();
168 $theme = wp_get_theme();
169 $environment['theme'] = array();
170 $environment['theme']['name'] = $theme->get( 'Name' );
171 $environment['theme']['author'] = $theme->get( 'Author' );
172 $environment['theme']['parent'] = $theme->parent() !== false ? $theme->parent()->get( 'Name' ) : $theme->get( 'Name' );
173 $environment['plugins'] = get_option( 'active_plugins' );
174 global $wp_version;
175 wp_remote_post(
176 self::TRACKING_ENDPOINT,
177 array(
178 'method' => 'POST',
179 'timeout' => 3,
180 'redirection' => 5,
181 'body' => array(
182 'site' => get_site_url(),
183 'slug' => $this->product->get_slug(),
184 'version' => $this->product->get_version(),
185 'wp_version' => $wp_version,
186 'locale' => get_locale(),
187 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
188 'environment' => $environment,
189 'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
190 ),
191 )
192 );
193 }
194
195 /**
196 * Load telemetry.
197 *
198 * @return void
199 */
200 public function load_telemetry() {
201 // See which products have telemetry enabled.
202 try {
203 $products_with_telemetry = array();
204 $all_products = Loader::get_products();
205 $all_products[ $this->product->get_slug() ] = $this->product; // Add current product to the list of products to check for telemetry.
206
207 // Register telemetry params for eligible products.
208 foreach ( $all_products as $product_slug => $product ) {
209
210 // Ignore PRO products.
211 if ( false !== strstr( $product_slug, 'pro' ) ) {
212 continue;
213 }
214
215 $pro_slug = $product->get_pro_slug();
216 $logger_key = $product->get_key() . '_logger_flag';
217
218 // 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.
219 if ( ! $product->is_wordpress_available() || ( ! empty( $pro_slug ) && isset( $all_products[ $pro_slug ] ) ) ) {
220 $logger_flag = get_option( $logger_key );
221
222 if ( false === $logger_flag ) {
223 update_option( $logger_key, 'yes' );
224 }
225 }
226
227 if ( 'yes' === get_option( $product->get_key() . '_logger_flag', 'no' ) ) {
228
229 $main_slug = explode( '-', $product_slug );
230 $main_slug = $main_slug[0];
231 $track_hash = Licenser::create_license_hash( str_replace( '-', '_', ! empty( $pro_slug ) ? $pro_slug : $product_slug ) );
232
233 // Check if product was already tracked.
234 $active_telemetry = false;
235 foreach ( $products_with_telemetry as $product_with_telemetry ) {
236 if ( $product_with_telemetry['slug'] === $main_slug ) {
237 $active_telemetry = true;
238 break;
239 }
240 }
241
242 if ( $active_telemetry ) {
243 continue;
244 }
245
246 $products_with_telemetry[] = array(
247 'slug' => $main_slug,
248 'trackHash' => $track_hash ? $track_hash : 'free',
249 'consent' => true,
250 );
251 }
252 }
253
254 $products_with_telemetry = apply_filters( 'themeisle_sdk_telemetry_products', $products_with_telemetry );
255
256 if ( 0 === count( $products_with_telemetry ) ) {
257 return;
258 }
259
260 $tracking_handler = apply_filters( 'themeisle_sdk_dependency_script_handler', 'tracking' );
261 if ( ! empty( $tracking_handler ) ) {
262 do_action( 'themeisle_sdk_dependency_enqueue_script', 'tracking' );
263 wp_localize_script(
264 $tracking_handler,
265 'tiTelemetry',
266 array(
267 'products' => $products_with_telemetry,
268 'endpoint' => self::TELEMETRY_ENDPOINT,
269 )
270 );
271 }
272 } catch ( \Exception $e ) {
273 if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
274 error_log( $e->getMessage() ); // phpcs:ignore
275 }
276 } finally {
277 return;
278 }
279 }
280 }
281