JQ Blog

Mastodon把握 - ③(FollowServiceの処理)

callメソッド

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def call(source_account, uri)
  target_account = ResolveRemoteAccountService.new.call(uri)

  raise ActiveRecord::RecordNotFound if target_account.nil? || target_account.id == source_account.id || target_account.suspended?
  raise Mastodon::NotPermittedError  if target_account.blocking?(source_account) || source_account.blocking?(target_account)

  return if source_account.following?(target_account)

  if target_account.locked?
    request_follow(source_account, target_account)
  else
    direct_follow(source_account, target_account)
  end
end

基本的にfollowはターゲットユーザーが非公開アカウントかどうかによって処理が変わる。非公開アカウントの設定はAccountモデルのlockedというカラムに保存するようになっている。
まずターゲットユーザーが非公開アカウントじゃない場合から見てみると、
direct_followというメソッドが呼ばれる。
direct_followメソッドにはターゲットユーザーがlocalかどうかによって処理が変わる。ここのlocalっていうのはAccountモデルのdomainカラムがnilかどうかによって判断する。
ターゲットユーザーがlocalの場合はただメール通知が行われる。localじゃない場合はPubsubhubbub::SubscribeWorkerNotificationWorkerAfterRemoteFollowWorkerクラスが呼ばれる。

Pubsubhubbub::SubscribeWorker

  • PubSubHubbubとは
  • 処理
    • SubscribeServiceを呼ぶ → ターゲットユーザーのAccountモデルに保存されているhub_urlを元にしてhubサーバーにrequestし、購読しているユーザーにみえるようにする。

NotificationWorker

  • Salmon Protocolとは
    • また来週!

AfterRemoteFollowWorker

  • Atom Protocolとは
    • また来週!
  • 処理
    • 新しくアップデートされたターゲットユーザーのlockedtrueになっている場合はfollowをキャンセルして再開FollowServiceを呼び出す。