77 lines
2.2 KiB
Elixir
77 lines
2.2 KiB
Elixir
defmodule Mobilizon.Web.Email.Follow do
|
|
@moduledoc """
|
|
Handles emails sent about (instance) follow.
|
|
"""
|
|
use Phoenix.Swoosh, view: Mobilizon.Web.EmailView
|
|
|
|
import Mobilizon.Web.Gettext
|
|
|
|
alias Mobilizon.Users
|
|
alias Mobilizon.Actors.{Actor, Follower}
|
|
alias Mobilizon.Federation.ActivityPub.Relay
|
|
alias Mobilizon.Users.User
|
|
alias Mobilizon.Web.Email
|
|
|
|
@doc """
|
|
Send follow notification to admins if the followed actor is the relay and the actor follower is an instance
|
|
"""
|
|
@spec send_notification_to_admins(Follower.t()) :: :ok
|
|
def send_notification_to_admins(
|
|
%Follower{
|
|
approved: false,
|
|
actor: %Actor{type: :Application} = follower,
|
|
target_actor: %Actor{id: target_actor_id}
|
|
} = _follow
|
|
) do
|
|
relay_actor = Relay.get_actor()
|
|
|
|
if relay_actor.id == target_actor_id do
|
|
Enum.each(Users.list_admins(), fn admin ->
|
|
send_notification_to_admin(admin, follower)
|
|
end)
|
|
end
|
|
|
|
:ok
|
|
end
|
|
|
|
def send_notification_to_admins(_), do: :ok
|
|
|
|
defp send_notification_to_admin(
|
|
%User{email: email, locale: locale},
|
|
%Actor{type: follower_type} = follower
|
|
) do
|
|
Gettext.put_locale(locale)
|
|
|
|
subject =
|
|
if follower_type == :Application do
|
|
# Mastodon instance actor has no name and an username equal to the domain
|
|
if is_nil(follower.name) and follower.preferred_username == follower.domain do
|
|
gettext(
|
|
"Instance %{domain} requests to follow your instance",
|
|
domain: follower.domain
|
|
)
|
|
else
|
|
gettext(
|
|
"Instance %{name} (%{domain}) requests to follow your instance",
|
|
name: follower.name || follower.preferred_username,
|
|
domain: follower.domain
|
|
)
|
|
end
|
|
else
|
|
gettext(
|
|
"%{name} requests to follow your instance",
|
|
name: Actor.display_name_and_username(follower)
|
|
)
|
|
end
|
|
|
|
[to: email, subject: subject]
|
|
|> Email.base_email()
|
|
|> render_body(:instance_follow, %{locale: locale, follower: follower, subject: subject})
|
|
|> Email.Mailer.send_email()
|
|
|
|
:ok
|
|
end
|
|
|
|
defp send_notification_to_admin(_, _), do: :ok
|
|
end
|