Current section

Files

Jump to
islands_vue_client lib islands_vue_client_web controllers game_controller.ex
Raw

lib/islands_vue_client_web/controllers/game_controller.ex

defmodule Islands.Vue.ClientWeb.GameController do
use Islands.Vue.ClientWeb, :controller
alias Islands.Client.State
alias Islands.{Game, Player}
alias Phoenix.Token
@salt Application.get_env(:islands_vue_client, :salt)
plug :require_player
def new(conn, _params) do
game_name = Game.haiku_name()
%Player{name: name, gender: gender} = get_session(conn, :player)
conn
# Allows next player to join game from other tabs of same browser...
|> delete_session(:player)
|> show(State.new(game_name, :player1, name, gender, basic: true))
end
def join(conn, %{"id" => game_name} = _params) do
%Player{name: name, gender: gender} = get_session(conn, :player)
conn
# Allows next player to join game from other tabs of same browser...
|> delete_session(:player)
|> show(State.new(game_name, :player2, name, gender, basic: true))
end
## Private functions
defp show(
conn,
%State{game_name: game_name, player_id: player_id} = player_state
) do
conn
|> assign(:player_id, player_id)
|> assign(:game_url, Routes.game_url(conn, :join, game_name))
|> assign(:game_name, game_name)
|> assign(:auth_token, Token.sign(conn, @salt, player_state))
|> render("show.html")
end
defp require_player(conn, _opts) do
case get_session(conn, :player) do
nil ->
conn
|> put_session(:return_to, conn.request_path)
|> redirect(to: Routes.session_path(conn, :new))
|> halt()
_player ->
conn
end
end
end