-
Notifications
You must be signed in to change notification settings - Fork 6
/
room_channel.ex
85 lines (60 loc) · 1.85 KB
/
room_channel.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
defmodule DingMyBells.RoomChannel do
use Phoenix.Channel
def join(socket, room_id, _message) do
socket = assign(socket, :room_id, String.to_integer(room_id))
{:ok, socket}
end
def event(socket, "user:joined", message) do
if inactive_room(socket) do
room_id = get_assign(socket, :room_id)
user = Repo.insert %User{token: message["user_token"], room_id: room_id}
room = Room.find(room_id)
socket = assign(socket, :user, user)
broadcast_update(socket, room)
end
socket
end
def event(socket, "user:ready", _message) do
if inactive_room(socket) do
user = get_assign(socket, :user)
user = %{user | ready: true}
Repo.update user
room = get_assign(socket, :room_id) |> Room.find
broadcast_update(socket, room)
end
socket
end
def event(socket, "game:start", _message) do
room = get_assign(socket, :room_id) |> Room.find
if !room.active do
Repo.update %{room | active: true}
broadcast socket, "game:started", room_info(room)
end
socket
end
def leave(socket, _message) do
user = get_assign(socket, :user)
case user do
%User{} ->
Repo.delete user
_ ->
# noop
end
room = get_assign(socket, :room_id) |> Room.find
broadcast_update(socket, room)
socket
end
defp inactive_room(socket) do
Room.find(get_assign(socket, :room_id)).active == false
end
defp broadcast_update(socket, room) do
broadcast socket, "room:update", room_info(room)
end
defp room_info(room) do
users = room.users.all
present = users |> Enum.count
ready = users |> Enum.filter(fn(u) -> u.ready end) |> Enum.count
user_info = users |> Enum.sort(fn(u1, u2) -> u1.id < u2.id end) |> Enum.map(&(&1.token))
%{users_present: present, users_ready: ready, user_info: user_info}
end
end