2021-12-09 05:33:29 +00:00
|
|
|
defmodule LiveBeats.PresenceClient do
|
|
|
|
|
2021-12-09 07:29:00 +00:00
|
|
|
@presence LiveBeatsWeb.Presence
|
|
|
|
@pubsub LiveBeats.PubSub
|
2021-12-09 05:33:29 +00:00
|
|
|
|
2022-01-12 17:27:30 +00:00
|
|
|
alias LiveBeats.MediaLibrary
|
|
|
|
|
|
|
|
def track(%MediaLibrary.Profile{} = profile, current_user_id) do
|
2022-03-21 18:09:27 +00:00
|
|
|
@presence.track(
|
|
|
|
self(),
|
2022-01-12 17:27:30 +00:00
|
|
|
"proxy:" <> topic(profile),
|
|
|
|
current_user_id,
|
|
|
|
%{}
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def untrack(%MediaLibrary.Profile{} = profile, current_user_id) do
|
2022-03-21 18:09:27 +00:00
|
|
|
@presence.untrack(
|
|
|
|
self(),
|
2022-01-12 17:27:30 +00:00
|
|
|
"proxy:" <> topic(profile),
|
|
|
|
current_user_id
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def subscribe(%MediaLibrary.Profile{} = profile) do
|
|
|
|
Phoenix.PubSub.subscribe(@pubsub, topic(profile))
|
|
|
|
end
|
|
|
|
|
|
|
|
def list(%MediaLibrary.Profile{} = profile) do
|
|
|
|
list("proxy:" <> topic(profile))
|
|
|
|
end
|
|
|
|
|
2021-12-09 05:33:29 +00:00
|
|
|
def list(topic) do
|
|
|
|
@presence.list(topic)
|
|
|
|
end
|
|
|
|
|
|
|
|
def init(_opts) do
|
|
|
|
# user-land state
|
|
|
|
{:ok, %{}}
|
|
|
|
end
|
|
|
|
|
2022-03-21 18:09:27 +00:00
|
|
|
def handle_metas(topic, %{joins: joins, leaves: leaves}, presences, state) do
|
|
|
|
for {user_id, presence} <- joins do
|
|
|
|
user_data = %{user: presence.user, metas: Map.fetch!(presences, user_id)}
|
|
|
|
local_broadcast(topic, {LiveBeats.PresenceClient, %{user_joined: user_data}})
|
|
|
|
end
|
|
|
|
|
|
|
|
for {user_id, presence} <- leaves do
|
|
|
|
metas =
|
|
|
|
case Map.fetch(presences, user_id) do
|
|
|
|
{:ok, presence_metas} -> presence_metas
|
|
|
|
:error -> []
|
|
|
|
end
|
|
|
|
|
|
|
|
user_data = %{user: presence.user, metas: metas}
|
|
|
|
|
|
|
|
local_broadcast(topic, {LiveBeats.PresenceClient, %{user_left: user_data}})
|
|
|
|
end
|
2021-12-09 05:33:29 +00:00
|
|
|
|
|
|
|
{:ok, state}
|
|
|
|
end
|
2021-12-09 07:29:00 +00:00
|
|
|
|
2022-01-12 17:27:30 +00:00
|
|
|
defp topic(%MediaLibrary.Profile{} = profile) do
|
|
|
|
"active_profiles:#{profile.user_id}"
|
2021-12-09 07:29:00 +00:00
|
|
|
end
|
|
|
|
|
2022-01-12 17:27:30 +00:00
|
|
|
defp local_broadcast("proxy:" <> topic, payload) do
|
|
|
|
Phoenix.PubSub.local_broadcast(@pubsub, topic, payload)
|
2021-12-09 07:29:00 +00:00
|
|
|
end
|
2021-12-09 05:33:29 +00:00
|
|
|
end
|