Packages
game_server_sdk
1.0.1
1.0.1082
1.0.1079
1.0.1078
1.0.1077
1.0.1076
1.0.1075
1.0.1074
1.0.1073
1.0.1070
1.0.1068
1.0.1067
1.0.1063
1.0.1059
1.0.1058
1.0.1057
1.0.1056
1.0.1055
1.0.1050
1.0.1049
1.0.1048
1.0.1047
1.0.1046
1.0.1044
1.0.1043
1.0.1042
1.0.1041
1.0.1040
1.0.1039
1.0.1038
1.0.1034
1.0.1033
1.0.1029
1.0.1028
1.0.1026
1.0.1025
1.0.1024
1.0.1023
1.0.1022
1.0.1021
1.0.1020
1.0.1019
1.0.1018
1.0.1017
1.0.1016
1.0.1015
1.0.1014
1.0.1013
1.0.1012
1.0.1011
1.0.1009
1.0.1008
1.0.1007
1.0.1006
1.0.1005
1.0.1004
1.0.1003
1.0.1001
1.0.999
1.0.998
1.0.997
1.0.996
1.0.995
1.0.994
1.0.993
1.0.992
1.0.991
1.0.990
1.0.989
1.0.988
1.0.987
1.0.986
1.0.985
1.0.984
1.0.983
1.0.982
1.0.981
1.0.980
1.0.979
1.0.978
1.0.977
1.0.976
1.0.975
1.0.974
1.0.973
1.0.972
1.0.971
1.0.970
1.0.969
1.0.968
1.0.967
1.0.966
1.0.965
1.0.964
1.0.963
1.0.962
1.0.961
1.0.959
1.0.958
1.0.956
1.0.951
1.0.950
1.0.943
1.0.942
1.0.941
1.0.940
1.0.938
1.0.936
1.0.935
1.0.931
1.0.929
1.0.928
1.0.927
1.0.926
1.0.925
1.0.924
1.0.923
1.0.921
1.0.920
1.0.919
1.0.918
1.0.917
1.0.916
1.0.911
1.0.910
1.0.902
1.0.899
1.0.898
1.0.897
1.0.896
1.0.894
1.0.893
1.0.891
1.0.890
1.0.889
1.0.888
1.0.887
1.0.886
1.0.885
1.0.884
1.0.883
1.0.882
1.0.881
1.0.880
1.0.879
1.0.878
1.0.877
1.0.26
1.0.25
1.0.22
1.0.21
1.0.20
1.0.19
1.0.15
1.0.14
1.0.13
1.0.12
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.1.0
SDK for GameServer hooks development. Provides type specs, documentation, and IDE autocomplete for GameServer modules without requiring the full server.
Current section
Files
Jump to
Current section
Files
lib/game_server/hooks.ex
defmodule GameServer.Hooks do
@moduledoc """
Behaviour for GameServer hooks/callbacks.
Implement this behaviour in your hooks module to receive lifecycle events
from the GameServer and run custom game logic.
## Setup
1. Create a module implementing this behaviour
2. Configure it in your GameServer instance
## Example
defmodule MyGame.Hooks do
@behaviour GameServer.Hooks
@impl true
def after_user_register(user) do
# Give new users starting coins
GameServer.Accounts.update_user(user, %{
metadata: Map.put(user.metadata || %{}, "coins", 100)
})
end
@impl true
def after_user_login(user) do
# Log login
:ok
end
# Lobby hooks
@impl true
def before_lobby_create(attrs) do
# Validate or modify lobby creation attributes
{:ok, attrs}
end
@impl true
def after_lobby_create(_lobby), do: :ok
@impl true
def before_lobby_join(user, lobby, opts) do
# Check if user can join (e.g., level requirements)
{:ok, {user, lobby, opts}}
end
@impl true
def after_lobby_join(_user, _lobby), do: :ok
@impl true
def before_lobby_leave(user, lobby) do
{:ok, {user, lobby}}
end
@impl true
def after_lobby_leave(_user, _lobby), do: :ok
@impl true
def before_lobby_update(_lobby, attrs) do
{:ok, attrs}
end
@impl true
def after_lobby_update(_lobby), do: :ok
@impl true
def before_lobby_delete(lobby) do
{:ok, lobby}
end
@impl true
def after_lobby_delete(_lobby), do: :ok
@impl true
def before_user_kicked(host, target, lobby) do
{:ok, {host, target, lobby}}
end
@impl true
def after_user_kicked(_host, _target, _lobby), do: :ok
@impl true
def after_lobby_host_change(_lobby, _new_host_id), do: :ok
# Custom RPC handlers - define your own functions!
# These are called from game clients via the RPC channel.
#
# def give_coins(amount, opts) do
# caller = Keyword.get(opts, :caller)
# # Update user's coins...
# {:ok, %{new_balance: 150}}
# end
end
## Hook Types
### User Lifecycle Hooks
- `after_user_register/1` - Called after a new user registers
- `after_user_login/1` - Called after a user logs in
### Lobby Lifecycle Hooks
Before hooks can block operations by returning `{:error, reason}`.
After hooks are fire-and-forget.
- `before_lobby_create/1` - Before lobby creation, receives attrs map
- `after_lobby_create/1` - After lobby is created
- `before_lobby_join/3` - Before user joins lobby
- `after_lobby_join/2` - After user joins lobby
- `before_lobby_leave/2` - Before user leaves lobby
- `after_lobby_leave/2` - After user leaves lobby
- `before_lobby_update/2` - Before lobby is updated
- `after_lobby_update/1` - After lobby is updated
- `before_lobby_delete/1` - Before lobby is deleted
- `after_lobby_delete/1` - After lobby is deleted
- `before_user_kicked/3` - Before user is kicked from lobby
- `after_user_kicked/3` - After user is kicked from lobby
- `after_lobby_host_change/2` - After lobby host changes
## Custom RPC Functions
Any public function in your hooks module (other than the callbacks above)
can be called from game clients via the RPC channel. The function receives
its arguments plus a keyword list with `:caller` containing the authenticated user.
# Client calls: rpc("give_coins", {amount: 50})
def give_coins(amount, opts) do
caller = Keyword.get(opts, :caller)
# Your game logic here
{:ok, %{success: true}}
end
Return values:
- `{:ok, data}` - Success, data is sent back to client
- `{:error, reason}` - Error, reason is sent back to client
- `:ok` - Success with no data
"""
@typedoc "A user struct from GameServer.Accounts.User"
@type user :: GameServer.Accounts.User.t()
@typedoc "A lobby struct from GameServer.Lobbies.Lobby"
@type lobby :: GameServer.Lobbies.Lobby.t()
@typedoc "Result type for before hooks"
@type hook_result(t) :: {:ok, t} | {:error, term()}
# Startup/shutdown callbacks
@callback after_startup() :: any()
@callback before_stop() :: any()
# User lifecycle callbacks
@callback after_user_register(user()) :: any()
@callback after_user_login(user()) :: any()
# Lobby lifecycle callbacks
@callback before_lobby_create(attrs :: map()) :: hook_result(map())
@callback after_lobby_create(lobby()) :: any()
@callback before_lobby_join(user(), lobby(), opts :: keyword()) ::
hook_result({user(), lobby(), keyword()})
@callback after_lobby_join(user(), lobby()) :: any()
@callback before_lobby_leave(user(), lobby()) :: hook_result({user(), lobby()})
@callback after_lobby_leave(user(), lobby()) :: any()
@callback before_lobby_update(lobby(), attrs :: map()) :: hook_result(map())
@callback after_lobby_update(lobby()) :: any()
@callback before_lobby_delete(lobby()) :: hook_result(lobby())
@callback after_lobby_delete(lobby()) :: any()
@callback before_user_kicked(host :: user(), target :: user(), lobby()) ::
hook_result({user(), user(), lobby()})
@callback after_user_kicked(host :: user(), target :: user(), lobby()) :: any()
@callback after_lobby_host_change(lobby(), new_host_id :: integer()) :: any()
@doc """
Use this macro to get default implementations for all callbacks.
This allows you to only implement the callbacks you need.
## Example
defmodule MyGame.Hooks do
use GameServer.Hooks
@impl true
def after_user_register(user) do
# Only implement what you need
:ok
end
end
"""
defmacro __using__(_opts) do
quote do
@behaviour GameServer.Hooks
@impl true
def after_startup, do: :ok
@impl true
def before_stop, do: :ok
@impl true
def after_user_register(_user), do: :ok
@impl true
def after_user_login(_user), do: :ok
@impl true
def before_lobby_create(attrs), do: {:ok, attrs}
@impl true
def after_lobby_create(_lobby), do: :ok
@impl true
def before_lobby_join(user, lobby, opts), do: {:ok, {user, lobby, opts}}
@impl true
def after_lobby_join(_user, _lobby), do: :ok
@impl true
def before_lobby_leave(user, lobby), do: {:ok, {user, lobby}}
@impl true
def after_lobby_leave(_user, _lobby), do: :ok
@impl true
def before_lobby_update(_lobby, attrs), do: {:ok, attrs}
@impl true
def after_lobby_update(_lobby), do: :ok
@impl true
def before_lobby_delete(lobby), do: {:ok, lobby}
@impl true
def after_lobby_delete(_lobby), do: :ok
@impl true
def before_user_kicked(host, target, lobby), do: {:ok, {host, target, lobby}}
@impl true
def after_user_kicked(_host, _target, _lobby), do: :ok
@impl true
def after_lobby_host_change(_lobby, _new_host_id), do: :ok
defoverridable after_user_register: 1,
after_user_login: 1,
before_lobby_create: 1,
after_lobby_create: 1,
before_lobby_join: 3,
after_lobby_join: 2,
before_lobby_leave: 2,
after_lobby_leave: 2,
before_lobby_update: 2,
after_lobby_update: 1,
before_lobby_delete: 1,
after_lobby_delete: 1,
before_user_kicked: 3,
after_user_kicked: 3,
after_lobby_host_change: 2
end
end
end