Packages
hangman_text_client
0.1.31
0.1.87
0.1.86
0.1.85
0.1.84
0.1.83
0.1.82
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
Text client for the Hangman Game.
Current section
Files
Jump to
Current section
Files
lib/hangman/text/client/interact.ex
defmodule Hangman.Text.Client.Interact do
@moduledoc """
Interacts with a client playing a _Hangman Game_.
"""
use PersistConfig
alias Hangman.{Engine, Game}
alias Hangman.Text.Client.{Player, State}
@doc """
Starts a game.
"""
@spec start :: no_return
def start do
engine_node()
|> new_game("#{node()}")
|> State.new()
|> Player.play()
end
## Private functions
@spec engine_node :: node
defp engine_node, do: get_env(:engine_node)
@spec new_game(node, Game.name()) :: Game.name() | no_return
defp new_game(engine_node, game_name) do
if Node.connect(engine_node) do
IO.puts("Connected to node #{inspect(engine_node)}...")
else
IO.puts("Cannot connect to node #{inspect(engine_node)}.")
self() |> Process.exit(:normal)
end
# Synchronizes the global name server with all nodes known to this node.
:ok = :global.sync()
# Remote procedure call to call a function on a remote node.
case :rpc.call(engine_node, Engine, :new_game, [game_name]) do
{:ok, _pid} ->
game_name
{:badrpc, :nodedown} ->
IO.puts("Hangman Engine node #{inspect(engine_node)} is down.")
self() |> Process.exit(:normal)
{:badrpc, {:EXIT, {:undef, _}}} ->
IO.puts("Hangman Engine not started on node #{inspect(engine_node)}.")
self() |> Process.exit(:normal)
error ->
exit(error)
end
end
end