diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/notification.ex | 65 | ||||
| -rw-r--r-- | lib/pleroma/user/info.ex | 4 | 
2 files changed, 62 insertions, 7 deletions
| diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index cac10f24a..caa6b755e 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -122,13 +122,7 @@ defmodule Pleroma.Notification do    # TODO move to sql, too.    def create_notification(%Activity{} = activity, %User{} = user) do -    unless User.blocks?(user, %{ap_id: activity.data["actor"]}) or -             CommonAPI.thread_muted?(user, activity) or user.ap_id == activity.data["actor"] or -             (activity.data["type"] == "Follow" and -                Enum.any?(Notification.for_user(user), fn notif -> -                  notif.activity.data["type"] == "Follow" and -                    notif.activity.data["actor"] == activity.data["actor"] -                end)) do +    unless skip?(activity, user) do        notification = %Notification{user_id: user.id, activity: activity}        {:ok, notification} = Repo.insert(notification)        Pleroma.Web.Streamer.stream("user", notification) @@ -154,4 +148,61 @@ defmodule Pleroma.Notification do    end    def get_notified_from_activity(_, _local_only), do: [] + +  def skip?(activity, user) do +    [:self, :blocked, :local, :muted, :followers, :follows, :recently_followed] +    |> Enum.any?(&skip?(&1, activity, user)) +  end + +  def skip?(:self, activity, user) do +    activity.data["actor"] == user.ap_id +  end + +  def skip?(:blocked, activity, user) do +    actor = activity.data["actor"] +    User.blocks?(user, %{ap_id: actor}) +  end + +  def skip?(:local, %{local: true}, user) do +    user.info.notification_settings["local"] == false +  end + +  def skip?(:local, %{local: false}, user) do +    user.info.notification_settings["remote"] == false +  end + +  def skip?(:muted, activity, user) do +    actor = activity.data["actor"] + +    User.mutes?(user, %{ap_id: actor}) or +      CommonAPI.thread_muted?(user, activity) +  end + +  def skip?( +        :followers, +        activity, +        %{info: %{notification_settings: %{"followers" => false}}} = user +      ) do +    actor = activity.data["actor"] +    follower = User.get_cached_by_ap_id(actor) +    User.following?(follower, user) +  end + +  def skip?(:follows, activity, %{info: %{notification_settings: %{"follows" => false}}} = user) do +    actor = activity.data["actor"] +    followed = User.get_by_ap_id(actor) +    User.following?(user, followed) +  end + +  def skip?(:recently_followed, activity, user) do +    actor = activity.data["actor"] + +    Notification.for_user(user) +    |> Enum.any?(fn +      %{activity: %{data: %{"type" => "Follow", "actor" => ^actor}}} -> true +      _ -> false +    end) +  end + +  def skip?(_, _, _), do: false  end diff --git a/lib/pleroma/user/info.ex b/lib/pleroma/user/info.ex index 740a46727..c36efa126 100644 --- a/lib/pleroma/user/info.ex +++ b/lib/pleroma/user/info.ex @@ -40,6 +40,10 @@ defmodule Pleroma.User.Info do      field(:pinned_activities, {:array, :string}, default: [])      field(:flavour, :string, default: nil) +    field(:notification_settings, :map, +      default: %{"remote" => true, "local" => true, "followers" => true, "follows" => true} +    ) +      # Found in the wild      # ap_id -> Where is this used?      # bio -> Where is this used? | 
