live_beats/lib/live_beats/presence/presence_client.ex

71 lines
1.6 KiB
Elixir
Raw Normal View History

2021-12-09 05:33:29 +00:00
defmodule LiveBeats.PresenceClient do
@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
2022-01-12 17:27:30 +00:00
defp topic(%MediaLibrary.Profile{} = profile) do
"active_profiles:#{profile.user_id}"
end
2022-01-12 17:27:30 +00:00
defp local_broadcast("proxy:" <> topic, payload) do
Phoenix.PubSub.local_broadcast(@pubsub, topic, payload)
end
2021-12-09 05:33:29 +00:00
end