Vue d’ensemble
laravel-bluesky s’intègre au système Notification de Laravel. BlueskyChannel permet d’envoyer un post classique, BlueskyPrivateChannel un message direct (DM).
Canaux disponibles
| Canal | Usage |
|---|
BlueskyChannel | Envoyer une notification sous forme de post public |
BlueskyPrivateChannel | Envoyer une notification sous forme de DM (chat privé) au destinataire |
Classe Notification
BlueskyChannel
Indiquez BlueskyChannel::class dans via() et renvoyez le contenu depuis toBluesky().
use Illuminate\Notifications\Notification;
use Revolution\Bluesky\Notifications\BlueskyChannel;
use Revolution\Bluesky\Record\Post;
use Revolution\Bluesky\RichText\TextBuilder;
use Revolution\Bluesky\Embed\External;
class TestNotification extends Notification
{
public function via(object $notifiable): array
{
return [
BlueskyChannel::class
];
}
public function toBluesky(object $notifiable): Post
{
$external = External::create(title: 'Title', description: 'test', uri: 'https://');
return Post::build(function (TextBuilder $builder) {
$builder->text('test')
->newLine()
->tag('#Laravel');
})->embed($external);
}
}
L’utilisation de Post est identique à celle décrite dans Client de base. TextBuilder, Embed, etc., s’utilisent également de la même manière.
BlueskyPrivateChannel
BlueskyPrivateMessage est quasi identique à Post, mais ne prend en charge que text, facets et embed. Pour embed, seul QuoteRecord est pris en charge.
use Illuminate\Notifications\Notification;
use Revolution\Bluesky\Notifications\BlueskyPrivateChannel;
use Revolution\Bluesky\Notifications\BlueskyPrivateMessage;
use Revolution\Bluesky\RichText\TextBuilder;
use Revolution\Bluesky\Embed\QuoteRecord;
use Revolution\Bluesky\Types\StrongRef;
class TestNotification extends Notification
{
public function via(object $notifiable): array
{
return [
BlueskyPrivateChannel::class
];
}
public function toBlueskyPrivate(object $notifiable): BlueskyPrivateMessage
{
$quote = QuoteRecord::create(StrongRef::to(uri: 'at://', cid: 'cid'));
return BlueskyPrivateMessage::build(function (TextBuilder $builder) {
$builder->text('test')
->newLine()
->tag('#Laravel');
})->embed($quote);
}
}
Notifications à la volée
Pour désigner un destinataire sans passer par un modèle, utilisez Notification::route().
BlueskyChannel
use Illuminate\Support\Facades\Notification;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
use App\Models\User;
// App password
Notification::route('bluesky', BlueskyRoute::to(identifier: config('bluesky.identifier'), password: config('bluesky.password')))
->notify(new TestNotification());
// OAuth
$user = User::find(1);
$session = OAuthSession::create([
'did' => $user->did,
'iss' => $user->iss,
'refresh_token' => $user->refresh_token,
]);
Notification::route('bluesky', BlueskyRoute::to(oauth: $session))
->notify(new TestNotification());
BlueskyPrivateChannel
Pour les DM, le receiver (DID ou handle du destinataire) est obligatoire. Le destinataire doit également avoir activé la réception des DM.
- Avec App password, la permission d’envoi de DM est nécessaire.
- Avec OAuth, la portée
transition:chat.bsky est nécessaire.
use Illuminate\Support\Facades\Notification;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
use App\Models\User;
// App password
Notification::route('bluesky-private', BlueskyRoute::to(identifier: config('bluesky.identifier'), password: config('bluesky.password'), receiver: 'did or handle'))
->notify(new TestNotification());
// OAuth
$user = User::find(1);
$session = OAuthSession::create([
'did' => $user->did,
'iss' => $user->iss,
'refresh_token' => $user->refresh_token,
]);
Notification::route('bluesky-private', BlueskyRoute::to(oauth: $session, receiver: 'did or handle'))
->notify(new TestNotification());
Bluesky ne permet pas de s’envoyer un DM à soi-même. Pour vous adresser un DM, préparez un compte distinct pour l’envoi.
// Pour vous envoyer un DM
use Illuminate\Support\Facades\Notification;
use Revolution\Bluesky\Notifications\BlueskyRoute;
Notification::route('bluesky-private', BlueskyRoute::to(identifier: 'sender identifier', password: 'sender password', receiver: 'your did or handle'))
->notify(new TestNotification());
Pour un usage personnel avec un émetteur et un destinataire toujours identiques, vous pouvez configurer via .env. Créez un compte dédié à l’envoi.
BLUESKY_SENDER_IDENTIFIER=sender did or handle
BLUESKY_SENDER_APP_PASSWORD=sender password
BLUESKY_RECEIVER=your did or handle
Notification::route('bluesky-private', BlueskyRoute::to(
identifier: config('bluesky.notification.private.sender.identifier'),
password: config('bluesky.notification.private.sender.password'),
receiver: config('bluesky.notification.private.receiver'),
))->notify(new TestNotification());
Notification à un utilisateur
Définissez le routage des notifications sur le modèle qui utilise le trait Notifiable.
BlueskyChannel
use Illuminate\Notifications\Notifiable;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
class User
{
use Notifiable;
public function routeNotificationForBluesky($notification): BlueskyRoute
{
// App password
return BlueskyRoute::to(identifier: $this->bluesky_identifier, password: $this->bluesky_password);
// OAuth
$session = OAuthSession::create([
'did' => $this->did,
'iss' => $this->iss,
'refresh_token' => $this->refresh_token,
]);
return BlueskyRoute::to(oauth: $session);
}
}
$user->notify(new TestNotification());
BlueskyPrivateChannel
use Illuminate\Notifications\Notifiable;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
class User
{
use Notifiable;
public function routeNotificationForBlueskyPrivate($notification): BlueskyRoute
{
// App password
return BlueskyRoute::to(identifier: $this->bluesky_identifier, password: $this->bluesky_password, receiver: $this->receiver);
// OAuth
$session = OAuthSession::create([
'did' => $this->did,
'iss' => $this->iss,
'refresh_token' => $this->refresh_token,
]);
return BlueskyRoute::to(oauth: $session, receiver: $this->receiver);
}
}
$user->notify(new TestNotification());
L’utilisateur peut également être son propre destinataire.
public function routeNotificationForBlueskyPrivate($notification): BlueskyRoute
{
// App password
return BlueskyRoute::to(identifier: 'sender identifier', password: 'sender password', receiver: $this->did);
}
BlueskyRoute
La méthode d’authentification (App password ou OAuth) impose des paramètres différents. L’utilisation d’arguments nommés est recommandée.
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
// App password
BlueskyRoute::to(identifier: config('bluesky.identifier'), password: config('bluesky.password'))
// OAuth
$session = OAuthSession::create([
'did' => '...',
'iss' => '...',
'refresh_token' => '...',
]);
BlueskyRoute::to(oauth: $session);
Si vous ne notifiez que votre propre compte, App password est le plus simple. Vous n’avez pas à vous soucier du renouvellement du refresh_token, il suffit de configurer .env.BLUESKY_IDENTIFIER=
BLUESKY_APP_PASSWORD=
Vérification du résultat de la notification
Comme dans Laravel classique, vous pouvez examiner la réponse post-envoi via l’événement NotificationSent.
use Illuminate\Notifications\Events\NotificationSent;
use Illuminate\Http\Client\Response;
class Listener
{
public function handle(NotificationSent $event): void
{
// $event->channel BlueskyChannel
// $event->notifiable
// $event->notification
// $event->response null|Response
}
}