Packages
islands_client_input
0.1.27
0.1.49
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
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
Prompts and accepts a move in the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/client/input/prompter.ex
defmodule Islands.Client.Input.Prompter do
alias IO.ANSI.Plus, as: ANSI
alias Islands.Client.Input.{Getter, Parser}
alias Islands.Client.State
alias Islands.Tally
# Hopefully enough time to flush any unprompted input...
@timeout_in_ms 2
@spec accept_move(State.t(), ANSI.ansilist()) :: State.t() | no_return
def accept_move(state, message \\ [])
def accept_move(state, []), do: do_accept_move(state)
def accept_move(state, message) do
:ok = Tally.summary(state.tally, state.player_id, message)
do_accept_move(state)
end
# Private functions
@spec do_accept_move(State.t()) :: State.t() | no_return
defp do_accept_move(%State{player_name: player_name} = state) do
true = flush_stdio(state)
[:light_white, "#{player_name}, your move (or help):", :reset, " "]
|> Getter.get_input(state)
|> Parser.parse_input(state)
end
@spec flush_stdio(State.t()) :: true
defp flush_stdio(%State{mode: mode, pause: pause} = _state)
when mode == :manual or pause > 10 do
pid = spawn(fn -> IO.read(:all) end)
:ok = Process.sleep(@timeout_in_ms)
true = Process.exit(pid, :kill)
end
defp flush_stdio(_state), do: true
end