おさむのひと
おさむのひと
(実装を軽く調査したメモ書きです) UserEntityServiceには既にAPIの実行者と対象ユーザの関係を調べる機能は[存在する](https://github.com/misskey-dev/misskey/blob/5c1d86b796d6ab878bc4f9bd2faf4207998e71cf/packages/backend/src/core/entities/UserEntityService.ts#L603-L614)が、これはUserスキーマをUserLiteよりも詳細なもので呼び出した時にのみ返される。しかし、NoteEntityServiceでMiNoteをpack化する際は[UserLiteでの呼び出し](https://github.com/misskey-dev/misskey/blob/7ead98cbe592e6911e4a54550cb7bb507e782d7c/packages/backend/src/core/entities/NoteEntityService.ts#L327)となっており、詳細情報の取得は行われていない。 pack化時にUserDetailedを使うようにすればフォロー関係も同時に取得可能で、本件の実現も可能かと思われるが実行時の負荷が懸念…(キャッシュがあるとはいえ、追加情報をそれなりに取るので) NoteEntityServiceのpackManyでユーザ情報をあらかじめ取得してMapで引き回せばマシになるかとは思われるが…
@syuilo この件、差し支えなければ自分がやろうと思うのですが… 実装イメージ的に以下で大丈夫そうでしょうか??(☆の部分は議論の余地あるかもと思った所) - 設定→全般→動作あたりに「リアルタイム更新を利用しない」みたいなのを作る(クライアント側でoff出来るようにする) - MkTimelineのソケット接続処理を↑で制御する - slofpさんが仰っているような通知有無を返すエンドポイントを実装 ☆1 - ノートIDを渡せばそのノートよりも新しいノートの有無を返す - TL種別を渡すことで件数取得ロジックを切り替え(HTL、LTL、STL、GTL、チャンネル、リスト、アンテナ、ユーザロールTLぶん) - 各TLの最新ノートのIDを持つキャッシュを用意し、これよりも古いIDが渡されてたら無しを返す(☆1次第で変わるかも) - 10秒に1回↑のエンドポイントを叩いて最新の有無を問い合わせる ☆2 - 新しいノートがあれば「新しいノートがあります」ボタンを出したい ☆1…ひとまず有無のみで考えていますが、件数のほうが良さそうでしょうか。 件数ありの場合、取得処理が少し複雑になるかと(FTTありのときはredisでOK、なしのときは…実装コストやばそう) ☆2…もっと間隔は長くても良さそう??
※メモ > 10秒に1回↑のエンドポイントを叩いて最新の有無を問い合わせる これに、RedisのlatestReadNotificationを見る機能を増やす `NotificationService.readAllNotification()` を叩くエンドポイントも生やしておけば既読化も出来そう。 mark-all-as-read.tsあった
@syuilo > リアクションの更新をどうするか 最新ノート取得時に、新規で取得するノートの規定数にプラスして、既に表示されているノートの最新数件(MkPaginationが持ってるdisplayLimitあたりが妥当と考えます)を取るのが良いかと思いました。新しいノートを取得しつつ、リアクションの状況、リノートやリプライなどの状態も一緒に更新できるかとおもいます。 以下のようなイメージです。 1. MkPaginationが持ってるノートの一覧をdisplayLimitの件数でトリミング 2. 1の中の一番古いノートIDをsinceIdに設定してTL取得 3. 表示更新 ・MkPagination内に既にあるノート →リノート数やリアクションなどの中身を上書きして最新化 (ノートの表示枠ごと消すのは表示がちらつくのでやらない) ・MKPagination内にあるが、2の戻り値にないノート →表示を削除 ・MkPagination内に無いノート →新しいノートとして先頭に継ぎ足す
最新ノート取得時にまとめて更新するのではなく、リアクションの鮮度のみを重要視されるのであれば… ノートIDをまとめてpostすると、以下のように`Misskey.entities.Note`の`reactions/reactionEmojis`と互換性がある形で`note_reaction`テーブル内の中身を返してくれるエンドポイントを新たに生やすのは如何でしょう?? ```txt [ { "noteId": "9m2rp5kn45mv000r", "reactionEmojis": { '[email protected]' : "https://s3.arkjp.net/misskey/ceb88abf-e2dd-4e14-b226-82dc5c21b2f7.png" }, "reactions": { ':60fpsparrot:' : 2, '🍮' : 2, ':[email protected]:' : 334 } }, { "noteId": "9m30fhprh0ym0008", "reactionEmojis":...
やるか…
今回やる予定のやつ - meta.emailだけではなくモデレータにもメールを送信 - webhookでの通知 - 通報をすぐに開けるURLの発行とフロント側のルーティング インジケータ表示も要望あったけど別途やる。 通報の有無を含めて通知表示が4種類あり、これらも含めたほうが良いかどうか検討したいので https://github.com/misskey-dev/misskey/blob/860e8bb5d84c02276dba7631b30fcf06b434e98a/packages/frontend/src/pages/admin/index.vue#L15-L18
webhookにも同様のことが言えると思うので(というかそういう話を聞いたので)、ここで追加するものはon/off切り替え可能なように実装します。
> 連携先は無限に考えられるので、必要な情報を変数として提供し、それを使ってペイロードのテンプレートを記述してもらうようなイメージで考えている これは下記の理由からやめる。ペイロードの形式は固定で。 - 脆弱性を作りこみそうで怖い - 既存のWebhook送信の仕組みを流用したい - アプリとしての責任範囲を最小にしたい(参考:GitHubやBacklogなど、大手が提供するサービスの実装の大半は固定)
(off-topic): MisskeyのWebhookをイイカンジにプロキシする外部アプリとかあれば便利かしら こういうのとか https://github.com/niri-la/misskey-discord-webhook-proxy