|
1 | 1 | defmodule PointingPartyWeb.RoomChannel do |
2 | 2 | use PointingPartyWeb, :channel |
3 | 3 |
|
4 | | - alias PointingParty.Card |
5 | | - alias PointingPartyWeb.Presence |
6 | | - alias PointingParty.VoteCalculator |
7 | | - |
8 | 4 | def join("room:lobby", _payload, socket) do |
9 | 5 | send(self(), :after_join) |
10 | 6 |
|
11 | 7 | {:ok, socket} |
12 | 8 | end |
13 | 9 |
|
14 | 10 | def handle_info(:after_join, socket) do |
15 | | - push(socket, "presence_state", Presence.list(socket)) |
16 | | - {:ok, _} = Presence.track(socket, socket.assigns.username, %{}) |
17 | | - |
| 11 | + # handle Presence listing and tracking here |
18 | 12 | {:noreply, socket} |
19 | 13 | end |
20 | 14 |
|
21 | 15 | def handle_in("user_estimated", %{"points" => points}, socket) do |
22 | | - Presence.update(socket, socket.assigns.username, &(Map.put(&1, :points, points))) |
23 | | - |
24 | | - if everyone_voted?(socket) do |
25 | | - finalize_voting(socket) |
26 | | - end |
27 | | - |
| 16 | + # update votes for user presence |
| 17 | + # calculate votes if everyone voted with the help of the VoteCalculator |
| 18 | + # broadcast the 'winner'/'tie' event with a payload of %{points: points} |
28 | 19 | {:noreply, socket} |
29 | 20 | end |
30 | 21 |
|
31 | 22 | def handle_in("finalized_points", %{"points" => points}, socket) do |
32 | | - updated_socket = save_vote_next_card(points, socket) |
33 | | - broadcast!(updated_socket, "new_card", %{card: current_card(updated_socket)}) |
34 | | - {:reply, :ok, updated_socket} |
| 23 | + # update state by setting the current card to the next card |
| 24 | + # broadcast the "new_card" message with a payload of %{card: new_current_card} |
| 25 | + {:reply, :ok, socket} |
35 | 26 | end |
36 | 27 |
|
37 | 28 | def handle_in("start_pointing", _params, socket) do |
38 | 29 | updated_socket = initialize_state(socket) |
39 | | - broadcast!(updated_socket, "new_card", %{card: current_card(updated_socket)}) |
| 30 | + # broadcast the "new_card" message with a payload of %{card: current_card} |
40 | 31 | {:reply, :ok, updated_socket} |
41 | 32 | end |
42 | 33 |
|
43 | | - intercept ["new_card"] |
44 | | - |
45 | | - def handle_out("new_card", payload, socket) do |
46 | | - Presence.update(socket, socket.assigns.username, &(Map.put(&1, :points, nil))) |
47 | | - push(socket, "new_card", payload) |
48 | | - {:noreply, socket} |
49 | | - end |
50 | | - |
51 | | - |
52 | | - defp current_card(socket) do |
53 | | - socket.assigns |
54 | | - |> Map.get(:current) |
55 | | - |> Map.from_struct() |
56 | | - |> Map.drop([:__meta__]) |
57 | | - end |
58 | | - |
59 | | - defp everyone_voted?(socket) do |
60 | | - socket |
61 | | - |> Presence.list() |
62 | | - |> Enum.map(fn {_username, %{metas: [metas]}} -> Map.get(metas, :points) end) |
63 | | - |> Enum.all?(&(not is_nil(&1))) |
64 | | - end |
65 | | - |
66 | | - defp finalize_voting(socket) do |
67 | | - current_users = Presence.list(socket) |
68 | | - |
69 | | - {event, points} = VoteCalculator.calculate_votes(current_users) |
70 | | - broadcast!(socket, event, %{points: points}) |
71 | | - end |
72 | | - |
73 | 34 | defp initialize_state(%{assigns: %{cards: _cards}} = socket), do: socket |
74 | 35 | defp initialize_state(socket) do |
75 | 36 | [first | cards] = Card.cards() |
76 | 37 |
|
77 | 38 | socket |
78 | | - |> assign(:points, Card.points_range()) |
79 | 39 | |> assign(:unvoted, cards) |
80 | 40 | |> assign(:current, first) |
81 | 41 | end |
82 | | - |
83 | | - defp save_vote_next_card(points, socket) do |
84 | | - latest_card = |
85 | | - socket.assigns |
86 | | - |> Map.get(:current) |
87 | | - |> Map.put(:points, points) |
88 | | - |
89 | | - {next, remaining} = |
90 | | - socket.assigns |
91 | | - |> Map.get(:unvoted) |
92 | | - |> List.pop_at(0) |
93 | | - |
94 | | - socket |
95 | | - |> assign(:unvoted, remaining) |
96 | | - |> assign(:current, next) |
97 | | - |> assign(:voted, [latest_card | socket.assigns[:voted]]) |
98 | | - end |
99 | 42 | end |
0 commit comments