From: Mark Felder <feld@FreeBSD.org>
Date: Thu, 8 Oct 2020 16:55:35 +0000 (-0500)
Subject: Upstream original followbot implementation
X-Git-Url: https://git.squeep.com/?a=commitdiff_plain;h=8b81d6222773180c9632b7b53ebe7f5ee19f4f65;p=akkoma

Upstream original followbot implementation
---

diff --git a/config/config.exs b/config/config.exs
index 8d1e17b42..4381068ac 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -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
index 000000000..fb123dbd3
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/follow_bot_policy.ex
@@ -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