function test_add_get_remove() { $this->assertFalse(WebPush_DB::is_subscription('http://localhost/1')); $this->assertFalse(WebPush_DB::is_subscription('http://localhost/2')); WebPush_DB::add_subscription('http://localhost/1', 'aKey1', '89IdFKBhvi9H5LlvawK9Iw=='); $this->assertTrue(WebPush_DB::is_subscription('http://localhost/1')); $this->assertFalse(WebPush_DB::is_subscription('http://localhost/2')); WebPush_DB::add_subscription('http://localhost/2', 'aKey2', '89IdFKBhvi9H5LlvawK9Iw=='); $this->assertTrue(WebPush_DB::is_subscription('http://localhost/1')); $this->assertTrue(WebPush_DB::is_subscription('http://localhost/2')); $subscriptions = WebPush_DB::get_subscriptions(); $this->assertEquals(2, count($subscriptions)); $this->assertEquals('http://localhost/1', $subscriptions[0]->endpoint); $this->assertEquals('aKey1', $subscriptions[0]->userKey); $this->assertEquals('http://localhost/2', $subscriptions[1]->endpoint); $this->assertEquals('aKey2', $subscriptions[1]->userKey); WebPush_DB::remove_subscription('http://localhost/1'); $this->assertFalse(WebPush_DB::is_subscription('http://localhost/1')); $this->assertTrue(WebPush_DB::is_subscription('http://localhost/2')); $subscriptions = WebPush_DB::get_subscriptions(); $this->assertEquals(1, count($subscriptions)); $this->assertEquals('http://localhost/2', $subscriptions[0]->endpoint); $this->assertEquals('aKey2', $subscriptions[0]->userKey); WebPush_DB::remove_subscription('http://localhost/2'); $this->assertFalse(WebPush_DB::is_subscription('http://localhost/1')); $this->assertFalse(WebPush_DB::is_subscription('http://localhost/2')); $subscriptions = WebPush_DB::get_subscriptions(); $this->assertEquals(0, count($subscriptions)); }
public static function on_transition_post_status($new_status, $old_status, $post) { if (empty($post) || $new_status !== "publish") { return; } $title_option = get_option('webpush_title'); update_option('webpush_payload', array('title' => $title_option === 'blog_title' ? get_bloginfo('name') : $title_option, 'body' => get_the_title($post->ID), 'url' => get_permalink($post->ID))); $subscriptions = WebPush_DB::get_subscriptions(); foreach ($subscriptions as $subscription) { if (!sendNotification($subscription->endpoint)) { // If there's an error while sending the push notification, // the subscription is no longer valid, hence we remove it. WebPush_DB::remove_subscription($subscription->endpoint); } } }
public static function sendNotification($title, $body, $icon, $url, $post) { require_once plugin_dir_path(__FILE__) . 'web-push.php'; $webPush = new WebPush(); update_option('webpush_payload', array('title' => html_entity_decode($title, ENT_COMPAT, get_option('blog_charset')), 'body' => html_entity_decode($body, ENT_COMPAT, get_option('blog_charset')), 'icon' => $icon, 'url' => $url, 'postID' => $post ? $post->ID : '')); $gcmKey = get_option('webpush_gcm_key'); $webPush->setGCMKey($gcmKey); $webPush->setVAPIDInfo(get_option('webpush_vapid_key'), get_option('webpush_vapid_audience'), get_option('webpush_vapid_subject')); $notification_count = 0; // Sending notifications could take some time, so we extend the maximum // execution time for the script. set_time_limit(120); $subscriptions = WebPush_DB::get_subscriptions(); $subscription_num = count($subscriptions); foreach ($subscriptions as $subscription) { // Ignore GCM endpoints if we don't have a GCM key. $isGCM = strpos($subscription->endpoint, GCM_REQUEST_URL) === 0; if (!$gcmKey && $isGCM) { continue; } $webPush->addRecipient($subscription->endpoint, function ($success) use($subscription, &$notification_count) { if (!$success) { // If there's an error while sending the push notification, // the subscription is no longer valid, hence we remove it. WebPush_DB::remove_subscription($subscription->endpoint); } else { $notification_count++; } }); } $webPush->sendNotifications(); return $notification_count; }