id, _params, socket) do presenc-6ren">
gpt4 book ai didi

sockets - 我无法获得通过在不老长寿药, Phoenix 中的存在而加入 channel 的所有用户的列表

转载 作者:行者123 更新时间:2023-12-03 12:07:17 24 4
gpt4 key购买 nike

这是一个测验 channel ,加入后我想让所有参加所有测验的用户
测验 channel

def join("quiz:" <> id, _params, socket) do
presence = Nuton.Presence.list("quiz:" <> id)

if presence == %{} do
send(self(), {:after_join_quiz, id})

response = %{message: "you can now listen"}

{:ok, response, socket}
else
quiz = "quiz:#{id}"
%{^quiz => %{metas: metas}} = presence

if Enum.count(metas) > 1 do
{:error, %{reason: "Some other user already accepted the invitation"}}
else
send(self(), {:after_join_quiz, id})

response = %{message: "you can now listen"}
:ok = ChannelWatcher.monitor(:quiz, self(), {__MODULE__, :leave, [id]})
{:ok, response, socket}
end
end
end
def handle_info({:after_join_quiz, id}, socket) do
presence = Presence.list(socket)
if presence == %{} do
{:ok, _} =
Presence.track(socket, "quiz:" <> id, %{
user_name: socket.assigns.current_user.username,
user_id: socket.assigns.current_user.id,
quiz_id: id
})

{:noreply, socket}
else
{:ok, _} =
Presence.track(socket, "quiz:" <> id, %{
user_name: socket.assigns.current_user.username,
user_id: socket.assigns.current_user.id,
quiz_id: id
})

Core.Endpoint.broadcast(
"user:all",
"invitation:decline",
%{message: "Some other user already accepted the invitation"}
)

{:noreply, socket}
end
end
使用特定的 quiz_id,我可以获取所有加入该 channel 的用户,但是我无法做到我的代码plz中是否存在任何问题,请检查是否
Controller
quiz_users = Nuton.Presence.list("quiz:all")

最佳答案

您需要以某种方式遍历所有 channel 以获取该信息。我相信实际上有一个PR可以获取此信息,因此您可以循环浏览所有信息。
更好的方法是:如果套接字将2个 channel (例如“大厅”或“所有” channel )连接在一起,然后再连接每个单独的 channel 。跟踪时,您可以为主题指定字符串,而不仅仅是放入套接字:track(socket, "quiz:all", socket.assigns.user.id,%{})

关于sockets - 我无法获得通过在不老长寿药, Phoenix 中的存在而加入 channel 的所有用户的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65560377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com