. * */ namespace Friendica\Worker; use Friendica\Core\Logger; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; use Friendica\Model\Subscription as ModelSubscription; use Friendica\Util\DateTimeFormat; use Minishlink\WebPush\WebPush; use Minishlink\WebPush\Subscription; class PushSubscription { public static function execute(int $sid, int $nid) { $subscription = DBA::selectFirst('subscription', [], ['id' => $sid]); $notification = DBA::selectFirst('notification', [], ['id' => $nid]); if (!empty($notification['uri-id'])) { $notify = DBA::selectFirst('notify', ['msg'], ['uri-id' => $notification['target-uri-id']]); } if (!empty($notification['actor-id'])) { $actor = Contact::getById($notification['actor-id']); } $push = [ 'subscription' => Subscription::create([ 'endpoint' => $subscription['endpoint'], 'publicKey' => $subscription['pubkey'], 'authToken' => $subscription['secret'], ]), // @todo Check if we are supposed to transmit a payload at all 'payload' => json_encode([ 'title' => 'Friendica', 'body' => $notify['msg'] ?? '', 'icon' => $actor['thumb'] ?? '', 'image' => '', 'badge' => DI::baseUrl()->get() . '/images/friendica-192.png', 'tag' => $notification['parent-uri-id'] ?? '', 'timestamp' => DateTimeFormat::utc($notification['created'], DateTimeFormat::JSON), ]), ]; $auth = [ 'VAPID' => [ 'subject' => DI::baseUrl()->getHostname(), 'publicKey' => ModelSubscription::getPublicVapidKey(), 'privateKey' => ModelSubscription::getPrivateVapidKey(), ], ]; $webPush = new WebPush($auth); $report = $webPush->sendOneNotification( $push['subscription'], $push['payload'] ); $endpoint = $report->getRequest()->getUri()->__toString(); if ($report->isSuccess()) { Logger::info('Message sent successfully for subscription', ['endpoint' => $endpoint]); } else { Logger::info('Message failed to sent for subscription', ['endpoint' => $endpoint, 'reason' => $report->getReason()]); } } }