Upstream original followbot implementation
authorMark Felder <feld@FreeBSD.org>
Thu, 8 Oct 2020 16:55:35 +0000 (11:55 -0500)
committerMark Felder <feld@feld.me>
Tue, 30 Mar 2021 16:10:03 +0000 (11:10 -0500)
config/config.exs
lib/pleroma/web/activity_pub/mrf/follow_bot_policy.ex [new file with mode: 0644]

index 8d1e17b42bd44d58accaf52e24b9f742e67fcbfd..4381068ac34afa3fa488672f5716a777bbc7b427 100644 (file)
@@ -409,6 +409,8 @@ config :pleroma, :mrf_object_age,
   threshold: 604_800,
   actions: [:delist, :strip_followers]
 
+config :pleroma, :mrf_follow_bot, follower_nickname: nil
+
 config :pleroma, :rich_media,
   enabled: true,
   ignore_hosts: [],
diff --git a/lib/pleroma/web/activity_pub/mrf/follow_bot_policy.ex b/lib/pleroma/web/activity_pub/mrf/follow_bot_policy.ex
new file mode 100644 (file)
index 0000000..fb123db
--- /dev/null
@@ -0,0 +1,41 @@
+defmodule Pleroma.Web.ActivityPub.MRF.FollowBotPolicy do
+  @behaviour Pleroma.Web.ActivityPub.MRF
+  alias Pleroma.User
+  alias Pleroma.Web.CommonAPI
+  require Logger
+
+  @impl true
+  def filter(message) do
+    Task.start(fn ->
+      follower_nickname = Pleroma.Config.get([:mrf_follow_bot, :follower_nickname])
+
+      with %User{} = follower <- User.get_cached_by_nickname(follower_nickname),
+           %{"type" => "Create", "object" => %{"type" => "Note"}} <- message do
+        to = Map.get(message, "to", [])
+        cc = Map.get(message, "cc", [])
+        actor = [message["actor"]]
+
+        Enum.concat([to, cc, actor])
+        |> List.flatten()
+        |> User.get_all_by_ap_id()
+        |> Enum.each(fn user ->
+          Logger.info("Checking if #{user.nickname} can be followed")
+
+          with false <- User.following?(follower, user),
+               false <- user.locked,
+               false <- (user.bio || "") |> String.downcase() |> String.contains?("nobot") do
+            Logger.info("Following #{user.nickname}")
+            CommonAPI.follow(follower, user)
+          end
+        end)
+      end
+    end)
+
+    {:ok, message}
+  end
+
+  @impl true
+  def describe do
+    {:ok, %{}}
+  end
+end