commit: 86182ef8e445ee8a89ce2e49f33cab3dac2d2b12
parent 1926d0804ba6ade106a509c027af6bf56e6a8791
Author: Mark Felder <feld@feld.me>
Date: Fri, 19 Feb 2021 15:17:33 -0600
Change module name to FollowbotPolicy
Diffstat:
2 files changed, 65 insertions(+), 80 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/mrf/follow_bot_policy.ex b/lib/pleroma/web/activity_pub/mrf/follow_bot_policy.ex
@@ -1,80 +0,0 @@
-defmodule Pleroma.Web.ActivityPub.MRF.FollowBotPolicy do
- @behaviour Pleroma.Web.ActivityPub.MRF
- alias Pleroma.Activity.Queries
- alias Pleroma.Config
- alias Pleroma.Repo
- alias Pleroma.User
- alias Pleroma.Web.CommonAPI
- require Logger
-
- import Ecto.Query
-
- @impl true
- def filter(message) do
- with follower_nickname <- Config.get([:mrf_follow_bot, :follower_nickname]),
- %User{actor_type: "Service"} = follower <-
- User.get_cached_by_nickname(follower_nickname),
- %{"type" => "Create", "object" => %{"type" => "Note"}} <- message do
- try_follow(follower, message)
- else
- nil ->
- Logger.warn(
- "#{__MODULE__} skipped because of missing `:mrf_follow_bot, :follower_nickname` configuration, the :follower_nickname
- account does not exist, or the account is not correctly configured as a bot."
- )
-
- {:ok, message}
-
- _ ->
- {:ok, message}
- end
- end
-
- defp try_follow(follower, message) do
- Task.start(fn ->
- to = Map.get(message, "to", [])
- cc = Map.get(message, "cc", [])
- actor = [message["actor"]]
-
- Enum.concat([to, cc, actor])
- |> List.flatten()
- |> Enum.uniq()
- |> User.get_all_by_ap_id()
- |> Enum.each(fn user ->
- since_thirty_days_ago = NaiveDateTime.utc_now() |> NaiveDateTime.add(-(86_400 * 30))
-
- with false <- User.following?(follower, user),
- false <- User.locked?(user),
- false <- (user.bio || "") |> String.downcase() |> String.contains?("nobot"),
- false <- outstanding_follow_request_since?(follower, user, since_thirty_days_ago) do
- Logger.info(
- "#{__MODULE__}: Follow request from #{follower.nickname} to #{user.nickname}"
- )
-
- CommonAPI.follow(follower, user)
- end
- end)
- end)
-
- {:ok, message}
- end
-
- defp outstanding_follow_request_since?(
- %User{ap_id: follower_id},
- %User{ap_id: followee_id},
- since_datetime
- ) do
- followee_id
- |> Queries.by_object_id()
- |> Queries.by_type("Follow")
- |> where([a], a.inserted_at > ^since_datetime)
- |> where([a], fragment("? ->> 'state' != 'accept'", a.data))
- |> where([a], a.actor == ^follower_id)
- |> Repo.exists?()
- end
-
- @impl true
- def describe do
- {:ok, %{}}
- end
-end
diff --git a/lib/pleroma/web/activity_pub/mrf/followbot_policy.ex b/lib/pleroma/web/activity_pub/mrf/followbot_policy.ex
@@ -0,0 +1,65 @@
+defmodule Pleroma.Web.ActivityPub.MRF.FollowbotPolicy do
+ @behaviour Pleroma.Web.ActivityPub.MRF
+ alias Pleroma.Activity
+ alias Pleroma.Config
+ alias Pleroma.User
+ alias Pleroma.Web.CommonAPI
+
+ require Logger
+
+ @impl true
+ def filter(message) do
+ with follower_nickname <- Config.get([:mrf_follow_bot, :follower_nickname]),
+ %User{actor_type: "Service"} = follower <-
+ User.get_cached_by_nickname(follower_nickname),
+ %{"type" => "Create", "object" => %{"type" => "Note"}} <- message do
+ try_follow(follower, message)
+ else
+ nil ->
+ Logger.warn(
+ "#{__MODULE__} skipped because of missing `:mrf_follow_bot, :follower_nickname` configuration, the :follower_nickname
+ account does not exist, or the account is not correctly configured as a bot."
+ )
+
+ {:ok, message}
+
+ _ ->
+ {:ok, message}
+ end
+ end
+
+ defp try_follow(follower, message) do
+ Task.start(fn ->
+ to = Map.get(message, "to", [])
+ cc = Map.get(message, "cc", [])
+ actor = [message["actor"]]
+
+ Enum.concat([to, cc, actor])
+ |> List.flatten()
+ |> Enum.uniq()
+ |> User.get_all_by_ap_id()
+ |> Enum.each(fn user ->
+ since_thirty_days_ago = NaiveDateTime.utc_now() |> NaiveDateTime.add(-(86_400 * 30))
+
+ with false <- User.following?(follower, user),
+ false <- User.locked?(user),
+ false <- (user.bio || "") |> String.downcase() |> String.contains?("nobot"),
+ false <-
+ Activity.follow_requests_outstanding_since?(follower, user, since_thirty_days_ago) do
+ Logger.info(
+ "#{__MODULE__}: Follow request from #{follower.nickname} to #{user.nickname}"
+ )
+
+ CommonAPI.follow(follower, user)
+ end
+ end)
+ end)
+
+ {:ok, message}
+ end
+
+ @impl true
+ def describe do
+ {:ok, %{}}
+ end
+end