Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Feb 9, 2021. It is now read-only.

Commit 457a1f3

Browse files
committed
Import all changes from Socket Auth chapter
1 parent 1283af5 commit 457a1f3

File tree

6 files changed

+75
-10
lines changed

6 files changed

+75
-10
lines changed

‎assets/elm/src/Games/Platformer.elm‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ port module Games.Platformer exposing (main)
22

33
import Browser
44
import Browser.Events
5-
import Html exposing (Html, button, div, h2, li, ul)
5+
import Html exposing (Html, button, div, h2, li, span, strong, ul)
66
import Html.Attributes
77
import Html.Events
88
import Json.Decode as Decode
@@ -43,7 +43,9 @@ type GameState
4343

4444

4545
type alias Gameplay =
46-
{ playerScore : Int
46+
{ gameId : Int
47+
, playerId : Int
48+
, playerScore : Int
4749
}
4850

4951

@@ -87,7 +89,9 @@ init _ =
8789

8890
decodeGameplay : Decode.Decoder Gameplay
8991
decodeGameplay =
90-
Decode.map Gameplay
92+
Decode.map3 Gameplay
93+
(Decode.field "game_id" Decode.int)
94+
(Decode.field "player_id" Decode.int)
9195
(Decode.field "player_score" Decode.int)
9296

9397

@@ -524,5 +528,18 @@ viewGameplaysList gameplays =
524528

525529
viewGameplayItem : Gameplay -> Html Msg
526530
viewGameplayItem gameplay =
531+
let
532+
displayPlayer =
533+
if gameplay.playerId == 0 then
534+
"Anonymous Player: "
535+
536+
else
537+
"Player " ++ String.fromInt gameplay.playerId ++ ": "
538+
539+
displayScore =
540+
String.fromInt gameplay.playerScore
541+
in
527542
li [ Html.Attributes.class "gameplay-item" ]
528-
[ text ("Player Score: " ++ String.fromInt gameplay.playerScore) ]
543+
[ strong [] [ text displayPlayer ]
544+
, span [] [ text displayScore ]
545+
]

‎assets/js/app.js‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ import "phoenix_html"
1414
// Phoenix Socket
1515
import { Socket } from "phoenix"
1616

17-
let socket = new Socket("/socket", {})
17+
let socketParams = (window.userToken == "") ? {} : { token: window.userToken };
18+
19+
let socket = new Socket("/socket", {
20+
params: socketParams
21+
})
1822

1923
socket.connect()
2024

@@ -42,9 +46,12 @@ if (platformer) {
4246
});
4347

4448
channel.on("broadcast_score", payload => {
45-
console.log(`Receiving ${payload.player_score} score data from Phoenix using the receivingScoreFromPhoenix port.`);
49+
console.log(`Receiving payload data from Phoenix using the receivingScoreFromPhoenix port.`);
50+
4651
app.ports.receiveScoreFromPhoenix.send({
47-
player_score: payload.player_score
52+
game_id: payload.game_id || 0,
53+
player_id: payload.player_id || 0,
54+
player_score: payload.player_score || 0
4855
});
4956
});
5057
}

‎lib/platform_web/channels/score_channel.ex‎

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,30 @@
11
defmodule PlatformWeb.ScoreChannel do
22
use PlatformWeb, :channel
33

4-
def join("score:platformer", _payload, socket) do
4+
def join("score:" <> game_slug, _payload, socket) do
5+
game = Platform.Products.get_game_by_slug!(game_slug)
6+
socket = assign(socket, :game_id, game.id)
57
{:ok, socket}
68
end
79

10+
# Broadcast for authenticated players
11+
def handle_in(
12+
"broadcast_score",
13+
%{"player_score" => player_score} = payload,
14+
%{assigns: %{game_id: game_id, player_id: player_id}} = socket
15+
) do
16+
payload = %{
17+
game_id: game_id,
18+
player_id: player_id,
19+
player_score: player_score
20+
}
21+
22+
IO.inspect(payload, label: "Broadcasting the score payload over the channel")
23+
broadcast(socket, "broadcast_score", payload)
24+
{:noreply, socket}
25+
end
26+
27+
# Broadcast for anonymous players
828
def handle_in("broadcast_score", payload, socket) do
929
broadcast(socket, "broadcast_score", payload)
1030
{:noreply, socket}

‎lib/platform_web/channels/user_socket.ex‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@ defmodule PlatformWeb.UserSocket do
1515
#
1616
# See `Phoenix.Token` documentation for examples in
1717
# performing token verification on connect.
18-
def connect(_params, socket, _connect_info) do
18+
def connect(%{"token" => token}, socket) do
19+
case Phoenix.Token.verify(socket, "user salt", token, max_age: 1209600) do
20+
{:ok, current_user_id} ->
21+
socket = assign(socket, :player_id, current_user_id)
22+
{:ok, socket}
23+
{:error, _} ->
24+
:error
25+
end
26+
end
27+
28+
def connect(_params, socket) do
1929
{:ok, socket}
2030
end
2131

‎lib/platform_web/router.ex‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule PlatformWeb.Router do
88
plug :protect_from_forgery
99
plug :put_secure_browser_headers
1010
plug PlatformWeb.PlayerAuthController, repo: Platform.Repo
11+
plug :put_user_token
1112
end
1213

1314
pipeline :api do
@@ -30,4 +31,13 @@ defmodule PlatformWeb.Router do
3031
resources "/gameplays", GameplayController, except: [:new, :edit]
3132
resources "/players", PlayerApiController, except: [:new, :edit]
3233
end
34+
35+
defp put_user_token(conn, _) do
36+
if current_user = conn.assigns[:current_user] do
37+
token = Phoenix.Token.sign(conn, "user salt", current_user.id)
38+
assign(conn, :user_token, token)
39+
else
40+
conn
41+
end
42+
end
3343
end

‎lib/platform_web/templates/layout/app.html.eex‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<p class="alert alert-danger" role="alert"><%= get_flash(@conn, :error) %></p>
3333
<%= render @view_module, @view_template, assigns %>
3434
</main>
35-
<script type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
35+
<script>window.userToken = encodeURIComponent("<%= assigns[:user_token] %>");</script>
36+
<script src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
3637
</body>
3738
</html>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /