Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

タイムライン上にフォローボタンを表示するオプションが欲しい #13769

Open
1 task
syamatsumi opened this issue Apr 29, 2024 · 7 comments
Labels
✨Feature This adds/improves/enhances a feature

Comments

@syamatsumi
Copy link

Summary

「タイムライン上にフォローボタンを表示する」
「被フォロー状態をフォローボタンに反映する」
「フォローボタンで追加ダイアログを開く」
これらのオプションが欲しい。

参考までに、Fedibirdで実装されている当該機能の切り抜きを提示します。
followbuttonoptions
followbutton

Purpose

タイムラインで見かけたノートの投稿者を現在フォローしているのかが気になった際、確認およびフォローするための手数を大きく減らせる。
スマホではアイコンホバーが有効に機能しないため、本機能によりアイコンホバー操作の代替手段を提供できる

フォローしているか否かについては、特にアカウント開設初期や、新しいユーザーが増加している最中に困りやすい。

こういう所を意識し過ぎること自体が健康的では無いのは理解できるものの、好ましいか好ましく無いかに関わらず結局気になって確認を繰り返すことで疲れることがあるので、いっそ見える状態に出来ると助かる。

Summaryで参考に挙げたFedibirdでは、リスト管理のダイアログがフォロー状態の変更画面を兼ねているため、
「フォローボタンで追加ダイアログを開く」を選択しているとリスト管理のダイアログが出るようになっています。
listwindow

Misskeyではここでアイコンホバー時のポップアップと同じモノが出てくれば良いのではないかと思っています。
これがスマホで出せない画面なので、これが出せるだけでもだいぶ違うと思うのです……
mousehober

Do you want to implement this feature yourself?

  • Yes, I will implement this by myself and send a pull request
@syamatsumi syamatsumi added the ✨Feature This adds/improves/enhances a feature label Apr 29, 2024
@samunohito
Copy link
Member

(実装を軽く調査したメモ書きです)

UserEntityServiceには既にAPIの実行者と対象ユーザの関係を調べる機能は存在するが、これはUserスキーマをUserLiteよりも詳細なもので呼び出した時にのみ返される。しかし、NoteEntityServiceでMiNoteをpack化する際はUserLiteでの呼び出しとなっており、詳細情報の取得は行われていない。

pack化時にUserDetailedを使うようにすればフォロー関係も同時に取得可能で、本件の実現も可能かと思われるが実行時の負荷が懸念…(キャッシュがあるとはいえ、追加情報をそれなりに取るので)
NoteEntityServiceのpackManyでユーザ情報をあらかじめ取得してMapで引き回せばマシになるかとは思われるが…

@Sayamame-beans
Copy link
Contributor

タイムライン上でのフォロー情報という観点では、Related: #11079, #12320

@syamatsumi
Copy link
Author

パフォーマンス上の懸念はやはり大きいのですねぇ……

@tamaina
Copy link
Member

tamaina commented Apr 30, 2024

別途users/relations APIを呼び出せばいい気もするけど、まあ毎ノートそれをやるのはちょっとという感じではある

@slofp
Copy link
Contributor

slofp commented Apr 30, 2024

別途でusers/relations を呼び出すのであれば、userEntityServiceのpack段階で行われるgetRelationの情報を元にフォロー状態を取得させて、userLiteに新たにfollowStateのようなenumを定義して追加してあげれば現状とそこまで動作的には変わらない気がしますね。

@syamatsumi
Copy link
Author

mastodon上で参考に挙げた実装を作ったのえる氏に解説して頂けたのですが、かなり重たそうな処理をしていたみたいです。
https://fedibird.com/web/statuses/112364167105554633

キャッシュに無いユーザーを見かけたらRelationshipを参照しにいく仕組みだそうで、misskey.ioのローカルや連合タイムラインだとなかなか凄いことになりそうですね……

@slofp
Copy link
Contributor

slofp commented May 1, 2024

そこら辺の負荷についてmisskey上のコードを見ていたんですが、
結論から言うと私が調べた限りでは、ユーザー取得時のRelationの参照は最終的にはすべてローカル上でのみ行われており、cacheから取ってきていなく、データベースから直接参照されています。

this.followingsRepository.exists({

なので増えるとしても取得時に毎回クエリが打たれる処理くらいだと思っています(それでもioレベル、ましては中堅でもえげつない処理だと思われ)。
※連合側のフォロー・フォロワー情報の処理はapのinbox側でいい感じに行われているっぽい感じがしたので省きました。

可能性があるとするならばcacheServiceにいい感じにfollowingsCacheが存在しているのでこれをfollowersCacheとかでいい感じに出来たりしないかなってことですかね...

this.userFollowingsCache = new RedisKVCache<Record<string, Pick<MiFollowing, 'withReplies'> | undefined>>(this.redisClient, 'userFollowings', {

(キャッシュがあるとはいえ、追加情報をそれなりに取るので)

まさにこれなんですよね

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature
Projects
Status: Triage
Development

No branches or pull requests

5 participants