Aim : In a game, user 1 challenges user 2 to play. (say, chess)
user 1 can receive some updates via channel user:1
from server and some updates about user 2’s game during the game duration (5 min).
What have I tried so far?
- Tried to implement my own socket via
Phoenix.Socket
and channel (below). - After I user 1 logs in → websocket connection is established on channel
user:1
- Now he challenges user 2 (from a long list of users) and send the response on channel
user:1
as"challenged",{challenged_to: 2}
where challenged is message and rest payload. Seehandle_in/3
below
What’s the confusion?
When I do Accounts.subscribe(user_id)
in handle_in/3
with the challenged_user_id , what happens?
- channel
user:1
is subscribed to PubSub topicuser:2
(is this right?) - Any update by
user:2
(when broadcasted to PubSub) will be automatically sent touser:1
with correct payload. - If both of above don’t happen. Please explain.
In cursor_channel.ex
–
defmodule ....
use MyAppWeb, :channel
.
.
.
def handle_in("challenged", payload, socket) do
%{challenged_to: challenged_to_user_id} = payload
Accounts.subscribe(challenged_to_user_id)
{:noreply, socket}
end
In accounts.ex
def subscribe(user_id) do
Phoenix.PubSub.subscribe(MyApp.PubSub, "user:#{user_id}")
end