Packages
hangman_text_client
0.1.78
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.ex
# ┌──────────────────────────────────────────────────────────────┐
# │ Based on the course "Elixir for Programmers" by Dave Thomas. │
# └──────────────────────────────────────────────────────────────┘
defmodule Hangman.Text.Client do
@moduledoc """
Text client for the _Hangman Game_.
##### Based on the course [Elixir for Programmers](https://codestool.coding-gnome.com/courses/elixir-for-programmers) by Dave Thomas.
"""
use PersistConfig
alias __MODULE__.{Engine, Player, State}
alias Hangman.Game
@doc """
Starts locally or remotely a _Hangman Game_ named `game_name`.
The default value for `game_name` is provided by function
`Hangman.Game.random_name/0`.
If you wish to use releases, see [release notes](https://github.com/RaymondLoranger/hangman_text_client/blob/main/release%20notes.txt).
## LOCALLY WHEN LOCAL NODE IS NOT ALIVE
Start each client like so:
### *WITHOUT USING RELEASES*
```
cd hangman_text_client
iex -S mix
:observer.start() # optional
Hangman.Text.Client.start()
```
### *USING RELEASES*
#### Commmand shell
```
cd hangman_text_client
"_build/nonode/rel/hangman_text_client/bin/hangman_text_client" start_iex
:observer.start() # optional
Hangman.Text.Client.start()
```
#### PowerShell
```
cd hangman_text_client
_build/nonode/rel/hangman_text_client/bin/hangman_text_client start_iex
:observer.start() # optional
Hangman.Text.Client.start()
```
## REMOTELY WHEN LOCAL NODE IS ALIVE
App `:hangman_engine` must run on node `:hangman_engine@<hostname>` where
`<hostname>` is either the full host name if long names are used, or the first
part of the full host name if short names are used.
### *SHORT NAMES WITHOUT USING RELEASES*
Start the engine using a short name:
```
cd hangman_engine
iex --sname hangman_engine -S mix
:observer.start() # optional
```
Start a game from a different node with a short name:
#### Commmand shell
```
cd hangman_text_client
set "MIX_ENV=dev" && iex --sname mike -S mix
:observer.start() # optional
Hangman.Text.Client.start()
```
#### PowerShell
```
cd hangman_text_client
$Env:MIX_ENV = "dev"; iex --sname mike -S mix
:observer.start() # optional
Hangman.Text.Client.start()
```
### *LONG NAMES WITHOUT USING RELEASES*
Start the engine using a long name:
```
cd hangman_engine
iex --name hangman_engine@rays.supratech.ca -S mix
:observer.start() # optional
```
Start a game from a different node with a long name:
#### Commmand shell
```
cd hangman_text_client
set "MIX_ENV=prod" && iex --name mike@rays.supratech.ca -S mix
:observer.start() # optional
Hangman.Text.Client.start()
```
#### PowerShell
```
cd hangman_text_client
$Env:MIX_ENV = "prod"; iex --name mike@rays.supratech.ca -S mix
:observer.start() # optional
Hangman.Text.Client.start()
```
### *SHORT NAMES USING RELEASES*
Start the engine using a short name:
```
cd hangman_engine
iex --sname hangman_engine --cookie fortune -S mix
:observer.start() # optional
```
Start a game from a different node with a short name:
#### Command shell
```
cd hangman_text_client
set RELEASE_NODE=mike@rays
"_build/dev/rel/hangman_text_client/bin/hangman_text_client" start_iex
Hangman.Text.Client.start()
```
#### PowerShell
```
cd hangman_text_client
$Env:RELEASE_NODE = "mike@rays"
_build/dev/rel/hangman_text_client/bin/hangman_text_client start_iex
:observer.start() # optional
Hangman.Text.Client.start()
```
### *LONG NAMES USING RELEASES*
Start the engine using a long name:
```
cd hangman_engine
iex --name hangman_engine@rays.supratech.ca --cookie fortune -S mix
:observer.start() # optional
```
Start a game from a different node with a long name:
#### Commmand shell
```
cd hangman_text_client
set RELEASE_NODE=mike@rays.supratech.ca
"_build/prod/rel/hangman_text_client/bin/hangman_text_client" start_iex
:observer.start() # optional
Hangman.Text.Client.start()
```
#### PowerShell
```
cd hangman_text_client
$Env:RELEASE_NODE = "mike@rays.supratech.ca"
_build/prod/rel/hangman_text_client/bin/hangman_text_client start_iex
:observer.start() # optional
Hangman.Text.Client.start()
```
"""
@spec start(Game.name()) :: no_return
def start(game_name \\ Hangman.Game.random_name()) do
Engine.new_game(game_name) |> State.new() |> Player.play()
end
@doc ~S"""
Returns the hangman engine node.
## Examples
iex> alias Hangman.Text.Client
iex> engine_node = Client.engine_node()
iex> "#{engine_node}" =~ "hangman_engine@"
true
"""
@spec engine_node :: node
def engine_node, do: get_env(:engine_node)
end