Packages
islands_engine
0.1.37
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.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.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.13
0.2.12
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.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
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
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.0
Models the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/engine/game/server.ex
defmodule Islands.Engine.Game.Server do
use GenServer, restart: :transient
use PersistConfig
alias __MODULE__
alias __MODULE__.{
AddPlayer,
Error,
GuessCoord,
Info,
PositionAllIslands,
PositionIsland,
SetIslands,
Stop
}
alias Islands.Engine.Game.Tally
alias Islands.Engine.Game
@type from :: GenServer.from()
@type reply :: {:reply, Tally.t(), Game.t()}
@type request :: tuple
@type response :: tuple
@ets Application.get_env(@app, :ets_name)
# @reg Application.get_env(@app, :registry)
@spec start_link({String.t(), String.t(), pid}) :: GenServer.on_start()
def start_link({game_name, player1_name, pid}) do
import GenServer, only: [start_link: 3]
start_link(Server, {game_name, player1_name, pid}, name: via(game_name))
end
@spec start_link(Game.t()) :: GenServer.on_start()
def start_link(game),
do: GenServer.start_link(Server, game, name: via(game.name))
# @spec via(String.t()) :: {:via, module, {atom, tuple}}
# def via(game_name), do: {:via, Registry, {@reg, key(game_name)}}
@spec via(String.t()) :: {:global, tuple}
def via(game_name), do: {:global, key(game_name)}
@spec save(Game.t()) :: Game.t()
def save(game) do
:ok = Info.log(:save, game)
true = :ets.insert(@ets, {key(game.name), game})
game
end
@spec reply(Game.t(), Game.player_id()) :: reply
def reply(game, player_id), do: {:reply, Tally.new(game, player_id), game}
## Private functions
@spec key(String.t()) :: tuple
defp key(game_name), do: {Server, game_name}
@spec game(String.t(), String.t(), pid) :: Game.t()
defp game(game_name, player1_name, pid) do
case :ets.lookup(@ets, key(game_name)) do
[] -> game_name |> Game.new(player1_name, pid) |> save()
[{_key, game}] -> game
end
end
## Callbacks
@spec init({String.t(), String.t(), pid}) :: {:ok, Game.t()}
def init({game_name, player1_name, pid}),
do: {:ok, game(game_name, player1_name, pid)}
@spec init(Game.t()) :: {:ok, Game.t()}
def init(game), do: {:ok, game}
@spec handle_call(request, from, Game.t()) :: reply
def handle_call({:add_player, _, _} = request, from, game),
do: AddPlayer.handle_call(request, from, game)
def handle_call({:position_island, _, _, _, _} = request, from, game),
do: PositionIsland.handle_call(request, from, game)
def handle_call({:position_all_islands, _} = request, from, game),
do: PositionAllIslands.handle_call(request, from, game)
def handle_call({:stop, _} = request, from, game),
do: Stop.handle_call(request, from, game)
def handle_call({:set_islands, _} = request, from, game),
do: SetIslands.handle_call(request, from, game)
def handle_call({:guess_coord, _, _, _} = request, from, game),
do: GuessCoord.handle_call(request, from, game)
def handle_call({:tally, player_id}, _from, game), do: reply(game, player_id)
@spec terminate(term, Game.t()) :: true
def terminate(:shutdown = reason, game) do
:ok = Info.log(:terminate, reason, game)
true = :ets.delete(@ets, key(game.name))
end
def terminate(reason, game) do
:ok = Error.log(:terminate, reason, game)
true = :ets.delete(@ets, key(game.name))
end
end