Clone
defmodule PiDayWeb.GameChannel do
use PiDayWeb, :channel
alias PiDayWeb.Presence
@impl true
def join("game:hub", _payload, socket) do
send(self(), :after_join)
{:ok, socket}
end
@impl true
def handle_info(:after_join, socket) do
player = socket.assigns.player
{:ok, _} =
Presence.track(socket, player.id, %{
name: player.name,
avatar_key: player.avatar_key,
x: 400,
y: 300,
score: player.total_score,
status: "hub"
})
push(socket, "presence_state", Presence.list(socket))
{:noreply, socket}
end
@impl true
def handle_in("move", %{"x" => x, "y" => y}, socket) do
player = socket.assigns.player
Presence.update(socket, player.id, fn meta ->
%{meta | x: x, y: y}
end)
{:noreply, socket}
end
def handle_in("chat", %{"message" => message}, socket) do
player = socket.assigns.player
broadcast!(socket, "chat", %{player_id: player.id, name: player.name, message: String.slice(message, 0, 100)})
{:noreply, socket}
end
def handle_in("enter_game", %{"game" => game_type}, socket) do
player = socket.assigns.player
Presence.update(socket, player.id, fn meta ->
%{meta | status: game_type}
end)
{:noreply, socket}
end
def handle_in("leave_game", _payload, socket) do
player = socket.assigns.player
Presence.update(socket, player.id, fn meta ->
%{meta | status: "hub"}
end)
{:noreply, socket}
end
end