openai_client = new AISEO_OpenAI_Client(); $this->scanner = new AISEO_Scanner($this->openai_client); $this->admin = new AISEO_Admin($this->scanner, $this->openai_client); add_action('admin_init', array($this, 'maybe_upgrade')); add_filter('plugin_action_links_' . plugin_basename(AISEO_AUDITOR_FILE), array($this, 'plugin_action_links')); } public static function instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } public static function activate() { self::maybe_run_activation_bootstrap(); if (false === get_option('aiseo_auditor_version', false)) { add_option('aiseo_auditor_version', AISEO_AUDITOR_VERSION); } else { update_option('aiseo_auditor_version', AISEO_AUDITOR_VERSION); } } public function maybe_upgrade() { if (get_option('aiseo_auditor_version') === AISEO_AUDITOR_VERSION) { return; } self::maybe_run_activation_bootstrap(); update_option('aiseo_auditor_version', AISEO_AUDITOR_VERSION); } private static function maybe_run_activation_bootstrap() { $license_key = self::ensure_local_license_key(); if ('' === $license_key) { return; } $requests_remaining = get_option('aiseo_requests_remaining', false); if (false === $requests_remaining || '' === trim((string) $requests_remaining)) { update_option('aiseo_requests_remaining', 5, false); } $result = self::register_first_requests($license_key); update_option('aiseo_first_requests_status', $result, false); if (!empty($result['success'])) { update_option('aiseo_first_requests_registered', '1', false); if (isset($result['requests'])) { update_option('aiseo_requests_remaining', max(0, absint($result['requests'])), false); } } } public static function sync_requests_remaining() { $license_key = self::ensure_local_license_key(); if ('' === $license_key) { return array( 'success' => false, 'requests' => max(0, absint(get_option('aiseo_requests_remaining', 0))), 'message' => 'Missing local site ID.', ); } $result = self::register_first_requests($license_key); update_option('aiseo_first_requests_status', $result, false); if (!empty($result['success']) && isset($result['requests'])) { update_option('aiseo_first_requests_registered', '1', false); update_option('aiseo_requests_remaining', max(0, absint($result['requests'])), false); } return $result; } private static function ensure_local_license_key() { $existing = trim((string) get_option('aiseo_license_key', '')); if ('' !== $existing) { return $existing; } $license_key = self::generate_numeric_license_key(); update_option('aiseo_license_key', $license_key, false); return $license_key; } private static function generate_numeric_license_key() { $digits = ''; for ($i = 0; $i < 10; $i++) { try { $digit = random_int(0 === $i ? 1 : 0, 9); } catch (Exception $exception) { $digit = wp_rand(0 === $i ? 1 : 0, 9); } $digits .= (string) $digit; } return $digits; } private static function register_first_requests($license_key) { $endpoint = defined('AISEO_AUDITOR_FIRST_REQUESTS_ENDPOINT') ? AISEO_AUDITOR_FIRST_REQUESTS_ENDPOINT : ''; $endpoint = esc_url_raw((string) apply_filters('aiseo_first_requests_endpoint', $endpoint)); $activation_key = defined('AISEO_AUDITOR_FIRST_REQUESTS_SHARED_KEY') ? (string) AISEO_AUDITOR_FIRST_REQUESTS_SHARED_KEY : ''; $activation_key = (string) apply_filters('aiseo_first_requests_shared_key', $activation_key); if ('' === $endpoint) { return array( 'success' => false, 'message' => 'First requests endpoint is not configured.', ); } $payload = array( 'domain' => self::activation_domain(), 'site_url' => home_url('/'), 'license_key' => $license_key, 'requests' => 5, 'activation_key' => $activation_key, 'plugin' => array( 'name' => defined('AISEO_AUDITOR_NAME') ? AISEO_AUDITOR_NAME : 'AiVisibility', 'version' => defined('AISEO_AUDITOR_VERSION') ? AISEO_AUDITOR_VERSION : '', ), ); $response = wp_remote_post( $endpoint, array( 'timeout' => 12, 'redirection' => 2, 'headers' => array( 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'X-AiVisibility-Activation-Key' => $activation_key, 'X-AiVisibility-Site' => home_url('/'), 'User-Agent' => (defined('AISEO_AUDITOR_NAME') ? AISEO_AUDITOR_NAME : 'AiVisibility') . '/' . (defined('AISEO_AUDITOR_VERSION') ? AISEO_AUDITOR_VERSION : '') . '; ' . home_url('/'), ), 'body' => wp_json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), ) ); if (is_wp_error($response)) { return array( 'success' => false, 'message' => $response->get_error_message(), ); } $status_code = (int) wp_remote_retrieve_response_code($response); $body = (string) wp_remote_retrieve_body($response); $decoded = json_decode($body, true); if ($status_code < 200 || $status_code >= 300 || !is_array($decoded) || empty($decoded['success'])) { return array( 'success' => false, 'status_code' => $status_code, 'message' => is_array($decoded) && isset($decoded['message']) ? (string) $decoded['message'] : substr($body, 0, 300), ); } return array( 'success' => true, 'status_code' => $status_code, 'domain' => isset($decoded['domain']) ? sanitize_text_field((string) $decoded['domain']) : self::activation_domain(), 'requests' => isset($decoded['requests']) ? absint($decoded['requests']) : 5, 'license_key' => isset($decoded['license_key']) ? sanitize_text_field((string) $decoded['license_key']) : $license_key, 'created' => !empty($decoded['created']), ); } private static function activation_domain() { $host = (string) wp_parse_url(home_url('/'), PHP_URL_HOST); $host = strtolower(trim($host)); return '' !== $host ? $host : strtolower(trim((string) home_url('/'))); } public function plugin_action_links($links) { $settings_link = sprintf( '%s', esc_url(admin_url('admin.php?page=aiseo-auditor')), esc_html__('Settings', 'aivisibility-seo-geo-agent') ); array_unshift($links, $settings_link); return $links; } public function scanner() { return $this->scanner; } public function openai_client() { return $this->openai_client; } }