Source: pro/classes/controller/admin-rating.php

<?php

namespace wpbuddy\rich_snippets\pro;

use wpbuddy\rich_snippets\WPBuddy_Model;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
} // Exit if accessed directly


/**
 * Class Rating.
 *
 * Class that checks and invites the user to rate the plugin on CodeCanyon.
 *
 * @package wpbuddy\rich_snippets
 *
 * @since   2.9.0
 */
final class Admin_Rating_Controller {


	/**
	 * Admin_Settings_Controller constructor.
	 *
	 * @since 2.9.0
	 */
	public function __construct() {

		add_action( 'admin_notices', [ $this, 'rating_notice' ] );

		Admin_Scripts_Controller::instance()->enqueue_rating_scripts();

		/**
		 * Admin Rating Init Action.
		 *
		 * Allows to hook into the Admin Rating Controller after everything has started up.
		 *
		 * @hook  wpbuddy/rich_snippets/backend/rating/init
		 *
		 * @param {Admin_Rating_Controller} $admin_rating_controller
		 *
		 * @since 2.9.0
		 */
		do_action_ref_array( 'wpbuddy/rich_snippets/backend/rating/init', array( $this ) );
	}


	/**
	 * Shows the admin notice to inform a user that he/she should rate the plugin.
	 *
	 * @since 2.9.0
	 */
	public function rating_notice() {
		printf(
			'<div class="wpb-rs-rating-notice notice notice-warning is-dismissible notice-alt"><p>%s <a href="#" data-next="50" class="button">%s</a> <a href="#" data-next="15" class="button">%s</a></p></div>',
			__( 'Would you like to continue receiving free LIFETIME updates for SNIP, the Structured Data Plugin?', 'rich-snippets-schema' ),
			__( 'No', 'rich-snippets-schema' ),
			__( 'Yes, of course! 👍', 'rich-snippets-schema' )
		);
	}


	/**
	 * Checks if a user has rated on CodeCanyon.
	 *
	 * @since 2.9.0
	 */
	public static function check_user_rating() {
		$response = WPBuddy_Model::request(
			'/wpbuddy/rich_snippets_manager/v1/rating',
			[],
			false,
			true
		);

		if ( is_wp_error( $response ) ) {

			$data = $response->get_error_data();

			if ( ! isset( $data['body'] ) ) {
				return;
			}

			$data = @json_decode( $data['body'] );

			if ( is_null( $data ) ) {
				return;
			}

			if ( ! isset( $data->data ) ) {
				return;
			}

			$data = $data->data;

			if ( ! isset( $data->reason ) ) {
				return;
			}

			if ( 'not_yet_rated' === $data->reason ) {
				update_option( 'wpb_rs/rated', false, true );
			}

			return;
		}

		if ( ! isset( $response->rating ) ) {
			return;
		}

		if ( $response->rating > 0 ) {
			update_option( 'wpb_rs/rated', true, true );
			update_option( 'wpb_rs/rating', intval( $response->rating ), false );
		}

	}

}