Current Path : /home/ephorei/www/wp-content/plugins/astra-sites/inc/lib/gutenberg-templates/inc/traits/ |
Current File : /home/ephorei/www/wp-content/plugins/astra-sites/inc/lib/gutenberg-templates/inc/traits/helper.php |
<?php /** * Trait. * * @package {{package}} * @since 0.0.1 */ namespace Gutenberg_Templates\Inc\Traits; use Gutenberg_Templates\Inc\Traits\Instance; /** * Trait Instance. */ class Helper { use Instance; /** * Log * * @param string $message Log message. * @return void */ public function ast_block_templates_log( $message = '' ) { if ( self::$instance->ast_block_templates_doing_wp_cli() ) { \WP_CLI::line( $message ); } else { if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG && function_exists( 'error_log' ) && apply_filters( 'ast_block_templates_debug_logs', false ) ) { error_log( $message ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log } } } /** * Doing WP CLI * * @return bool */ public function ast_block_templates_doing_wp_cli() { if ( defined( 'WP_CLI' ) && WP_CLI ) { return true; } return false; } /** * Get an instance of WP_Filesystem_Direct. * * @since 1.0.0 * @return object A WP_Filesystem_Direct instance. */ public function ast_block_templates_get_filesystem() { global $wp_filesystem; require_once ABSPATH . '/wp-admin/includes/file.php'; WP_Filesystem(); return $wp_filesystem; } /** * Check for the valid image * * @param string $link The Image link. * * @since 1.0.0 * @return bool */ public function ast_block_templates_is_valid_image( $link = '' ) { return boolVal( preg_match( '/^((https?:\/\/)|(www\.))([a-z0-9-].?)+(:[0-9]+)?\/[\w\-]+\.(jpg|png|gif|jpeg)\/?$/i', $link ) ); } /** * Encrypt data using base64. * * @param string $input The input string which needs to be encrypted. * @since 1.0.0 * @return string The encrypted string. */ public static function encrypt( $input ) { // If the input is empty or not a string, then abandon ship. if ( empty( $input ) || ! is_string( $input ) ) { return ''; } // Encrypt the input and return it. $base_64 = base64_encode( $input ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode $encode = rtrim( $base_64, '=' ); return $encode; } /** * Decrypt data using base64. * * @param string $input The input string which needs to be decrypted. * @since 1.0.0 * @return string The decrypted string. */ public static function decrypt( $input ) { // If the input is empty or not a string, then abandon ship. if ( empty( $input ) || ! is_string( $input ) ) { return ''; } // Decrypt the input and return it. $base_64 = $input . str_repeat( '=', strlen( $input ) % 4 ); $decode = base64_decode( $base_64 ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode return $decode; } /** * Get an option from the database. * * @param string $key The option key. * @param mixed $default The option default value if option is not available. * @param boolean $network_override Whether to allow the network admin setting to be overridden on subsites. * @since 1.0.0 * @return mixed The option value. */ public static function get_admin_settings_option( $key, $default = false, $network_override = false ) { // Get the site-wide option if we're in the network admin. return $network_override && is_multisite() ? get_site_option( $key, $default ) : get_option( $key, $default ); } /** * Get the Zip AI Settings. * * If used with a key, it will return that specific setting. * If used without a key, it will return the entire settings array. * * @param string $key The setting key. * @param mixed $default The default value to return if the setting is not found. * @since 1.0.0 * @return mixed|array The setting value, or the default. */ public static function get_setting( $key = '', $default = array() ) { // Get the Zip AI settings. $existing_settings = self::get_admin_settings_option( 'zip_ai_settings' ); // If the Zip AI settings are empty, return the fallback. if ( empty( $existing_settings ) || ! is_array( $existing_settings ) ) { return $default; } // If the key is empty, return the entire settings array - otherwise return the specific setting or the fallback. if ( empty( $key ) ) { return $existing_settings; } else { return isset( $existing_settings[ $key ] ) ? $existing_settings[ $key ] : $default; } } /** * Delete an option from the database for. * * @param string $key The option key. * @param boolean $network_override Whether to allow the network admin setting to be overridden on subsites. * @since 1.0.0 * @return void */ public static function delete_admin_settings_option( $key, $network_override = false ) { // Delete the site-wide option if we're in the network admin. if ( $network_override && is_multisite() ) { delete_site_option( $key ); } else { delete_option( $key ); } } /** * This helper function returns credit details. * * @since 1.0.0 * @return array<string, integer> */ public static function get_credit_details() { // Set the default credit details. $credit_details = array( 'used' => 0, 'total' => 0, 'threshold' => array( 'medium' => defined( 'ZIP_AI_CREDIT_THRESHOLD_MEDIUM' ) ? ZIP_AI_CREDIT_THRESHOLD_MEDIUM : 65, 'high' => defined( 'ZIP_AI_CREDIT_THRESHOLD_HIGH' ) ? ZIP_AI_CREDIT_THRESHOLD_HIGH : 85, ), 'percentage' => 0, 'status' => 'success', 'free_user' => true, ); // Get the response from the endpoint. $response = self::get_credit_server_response( 'usage' ); // If the response is not an error, then update the credit details. if ( empty( $response['error'] ) && ! empty( $response['total_credits'] ) ) { $credit_details['used'] = ! empty( $response['total_used_credits'] ) ? $response['total_used_credits'] : 0; $credit_details['total'] = $response['total_credits']; $credit_details['percentage'] = intval( ( $credit_details['used'] / $credit_details['total'] ) * 100 ); $credit_details['free_user'] = $response['free_user']; } else { $credit_details['status'] = 'error'; } return $credit_details; } /** * Get the Zip AI Response from the Zip Credit Server. * * @param string $endpoint The endpoint to get the response from. * @since 1.0.0 * @return mixed The Zip AI Response. */ public static function get_credit_server_response( $endpoint ) { // If the endpoint is not a string, then abandon ship. if ( ! is_string( $endpoint ) ) { return array( 'error' => __( 'The Zip AI Endpoint was not declared', 'astra-sites' ), ); } // Get the Auth Token from the Zip AI Settings. $auth_token = self::get_decrypted_auth_token(); // If the Zip Auth Token is not set, then abandon ship. if ( empty( $auth_token ) || ! is_string( $auth_token ) ) { return array( 'error' => __( 'The Zip AI Auth Token is not set.', 'astra-sites' ), ); } $server_url = defined( 'ZIP_AI_CREDIT_SERVER_API' ) ? ZIP_AI_CREDIT_SERVER_API : 'https://credits.startertemplates.com/api/'; // Set the API URL. $api_url = $server_url . $endpoint; // Get the response from the endpoint. $response = wp_safe_remote_post( $api_url, array( 'headers' => array( 'Authorization' => 'Bearer ' . $auth_token, ), 'timeout' => 30, // phpcs:ignore WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout -- 30 seconds is required sometime for open ai responses ) ); // If the response was an error, or not a 200 status code, then abandon ship. if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { return array( 'error' => __( 'The Zip AI Middleware is not responding.', 'astra-sites' ), ); } // Get the response body. $response_body = wp_remote_retrieve_body( $response ); // If the response body is not a JSON, then abandon ship. if ( empty( $response_body ) || ! json_decode( $response_body ) ) { return array( 'error' => __( 'The Zip AI Middleware encountered an error.', 'astra-sites' ), ); } // Return the response body. return json_decode( $response_body, true ); } /** * Get the decrypted auth token. * * @since 1.0.0 * @return string The decrypted auth token. */ public static function get_decrypted_auth_token() { // Get the Zip AI Settings. $auth_token = self::get_setting( 'auth_token' ); // Return early if the auth token is not set. if ( empty( $auth_token ) || ! is_string( $auth_token ) ) { return ''; } // Return the decrypted auth token. return ! empty( trim( $auth_token ) ) ? self::decrypt( $auth_token ) : ''; } /** * Get default AI categories. * * @since 2.0.0 * * @return array<string, string> */ public function get_default_ai_categories() { return array( 'business' => 'Business', 'person' => 'Person', 'organisation' => 'Organisation', 'restaurant' => 'Restaurant', 'product' => 'Product', 'event' => 'Event', 'landing-page' => 'Landing Page', 'medical' => 'Medical', ); } /** * Is debug mode enabled * * @since 2.0.0 * @return boolean */ public function is_debug_mode() { return defined( 'GT_DEBUG' ) && GT_DEBUG; } /** * Create files/directories. * * @param array<int, array<string, string>> $files The files array. * * @return void */ public function create_files( $files = array() ) { // Install files and folders for uploading files and prevent hotlinking. foreach ( $files as $file ) { $this->create_single_file( $file ); } } /** * Create file/directories. * * @param array<string, string> $file The file array. * * @return void */ public function create_single_file( $file ) { if ( wp_mkdir_p( $file['file_base'] ) && ! file_exists( trailingslashit( $file['file_base'] ) . $file['file_name'] ) ) { $file_handle = @fopen( trailingslashit( $file['file_base'] ) . $file['file_name'], 'w' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_fopen if ( $file_handle ) { fwrite( $file_handle, $file['file_content'] ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite, WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fwrite fclose( $file_handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose self::ast_block_templates_log( 'File: ' . $file['file_name'] . ' Created Successfully!' ); } } } /** * Update files/directories. * * @param string $file_name The file path. * @param string|int $file_content The file content. * * @return void */ public function update_json_file( $file_name, $file_content ) { $file_name = $file_name . '.json'; if ( ! file_exists( AST_BLOCK_TEMPLATES_JSON_DIR . $file_name ) ) { $file_data = array( 'file_name' => $file_name, 'file_content' => '', 'file_base' => AST_BLOCK_TEMPLATES_JSON_DIR, ); $this->create_single_file( $file_data ); } if ( file_exists( AST_BLOCK_TEMPLATES_JSON_DIR . $file_name ) && file_put_contents( AST_BLOCK_TEMPLATES_JSON_DIR . $file_name, wp_json_encode( $file_content ) ) !== false ) { //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_file_put_contents self::ast_block_templates_log( 'File: ' . $file_name . ' Updated Successfully!' ); } else { self::ast_block_templates_log( 'File: ' . $file_name . ' Not Updated!' ); } } /** * Get files/directories. * * @param string $file_name The file name. * @param bool $get_array Is The file content array. * * @return mixed */ public function get_json_file_content( $file_name, $get_array = true ) { if ( file_exists( AST_BLOCK_TEMPLATES_JSON_DIR . $file_name ) ) { // Ignoring the rule as it is not a remote file. $file_content = file_get_contents( AST_BLOCK_TEMPLATES_JSON_DIR . $file_name ); //phpcs:ignore WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsUnknown if ( $get_array ) { return json_decode( (string) $file_content, true ); } else { return $file_content; } } return ''; } /** * Get block categories. * * @return array<int, array<string, string>> */ public function get_block_template_category() { return self::get_json_file_content( 'ast-block-templates-categories.json', true ); } /** * Get customiser CSS. * * @return string */ public function get_block_template_customiser_css() { return trim( self::get_json_file_content( 'ast-block-templates-customizer-css.json', false ), '"' ); } /** * Get last exported checksum. * * @return string */ public function get_last_exported_checksum() { return trim( self::get_json_file_content( 'ast-block-templates-last-export-checksums.json', false ), '"' ); } /** * Get site request count. * * @return int */ public function get_site_request() { return self::get_json_file_content( 'ast-block-templates-site-requests.json', false ); } /** * Get block request count. * * @return int */ public function get_block_templates_requests() { return self::get_json_file_content( 'ast-block-templates-block-requests.json', false ); } /** * Get blocks page wise. * * @param int $page The page number. * @return array<int, mixed> */ public function get_blocks_templates( $page = 0 ) { return self::get_json_file_content( 'ast-block-templates-blocks-' . $page . '.json', true ); } /** * Get sites page wise. * * @param int $page The page number. * @return array<int, mixed> */ public function get_sites_templates( $page = 0 ) { return self::get_json_file_content( 'ast-block-templates-sites-' . $page . '.json', true ); } }