伺か Advent Calendar 2024 SSTPとNostr

2024/12/03に公開

難しい処理は外部アプリに任せてSSTPで送ってもらおう

伺か・伺的 Advent Calendar 2024 3日の記事です。2日はろすえんさんの「推し編集環境紹介2024」でした。
Nostrの投稿を再生するゴーストを作成したのでその宣伝記事となります。

image

Narどこ?

ここです。

https://github.com/nikolat/nostalk

これ単体では何も起こりません。SSTPでNostrイベントを通知してくれる外部アプリが必要となります。
個人的にnokaがおすすめです。

https://github.com/betonetojp/noka

また、最新のnokaを自動で取得して起動するプラグインも作りました。

https://github.com/nikolat/nokauka

どうぞご利用ください。

Nostrとは?

Nostrについては以下の記事を参照してください。

https://zenn.dev/kaiji/articles/e855dccba73211

https://zenn.dev/mattn/articles/cf43423178d65c

どういうゴーストなの?

Nostrで構築されたSNSの投稿を再生します。その際に発言者のアカウントのアバターをシェルに表示します。
その昔twitalkというゴーストが存在していたのを知っている方もいらっしゃるかもしれませんが、そのNostr版と考えてよいでしょう。ただしtwitalkは自分で旧Twitterに接続し投稿を取得していましたが、nostalkはそれができません。外部SSTPからイベントが来たら再生するだけの受け身のゴーストです。

ではなぜnostalkは自力で投稿を取得しないのでしょうか?

長いので省略

NostrクライアントはWebSocketでNostrリレー(サーバー)に接続し、Nostrイベント(投稿)を取得する前提の仕組みとなっています。なのでまずWebSocketが使えなければ話になりません。伺かにはHTTPでWebに接続し情報を取得する仕組みがいくつか用意されています(ベースウェア、SHIORI、SAORI等で提供されています)が、WebSocketをサポートする実装はメジャーどころには存在しないので自分でSAORIやSHIORIを作るしかないですね。
では仮にWebSocketが使えるようになったとしましょう。次に問題となってくるのが秘密鍵/公開鍵による署名/検証、暗号化/復号、Bech32エンコード/デコードです。これらが扱えなければNostrを十分に利用することができません。これらもSHIORI/SAORIで扱えるようにする必要があるでしょう。そもそもJSONをこねくり回す必要があるので汎用プログラミング言語でなければ到底扱えるような相手ではありません。

要するに、伺かでNostrを扱うのは無理があるということです。

難しい処理は外部アプリに任せよう

伺かでできないなら外部アプリにやってもらえばいいじゃない。幸いNostrクライアントなんて無数にあります。自作も可能です。それにSSTP送信機能を付けてしまえばいいのです。
ただのデスクトップアクセサリに過ぎない伺かでは、得意分野である表示・再生に特化した使い方をして、役割分担をすればいいのです。

NostrはJavaScriptのライブラリが充実しているのでWebアプリでクライアントを作るのが楽です。SSTP over HTTPを使えばWebブラウザからも簡単にSSTPを送信できます。良い時代になりました。

もしくはネイティブアプリも良い選択肢です。冒頭で紹介したnokaはシンプルで初期設定も特にせずとも起動するだけで使えます。こちらはネイティブアプリなのでDirectSSTPが使えるため送信先に関するカスタマイズが容易であるのも強みです。

仕様を公開しよう

SSTPによる通知の仕様が固まったら、それを公開しましょう。自分以外にもその仕様に興味を持って実装してくれる人が現れるかもしれません。
UKADOCにはSSP以外のアプリが送信するイベントの(非公式)仕様がまとめられています。OnNostrに関しても既に複数の実装があります。

https://ssp.shillest.net/ukadoc/manual/list_shiori_event_ex.html#OnNostr

すぐに興味を持ってくれる人が現れなくても、後世にそういう人が現れるかもしれません。ここに載っているイベントは20年以上前に規定された仕様もあります。時代を超えてアプリケーション同士がコミュニケーションできる、それが伺かとSSTPの素晴らしさです。

終わりに

外部アプリと連携することが前提となると、外部アプリを起動するという手間が発生します。ゴーストに同梱しても良いですが、特定のゴーストに限定した使い方ではないので今回はnokaukaというプラグインを別途用意することで利便性を向上させることにしました。ケース・バイ・ケースで連携の仕方を考えると良いでしょう。

これまではゴーストで難しい機能を実現させるにはSAORIを利用するというのが一般的でしたが、ゴースト単体で完結させる必要が無い場合は、外部アプリと連携してみてはいかがでしょうか。

明日12/4はTatakinovさんが担当です。よろしくお願いします。

Discussion