Current section

Files

Jump to
islands_text_client lib islands text client interact.ex
Raw

lib/islands/text/client/interact.ex

defmodule Islands.Text.Client.Interact do
@moduledoc """
Interacts with a client playing the _Game of Islands_.
"""
use PersistConfig
alias Islands.Text.Client.{Player, RemoteProcedureCall, State}
@default_options Application.get_env(@app, :default_options)
@pause_range Application.get_env(@app, :pause_range)
defguard valid_game_args(game_name, player_name, options)
when is_binary(game_name) and is_binary(player_name) and
is_list(options)
@spec start(String.t(), String.t(), Keyword.t()) :: no_return
def start(game_name, player_name, options \\ [])
when valid_game_args(game_name, player_name, options) do
{mode, pause} = get_options(options)
game_name
|> RemoteProcedureCall.new_game(player_name)
|> State.new(:player1, player_name, mode, pause)
|> Player.play()
end
@spec join(String.t(), String.t(), Keyword.t()) :: no_return
def join(game_name, player_name, options \\ [])
when valid_game_args(game_name, player_name, options) do
{mode, pause} = get_options(options)
game_name
|> RemoteProcedureCall.add_player(player_name)
|> State.new(:player2, player_name, mode, pause)
|> Player.play()
end
## Private functions
@spec get_options(Keyword.t()) :: tuple
defp get_options(options) do
options = Keyword.merge(@default_options, options)
mode = options[:mode]
pause = options[:pause]
pause =
cond do
pause < @pause_range.first -> @pause_range.first
pause > @pause_range.last -> @pause_range.last
true -> pause
end
{mode, pause}
end
end