Packages
islands_text_client
0.2.65
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.57
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.99
0.1.98
0.1.97
0.1.96
0.1.95
0.1.94
0.1.93
0.1.91
0.1.90
0.1.89
0.1.88
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.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
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Text client for the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/text/client.ex
# ┌───────────────────────────────────────────────────────────────────────┐
# │ Inspired by the book "Functional Web Development" by Lance Halvorsen. │
# │ Also inspired by the course "Elixir for Programmers" by Dave Thomas. │
# └───────────────────────────────────────────────────────────────────────┘
defmodule Islands.Text.Client do
@moduledoc """
Text client for the _Game of Islands_.
##### Inspired by the book [Functional Web Development](https://pragprog.com/titles/lhelph/functional-web-development-with-elixir-otp-and-phoenix/) by Lance Halvorsen.
##### Also inspired by the course [Elixir for Programmers](https://codestool.coding-gnome.com/courses/elixir-for-programmers) by Dave Thomas.
"""
use PersistConfig
alias __MODULE__.{Joiner, Starter}
alias Islands.{Game, Player}
@doc """
Lets player1 start a game on a remote node.
App `:islands_engine` must run on node `:islands_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
Start the engine using a short name:
```
cd islands_engine
iex --sname islands_engine -S mix
:observer.start # optional
```
Player1 starts a game from a different node with a short name:
```
cd islands_text_client
set "MIX_ENV=dev" && iex --sname client1 -S mix
Islands.Text.Client.start("Eden", "Adam", :m)
```
### Long names
Start the engine using a long name:
```
cd islands_engine
iex --name islands_engine@rays.supratech.ca -S mix
:observer.start # optional
```
Player1 starts a game from a different node with a long name:
```
cd islands_text_client
set "MIX_ENV=prod" && iex --name client1@rays.supratech.ca -S mix
Islands.Text.Client.start("Eden", "Adam", :m)
```
## Parameters
- `game_name` - game name (string)
- `player1_name` - player1 name (string)
- `gender` - gender as either `:f` or `:m` (atom)
- `options` - up to 2 options (keyword)
## Options
- `:mode` - (`:manual` or `:auto`) specifies whether player1 will play
in manual or auto mode; defaults to `:manual`.
- `:pause` - (nonnegative integer) specifies the duration in milliseconds
of the pause between moves in auto mode (should be between 0 and 10,000);
defaults to `0` milliseconds.
"""
@spec start(Game.name(), Player.name(), Player.gender(), keyword) :: no_return
defdelegate start(game_name, player1_name, gender, options \\ []), to: Starter
@doc """
Lets player2 join a game on a remote node.
### Short names
Player2 joins a game from a different node with a short name:
```
cd islands_text_client
set "MIX_ENV=dev" && iex --sname client2 -S mix
Islands.Text.Client.join("Eden", "Eve", :f)
```
### Long names
Player2 joins a game from a different node with a long name:
```
cd islands_text_client
set "MIX_ENV=prod" iex --name client2@rays.supratech.ca -S mix
Islands.Text.Client.join("Eden", "Eve", :f)
```
## Parameters
- `game_name` - game name (string)
- `player2_name` - player2 name (string)
- `gender` - gender as either `:f` or `:m` (atom)
- `options` - up to 2 options (keyword)
## Options
- `:mode` - (`:manual` or `:auto`) specifies whether player2 will play
in manual or auto mode; defaults to `:manual`.
- `:pause` - (nonnegative integer) specifies the duration in milliseconds
of the pause between moves in auto mode (should be between 0 and 10,000);
defaults to `0` milliseconds.
"""
@spec join(Game.name(), Player.name(), Player.gender(), keyword) :: no_return
defdelegate join(game_name, player2_name, gender, options \\ []), to: Joiner
@doc ~S"""
Returns the islands engine node.
## Examples
iex> alias Islands.Text.Client
iex> engine_node = Client.engine_node()
iex> "#{engine_node}" =~ "islands_engine@"
true
"""
@spec engine_node :: node
def engine_node, do: get_env(:engine_node)
end