pantasystem / Milktea

Misskey, MastodonのAndroidクライアント「Milktea」のソースコード
GNU General Public License v3.0
251 stars 22 forks source link

マストドンでもInstance Tickerを表示できるようにする #1987

Closed pantasystem closed 9 months ago

pantasystem commented 10 months ago

ノート取得時にネットワーク経由でインスタンス情報を取得する処理を実行してしまうと 時間がかかりすぎてしまうので、キャッシュ済みであればInstance Tickerを表示するようにする。 反対にキャッシュ済みでなければ、別スレッドでインスタンス取得処理を実行するようにして、 次回以降にユーザを取得したりユーザをJSONからデータベースにキャッシュするときに、 キャッシュ済みのインスタンスデータを関連づけて保持するようにする。

pantasystem commented 10 months ago

User.InstanceInfoクラス

    data class InstanceInfo(
        val faviconUrl: String?,
        val iconUrl: String?,
        val name: String?,
        val softwareName: String?,
        val softwareVersion: String?,
        val themeColor: String?,
    ) {

        val themeColorNumber: Result<Int?> by lazy {
            runCancellableCatching {
                themeColor?.let {
                    Color.parseColor(it)
                }
            }

        }
    }
pantasystem commented 10 months ago

themeColorってどうやって取得するんだ?・・・

pantasystem commented 10 months ago

ちなみにMisskeyの実装はこうなってる https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/core/entities/UserEntityService.ts#L369

pantasystem commented 10 months ago

https://github.com/misskey-dev/misskey/blob/ded328fb43adda0ca61946de1ce1e94bc8e37b1d/packages/backend/src/core/FetchInstanceMetadataService.ts#L250-L259

pantasystem commented 10 months ago

マニフェストを取得してるっぽい

pantasystem commented 10 months ago

インスタンスというかそのサーバのテーマカラーの取得方法としては htmlのヘッダー部分のmeta部分からmanifest.jsonへのURLを取得して、 manifest.jsonからテーマカラーを取得すれば良いっぽい ただこれをフロントエンド上で実行するのは問題があるか?・・・

pantasystem commented 10 months ago

CMSでインスタンスの情報を管理するようにして Cloudflare workerとかでJSONファイルに書き出して静的なファイルとしてホスティングしておくのが良いかもしれない。 フロントエンドからはWi-Fi接続時などにホスティングしておいたファイルをダウンロードしておくようなアーキテクチャが扱いやすいかも 書き出すJSONは100ずつぐらいの件数に細切れにして展開しておけばいいかも paging.jsonと各種JSONのファイルに対応するURLのマッピングを作っておくといいかも

pantasystem commented 10 months ago

この方式であれば一日に一回とかビルドを実行するようにすれば CMSをホスティングしているシステムへの負荷をある程度少なくできる

pantasystem commented 9 months ago

Cloudflare workerの無料枠で十分耐えられそうだと思ったので Cloudflare workerで実装した。 バックエンドの実装自体は完了しているのでフロントエンドを実素するだけ