Add notifications for updates in events you joined
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
9ff0eb5c4b
commit
0612c32c6e
8 changed files with 64 additions and 11 deletions
|
@ -77,6 +77,7 @@ def unread_notifications_count(%User{id: user_id}) do
|
||||||
pleroma:participation_accepted
|
pleroma:participation_accepted
|
||||||
pleroma:participation_request
|
pleroma:participation_request
|
||||||
pleroma:event_reminder
|
pleroma:event_reminder
|
||||||
|
pleroma:event_update
|
||||||
}
|
}
|
||||||
|
|
||||||
def changeset(%Notification{} = notification, attrs) do
|
def changeset(%Notification{} = notification, attrs) do
|
||||||
|
@ -407,11 +408,20 @@ def create_notifications(_, _), do: {:ok, []}
|
||||||
defp do_create_notifications(%Activity{} = activity, options) do
|
defp do_create_notifications(%Activity{} = activity, options) do
|
||||||
do_send = Keyword.get(options, :do_send, true)
|
do_send = Keyword.get(options, :do_send, true)
|
||||||
|
|
||||||
|
{enabled_participants, disabled_participants} =
|
||||||
|
get_notified_participants_from_activity(activity)
|
||||||
|
|
||||||
|
potential_participants = enabled_participants ++ disabled_participants
|
||||||
|
|
||||||
{enabled_receivers, disabled_receivers} = get_notified_from_activity(activity)
|
{enabled_receivers, disabled_receivers} = get_notified_from_activity(activity)
|
||||||
potential_receivers = enabled_receivers ++ disabled_receivers
|
|
||||||
|
potential_receivers = (enabled_receivers ++ disabled_receivers) -- potential_participants
|
||||||
|
|
||||||
{enabled_subscribers, disabled_subscribers} = get_notified_subscribers_from_activity(activity)
|
{enabled_subscribers, disabled_subscribers} = get_notified_subscribers_from_activity(activity)
|
||||||
potential_subscribers = (enabled_subscribers ++ disabled_subscribers) -- potential_receivers
|
|
||||||
|
potential_subscribers =
|
||||||
|
(enabled_subscribers ++ disabled_subscribers) --
|
||||||
|
(potential_participants ++ potential_receivers)
|
||||||
|
|
||||||
notifications =
|
notifications =
|
||||||
(Enum.map(potential_receivers, fn user ->
|
(Enum.map(potential_receivers, fn user ->
|
||||||
|
@ -421,6 +431,10 @@ defp do_create_notifications(%Activity{} = activity, options) do
|
||||||
Enum.map(potential_subscribers, fn user ->
|
Enum.map(potential_subscribers, fn user ->
|
||||||
do_send = do_send && user in enabled_subscribers
|
do_send = do_send && user in enabled_subscribers
|
||||||
create_notification(activity, user, do_send: do_send, type: "status")
|
create_notification(activity, user, do_send: do_send, type: "status")
|
||||||
|
end) ++
|
||||||
|
Enum.map(potential_participants, fn user ->
|
||||||
|
do_send = do_send && user in enabled_participants
|
||||||
|
create_notification(activity, user, do_send: do_send, type: "pleroma:event_update")
|
||||||
end))
|
end))
|
||||||
|> Enum.reject(&is_nil/1)
|
|> Enum.reject(&is_nil/1)
|
||||||
|
|
||||||
|
@ -616,6 +630,27 @@ def get_notified_subscribers_from_activity(
|
||||||
|
|
||||||
def get_notified_subscribers_from_activity(_, _), do: {[], []}
|
def get_notified_subscribers_from_activity(_, _), do: {[], []}
|
||||||
|
|
||||||
|
def get_notified_participants_from_activity(activity, local_only \\ true)
|
||||||
|
|
||||||
|
def get_notified_participants_from_activity(
|
||||||
|
%Activity{data: %{"type" => "Update"}} = activity,
|
||||||
|
local_only
|
||||||
|
) do
|
||||||
|
notification_enabled_ap_ids =
|
||||||
|
[]
|
||||||
|
|> Utils.maybe_notify_participants(activity)
|
||||||
|
|
||||||
|
potential_receivers =
|
||||||
|
User.get_users_from_set(notification_enabled_ap_ids, local_only: local_only)
|
||||||
|
|
||||||
|
notification_enabled_users =
|
||||||
|
Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end)
|
||||||
|
|
||||||
|
{notification_enabled_users, potential_receivers -- notification_enabled_users}
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_notified_participants_from_activity(_, _), do: {[], []}
|
||||||
|
|
||||||
# For some activities, only notify the author of the object
|
# For some activities, only notify the author of the object
|
||||||
def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_id}})
|
def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_id}})
|
||||||
when type in ~w{Like Announce EmojiReact} do
|
when type in ~w{Like Announce EmojiReact} do
|
||||||
|
|
|
@ -124,11 +124,6 @@ def make_update_object_data(original_data, new_data, date) do
|
||||||
original_data
|
original_data
|
||||||
|> update_content_fields(new_data)
|
|> update_content_fields(new_data)
|
||||||
|
|
||||||
IO.inspect(updated_data)
|
|
||||||
IO.inspect(updated)
|
|
||||||
IO.inspect(original_data)
|
|
||||||
IO.inspect(new_data)
|
|
||||||
|
|
||||||
if not updated do
|
if not updated do
|
||||||
updated_data
|
updated_data
|
||||||
else
|
else
|
||||||
|
|
|
@ -205,7 +205,8 @@ defp notification_type do
|
||||||
"status",
|
"status",
|
||||||
"pleroma:participation_accepted",
|
"pleroma:participation_accepted",
|
||||||
"pleroma:participation_request",
|
"pleroma:participation_request",
|
||||||
"pleroma:event_reminder"
|
"pleroma:event_reminder",
|
||||||
|
"pleroma:event_update"
|
||||||
],
|
],
|
||||||
description: """
|
description: """
|
||||||
The type of event that resulted in the notification.
|
The type of event that resulted in the notification.
|
||||||
|
@ -222,6 +223,7 @@ defp notification_type do
|
||||||
- `pleroma:report` - Someone was reported
|
- `pleroma:report` - Someone was reported
|
||||||
- `status` - Someone you are subscribed to created a status
|
- `status` - Someone you are subscribed to created a status
|
||||||
- `pleroma:event_reminder` – An event you are participating in or created is taking place soon
|
- `pleroma:event_reminder` – An event you are participating in or created is taking place soon
|
||||||
|
- `pleroma:event_update` – An event you are participating in was edited
|
||||||
- `pleroma:participation_request - Someone wants to participate in your event
|
- `pleroma:participation_request - Someone wants to participate in your event
|
||||||
- `pleroma:participation_accepted - Your event participation request was accepted
|
- `pleroma:participation_accepted - Your event participation request was accepted
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -141,7 +141,7 @@ defp event_object(draft) do
|
||||||
"mediaType" => Utils.get_content_type(draft.params[:content_type])
|
"mediaType" => Utils.get_content_type(draft.params[:content_type])
|
||||||
},
|
},
|
||||||
"generator" => draft.params[:generator],
|
"generator" => draft.params[:generator],
|
||||||
"content_type" => draft.params[:content_type],
|
"content_type" => draft.params[:content_type]
|
||||||
}
|
}
|
||||||
|
|
||||||
%__MODULE__{draft | object: object}
|
%__MODULE__{draft | object: object}
|
||||||
|
|
|
@ -424,6 +424,21 @@ def maybe_notify_followers(recipients, %Activity{data: %{"type" => "Move"}} = ac
|
||||||
|
|
||||||
def maybe_notify_followers(recipients, _), do: recipients
|
def maybe_notify_followers(recipients, _), do: recipients
|
||||||
|
|
||||||
|
def maybe_notify_participants(
|
||||||
|
recipients,
|
||||||
|
%Activity{data: %{"type" => "Update"}} = activity
|
||||||
|
) do
|
||||||
|
with %Object{data: object} <- Object.normalize(activity, fetch: false) do
|
||||||
|
participant_ids = Map.get(object, "participations", [])
|
||||||
|
|
||||||
|
recipients ++ participant_ids
|
||||||
|
else
|
||||||
|
_e -> recipients
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def maybe_notify_participants(recipients, _), do: recipients
|
||||||
|
|
||||||
def maybe_extract_mentions(%{"tag" => tag}) do
|
def maybe_extract_mentions(%{"tag" => tag}) do
|
||||||
tag
|
tag
|
||||||
|> Enum.filter(fn x -> is_map(x) && x["type"] == "Mention" end)
|
|> Enum.filter(fn x -> is_map(x) && x["type"] == "Mention" end)
|
||||||
|
|
|
@ -56,6 +56,7 @@ def index(conn, %{account_id: account_id} = params) do
|
||||||
pleroma:participation_request
|
pleroma:participation_request
|
||||||
pleroma:participation_accepted
|
pleroma:participation_accepted
|
||||||
pleroma:event_reminder
|
pleroma:event_reminder
|
||||||
|
pleroma:event_update
|
||||||
}
|
}
|
||||||
def index(%{assigns: %{user: user}} = conn, params) do
|
def index(%{assigns: %{user: user}} = conn, params) do
|
||||||
params =
|
params =
|
||||||
|
|
|
@ -113,7 +113,7 @@ def render(
|
||||||
"reblog" ->
|
"reblog" ->
|
||||||
put_status(response, parent_activity_fn.(), reading_user, status_render_opts)
|
put_status(response, parent_activity_fn.(), reading_user, status_render_opts)
|
||||||
|
|
||||||
"update" ->
|
type when type in ["update", "pleroma:event_update"] ->
|
||||||
put_status(response, parent_activity_fn.(), reading_user, status_render_opts)
|
put_status(response, parent_activity_fn.(), reading_user, status_render_opts)
|
||||||
|
|
||||||
"move" ->
|
"move" ->
|
||||||
|
|
|
@ -18,6 +18,11 @@ def up do
|
||||||
alter type notification_type add value 'pleroma:event_reminder'
|
alter type notification_type add value 'pleroma:event_reminder'
|
||||||
"""
|
"""
|
||||||
|> execute()
|
|> execute()
|
||||||
|
|
||||||
|
"""
|
||||||
|
alter type notification_type add value 'pleroma:event_update'
|
||||||
|
"""
|
||||||
|
|> execute()
|
||||||
end
|
end
|
||||||
|
|
||||||
def down do
|
def down do
|
||||||
|
@ -26,7 +31,7 @@ def down do
|
||||||
end
|
end
|
||||||
|
|
||||||
"""
|
"""
|
||||||
delete from notifications where type in ('pleroma:participation_accepted', 'pleroma:participation_request', 'pleroma:event_reminder')
|
delete from notifications where type in ('pleroma:participation_accepted', 'pleroma:participation_request', 'pleroma:event_reminder', 'pleroma:event_update')
|
||||||
"""
|
"""
|
||||||
|> execute()
|
|> execute()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue