Project SATOSAMU
フリーランスプログラマ satosamu のホームページ

Mastodonのアカウント時限ミュート機能の実装について

2020年3月31日現在のMastodonには、指定したアカウントをミュートする(タイムライン上で表示しないようにする)機能がある。

本カスタマイズは、アカウントのミュートに対し有効となる期間を指定し、その期間経過後に自動でミュートが解除される、というもの。


具体的には、mutesテーブルに以下の2つの列を追加する。

mute_expires_at 列には、ミュートが解除される予定時刻を格納する。この列の値は単にミュートアカウント一覧上での残り時間を表示するためだけに使用する。

unmute_jid列には、ミュート解除を実行するジョブのIDを格納する。

特定のアカウントに対するミュートを解除するSidekiqワーカー DeleteMuteWorker を用意しておき、ミュート処理を実行したタイミングで、指定時間後にDeleteMuteWorker を実行するように、perform_at メソッドを実行する。

jid = DeleteMuteWorker.perform_at(duration.seconds, account.id, target_account.id)

なお、DeleteMuteWorkerが実行される前に、UI上から手動でミュート解除されるケースを考慮する必要がある。(そうしないと、有効期限付きでミュート→手動でミュート解除→再びミュートのような動作を行った場合に、予期しないタイミングでミュート解除されてしまう可能性がある。)

そのため、ミュートが手動解除されたタイミングでunmute_jid列に格納されているIDを使ってSidekiq::ScheduledSetを検索し、予定ジョブを削除する。

その他、Web UIの変更、APIの変更など、いろいろなところを細々と変更していく必要があるが、詳細については、ソースコードを参照のこと。


Mastodonを使用していると、アカウント単位で一時的に発言を非表示にしたい…というケースが時々ある。そのような場合に通常のアカウントミュートを使用してしまうと、その後の発言が一切表示されないためミュート解除のタイミングを失う恐れがある。

一方、有効期限を指定できるアカウントミュートの場合、指定時間経過後にミュートは自動で解除されるため、よりカジュアルにミュート機能を活用できる。ご興味のある方はぜひともお試しいただきたい。