projects
/
akkoma
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add Twitter API for the pinned statuses
[akkoma]
/
lib
/
pleroma
/
web
/
push
/
push.ex
diff --git
a/lib/pleroma/web/push/push.ex
b/lib/pleroma/web/push/push.ex
index 4af3e159afabbff05e90c1267e195caf551862fe..ffd2aac91ad1097de63be3c229eb94a72f1e3028 100644
(file)
--- a/
lib/pleroma/web/push/push.ex
+++ b/
lib/pleroma/web/push/push.ex
@@
-1,3
+1,7
@@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.Push do
use GenServer
defmodule Pleroma.Web.Push do
use GenServer
@@
-9,32
+13,44
@@
defmodule Pleroma.Web.Push do
@types ["Create", "Follow", "Announce", "Like"]
@types ["Create", "Follow", "Announce", "Like"]
- @gcm_api_key nil
-
def start_link() do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
def start_link() do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
- def init(:ok) do
- case Application.get_env(:web_push_encryption, :vapid_details) do
- nil ->
- Logger.warn(
- "VAPID key pair is not found. Please, add VAPID configuration to config. Run `mix web_push.gen.keypair` mix task to create a key pair"
- )
-
- :ignore
+ def vapid_config() do
+ Application.get_env(:web_push_encryption, :vapid_details, [])
+ end
- _ ->
- {:ok, %{}}
+ def enabled() do
+ case vapid_config() do
+ [] -> false
+ list when is_list(list) -> true
+ _ -> false
end
end
def send(notification) do
end
end
def send(notification) do
- if
Application.get_env(:web_push_encryption, :vapid_details
) do
+ if
enabled(
) do
GenServer.cast(Pleroma.Web.Push, {:send, notification})
end
end
GenServer.cast(Pleroma.Web.Push, {:send, notification})
end
end
+ def init(:ok) do
+ if !enabled() do
+ Logger.warn("""
+ VAPID key pair is not found. If you wish to enabled web push, please run
+
+ mix web_push.gen.keypair
+
+ and add the resulting output to your configuration file.
+ """)
+
+ :ignore
+ else
+ {:ok, nil}
+ end
+ end
+
def handle_cast(
{:send, %{activity: %{data: %{"type" => type}}, user_id: user_id} = notification},
state
def handle_cast(
{:send, %{activity: %{data: %{"type" => type}}, user_id: user_id} = notification},
state
@@
-42,44
+58,54
@@
defmodule Pleroma.Web.Push do
when type in @types do
actor = User.get_cached_by_ap_id(notification.activity.data["actor"])
when type in @types do
actor = User.get_cached_by_ap_id(notification.activity.data["actor"])
+ type = Pleroma.Activity.mastodon_notification_type(notification.activity)
+
Subscription
|> where(user_id: ^user_id)
|> preload(:token)
|> Repo.all()
Subscription
|> where(user_id: ^user_id)
|> preload(:token)
|> Repo.all()
- |> Enum.each(fn record ->
- subscription = %{
+ |> Enum.filter(fn subscription ->
+ get_in(subscription.data, ["alerts", type]) || false
+ end)
+ |> Enum.each(fn subscription ->
+ sub = %{
keys: %{
keys: %{
- p256dh:
record
.key_p256dh,
- auth:
record
.key_auth
+ p256dh:
subscription
.key_p256dh,
+ auth:
subscription
.key_auth
},
},
- endpoint:
record
.endpoint
+ endpoint:
subscription
.endpoint
}
body =
Jason.encode!(%{
title: format_title(notification),
}
body =
Jason.encode!(%{
title: format_title(notification),
+ access_token: subscription.token.token,
body: format_body(notification, actor),
notification_id: notification.id,
body: format_body(notification, actor),
notification_id: notification.id,
+ notification_type: type,
icon: User.avatar_url(actor),
icon: User.avatar_url(actor),
- preferred_locale: "en",
- access_token: record.token.token
+ preferred_locale: "en"
})
})
- case WebPushEncryption.send_web_push(body, subscription, @gcm_api_key) do
+ case WebPushEncryption.send_web_push(
+ body,
+ sub,
+ Application.get_env(:web_push_encryption, :gcm_api_key)
+ ) do
{:ok, %{status_code: code}} when 400 <= code and code < 500 ->
Logger.debug("Removing subscription record")
{:ok, %{status_code: code}} when 400 <= code and code < 500 ->
Logger.debug("Removing subscription record")
- Repo.delete!(
record
)
+ Repo.delete!(
subscription
)
:ok
{:ok, %{status_code: code}} when 200 <= code and code < 300 ->
:ok
{:ok, %{status_code: code}} ->
:ok
{:ok, %{status_code: code}} when 200 <= code and code < 300 ->
:ok
{:ok, %{status_code: code}} ->
- Logger.error("Web Push No
n
ification failed with code: #{code}")
+ Logger.error("Web Push No
t
ification failed with code: #{code}")
:error
_ ->
:error
_ ->
- Logger.error("Web Push No
n
ification failed with unknown error")
+ Logger.error("Web Push No
t
ification failed with unknown error")
:error
end
end)
:error
end
end)
@@
-103,7
+129,7
@@
defmodule Pleroma.Web.Push do
defp format_body(%{activity: %{data: %{"type" => type}}}, actor) do
case type do
defp format_body(%{activity: %{data: %{"type" => type}}}, actor) do
case type do
- "Create" -> "@#{actor.nickname} has mentiond you"
+ "Create" -> "@#{actor.nickname} has mention
e
d you"
"Follow" -> "@#{actor.nickname} has followed you"
"Announce" -> "@#{actor.nickname} has repeated your post"
"Like" -> "@#{actor.nickname} has favorited your post"
"Follow" -> "@#{actor.nickname} has followed you"
"Announce" -> "@#{actor.nickname} has repeated your post"
"Like" -> "@#{actor.nickname} has favorited your post"