API
1 month ago
Blocks
10 months ago
License
1 month ago
AdminNotice.php
3 weeks ago
AdminNotices.php
3 weeks ago
AjaxActions.php
3 weeks ago
Blocks.php
1 year ago
Compatibility.php
10 months ago
Learn.php
1 month ago
Menu.php
1 month ago
Migrations.php
1 year ago
NpsSurvey.php
5 months ago
Onboarding.php
3 weeks ago
Player.php
4 days ago
PluginInstaller.php
1 month ago
PreloadService.php
1 year ago
ProCompatibility.php
1 month ago
ReusableVideos.php
2 weeks ago
RewriteRulesManager.php
1 year ago
Scripts.php
2 weeks ago
Settings.php
1 month ago
Shortcodes.php
1 month ago
Streamer.php
3 weeks ago
Translation.php
3 weeks ago
Usage.php
3 weeks ago
VideoPostType.php
2 weeks ago
Player.php
92 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Player progress AJAX service. |
| 4 | * |
| 5 | * @package PrestoPlayer |
| 6 | */ |
| 7 | |
| 8 | namespace PrestoPlayer\Services; |
| 9 | |
| 10 | use PrestoPlayer\Contracts\Service; |
| 11 | |
| 12 | /** |
| 13 | * Registers the AJAX endpoints used to track player progress. |
| 14 | */ |
| 15 | class Player implements Service { |
| 16 | |
| 17 | /** |
| 18 | * Register the AJAX hooks for this service. |
| 19 | * |
| 20 | * @return void |
| 21 | */ |
| 22 | public function register() { |
| 23 | // Ajax percentage actions. |
| 24 | add_action( 'wp_ajax_presto_player_progress_percent', array( $this, 'progressAjaxPercent' ) ); |
| 25 | add_action( 'wp_ajax_nopriv_presto_player_progress_percent', array( $this, 'progressAjaxPercent' ) ); |
| 26 | |
| 27 | add_action( 'wp_ajax_nopriv_presto_refresh_progress_nonce', array( $this, 'generateNonce' ) ); |
| 28 | add_action( 'wp_ajax_presto_refresh_progress_nonce', array( $this, 'generateNonce' ) ); |
| 29 | } |
| 30 | |
| 31 | /** |
| 32 | * Send a freshly generated progress nonce as a JSON response. |
| 33 | * |
| 34 | * Scoped to progress tracking only — this endpoint is open to logged-out |
| 35 | * users, so it must not hand out a general-purpose wp_rest nonce. |
| 36 | * |
| 37 | * @return void |
| 38 | */ |
| 39 | public function generateNonce() { |
| 40 | wp_send_json_success( wp_create_nonce( 'presto_player_progress' ) ); |
| 41 | } |
| 42 | |
| 43 | /** |
| 44 | * Run ajax percent action. |
| 45 | * |
| 46 | * @return void |
| 47 | */ |
| 48 | public function progressAjaxPercent() { |
| 49 | $response = $this->progressAction(); |
| 50 | if ( is_wp_error( $response ) ) { |
| 51 | wp_send_json_error( $response->get_error_message(), $response->get_all_error_data( 'status' ) ); |
| 52 | } |
| 53 | |
| 54 | wp_send_json_success(); |
| 55 | } |
| 56 | |
| 57 | /** |
| 58 | * Run the progress action. |
| 59 | * |
| 60 | * @return bool|\WP_Error True on success, or a WP_Error describing the failure. |
| 61 | */ |
| 62 | public function progressAction() { |
| 63 | // Verify nonce. wp_rest is still accepted for pages rendered before the scoped nonce shipped. |
| 64 | $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; |
| 65 | if ( ! wp_verify_nonce( $nonce, 'presto_player_progress' ) && ! wp_verify_nonce( $nonce, 'wp_rest' ) ) { |
| 66 | return new \WP_Error( 'invalid', 'Nonce invalid', array( 'status' => 403 ) ); |
| 67 | } |
| 68 | |
| 69 | // Video id is required. |
| 70 | if ( empty( $_POST['id'] ) ) { |
| 71 | return new \WP_Error( 'invalid', 'You must provide a valid video id', array( 'status' => 400 ) ); |
| 72 | } |
| 73 | |
| 74 | // Must have a valid percentage. |
| 75 | if ( ! isset( $_POST['percent'] ) ) { |
| 76 | return new \WP_Error( 'invalid', 'You must provide a valid percentage', array( 'status' => 400 ) ); |
| 77 | } |
| 78 | |
| 79 | $id = (int) $_POST['id']; |
| 80 | $percent = (int) $_POST['percent']; |
| 81 | $visit_time = isset( $_POST['visit_time'] ) ? (int) $_POST['visit_time'] : false; |
| 82 | |
| 83 | /** |
| 84 | * Progress event, sends video id and percent progress. |
| 85 | */ |
| 86 | do_action( 'presto_player_progress', $id, $percent, $visit_time ); |
| 87 | |
| 88 | // Success. |
| 89 | return true; |
| 90 | } |
| 91 | } |
| 92 |