カスタムフィードの目的
動かす仕組みが理解できたので、さて何に手を出そうと思っていたところ、別SNSで何かか起こったようでBlueskyのユーザーさんが増えて投稿量が増加。その結果、今までのカスタムフィードでは投稿量が多く用途別に細分化さえる流れになりました。
元々Blueskyのカスタムフィードそのものを検索する仕組みに乏しく、草の根活動でどうにかしていて。誰かに紹介するにも大変、作るのもあれ似たようなやつあったっけ?を探すのも大変でした。外部サイトさんでカスタムフィードのまとめを作られている方もいますが、外部サイトさんではFF14用のカテゴリを作っていただくわけにもいかない。でも、個別の案内サイトを作る規模でもない。
もしかして、フィードを紹介するフィードを作れば良いのでは?しかも自動で。ということでやりたいことは下記となりました。
- フィードを紹介する投稿からフィードを自動生成したい
- 自動生成を取り逃がした投稿も追加できるようにしたい
- このフィードへの掲載を望まない作成者の意図を汲みたい
- フィードの作成者のみが、このフィードへの追加・削除ができるようにしたい
- これらをBlueskyの仕組みだけで実現したい
アーキテクチャの検討
2はFirehoseの仕組み上、サーバー止まっている間のものを俎上処理ができないので、必須要件。これはBlueskyで最も有名なチャットBOTである「どのきのこに属するの?」の仕組みで簡単にできるはず。
チャットボット的な機能も欲しいし明らかにDBレス(Contrailsとか)では無理なので、今回は素直に公式のサンプルのアーキテクチャをそのまま流用しすればよい。
カスタムフィードを表示するところにロジックを埋めるのは厳しそうなので、素直にデータベースには諸々の処理結果のみを書き込むようにします。Firehoseは全世界の投稿、リポスト、いいね、投稿削除のイベントが飛んできます。意外とイベントを受け取るのは負荷低めなものの、それをDBに書き込むのは別の話。IO発生するし、なにより溜め込んだものを使うのも大変。絞り込んだモノを保存するようにします。

subscription.tsの「async handleEvent(evt: RepoEvent)」がPDSからイベントを受信したrelayから連携イベントを受け取った時に呼ばれるメソッド。
「ops.posts.creates」に連携された投稿そのものが入っているので、1件ずつバラして、投稿の本文から「フィードを紹介する投稿」を判別するように出来ますね。(できそうだと言っておきながら、公式のサンプルで「alf」の文字列に引っ掛けているのでそこに手を入れる)