> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Notification-Kanal - Laravel Bluesky

> So versenden Sie Posts und DMs auf Bluesky als Laravel-Notification-Kanal.

## Überblick

`laravel-bluesky` lässt sich in das Notification-System von Laravel integrieren. Mit `BlueskyChannel` können Sie normale Posts absetzen, mit `BlueskyPrivateChannel` Direct Messages (DMs) versenden.

```mermaid theme={null}
flowchart LR
    A["Laravel Notification"] --> B{"Kanal auswählen"}
    B -->|"BlueskyChannel"| C["Normaler Bluesky-Post"]
    B -->|"BlueskyPrivateChannel"| D["Bluesky-DM senden"]
```

## Verfügbare Kanäle

| Kanal                   | Verwendung                                              |
| ----------------------- | ------------------------------------------------------- |
| `BlueskyChannel`        | Als normaler öffentlicher Post benachrichtigen          |
| `BlueskyPrivateChannel` | Als DM (privater Chat) an den Empfänger benachrichtigen |

## Notification-Klasse

### BlueskyChannel

Geben Sie in `via()` `BlueskyChannel::class` an und geben Sie in `toBluesky()` den Sendeinhalt zurück.

```php theme={null}
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);
    }
}
```

Die Verwendung von `Post` entspricht der unter [Basic client](/de/packages/laravel-bluesky/basic-client). TextBuilder, Embed usw. lassen sich gleichermaßen einsetzen.

### BlueskyPrivateChannel

`BlueskyPrivateMessage` verhält sich fast wie `Post`, unterstützt aber nur text, facets und embed. Als embed wird nur `QuoteRecord` unterstützt.

```php theme={null}
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);
    }
}
```

## On-Demand-Benachrichtigungen

Wenn Sie das Notification-Ziel ohne Modell direkt angeben möchten, verwenden Sie `Notification::route()`.

### BlueskyChannel

```php theme={null}
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

Für DMs ist die Angabe des `receiver` (DID oder Handle des Empfängers) erforderlich. Außerdem muss der Empfänger den DM-Empfang aktiviert haben.

* Bei App Password wird die Berechtigung zum Senden von DMs benötigt.
* Bei OAuth wird der Scope `transition:chat.bsky` benötigt.

```php theme={null}
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());
```

<Info>
  Auf Bluesky können Sie sich selbst keine DM senden. Wenn Sie sich selbst benachrichtigen möchten, richten Sie einen separaten Sende-Account ein.
</Info>

```php theme={null}
// Wenn Sie sich selbst eine DM senden möchten

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());
```

Für private Verwendung mit immer gleichem Sender/Empfänger können Sie die Werte in `.env` konfigurieren. Legen Sie dafür einen Account nur zum Senden an.

```dotenv theme={null}
BLUESKY_SENDER_IDENTIFIER=sender did or handle
BLUESKY_SENDER_APP_PASSWORD=sender password
BLUESKY_RECEIVER=your did or handle
```

```php theme={null}
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());
```

## Benachrichtigung an Benutzer

Definieren Sie das Notification-Routing in einem Modell, das den `Notifiable`-Trait nutzt.

### BlueskyChannel

```php theme={null}
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

```php theme={null}
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());
```

Der Benutzer selbst kann auch als Empfänger fungieren.

```php theme={null}
public function routeNotificationForBlueskyPrivate($notification): BlueskyRoute
{
    // App Password
    return BlueskyRoute::to(identifier: 'sender identifier', password: 'sender password', receiver: $this->did);
}
```

## BlueskyRoute

Je nach Authentifizierungsmethode (App Password oder OAuth) unterscheidet sich die Angabe. Verwenden Sie am besten benannte Argumente.

```php theme={null}
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);
```

<Tip>
  Wenn Sie nur an Ihren eigenen Account benachrichtigen, ist **App Password** am einfachsten. Sie müssen sich nicht um die Erneuerung des refresh\_token kümmern und benötigen nur die Einträge in `.env`.

  ```dotenv theme={null}
  BLUESKY_IDENTIFIER=
  BLUESKY_APP_PASSWORD=
  ```
</Tip>

## Ergebnis der Benachrichtigung prüfen

Wie sonst in Laravel können Sie über das Event `NotificationSent` die Antwort nach dem Versand prüfen.

```php theme={null}
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
    }
}
```

<Info>
  Source: [docs/notification.md](https://github.com/invokable/laravel-bluesky/blob/main/docs/notification.md)
</Info>


## Related topics

- [Laravel Bluesky](/de/packages/laravel-bluesky/index.md)
- [Notifications](/de/notifications.md)
- [Bot-Tutorial - Laravel Bluesky](/de/packages/laravel-bluesky/bot-tutorial.md)
- [Vergleich der Authentifizierungsmethoden - Laravel Bluesky](/de/packages/laravel-bluesky/authentication.md)
- [TextBuilder](/de/packages/laravel-bluesky/text-builder.md)
