Packages
game_server_sdk
1.0.0
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/leaderboards.ex
defmodule GameServer.Leaderboards do
@moduledoc """
The Leaderboards context.
Provides server-authoritative leaderboard management. Scores can only be
submitted via server-side code — there is no public API for score submission.
## Usage
# Create a leaderboard
{:ok, lb} = Leaderboards.create_leaderboard(%{
slug: "weekly_kills",
title: "Weekly Kills",
sort_order: :desc,
operator: :incr
})
# Submit score (server-only): resolve the active leaderboard first and submit by integer ID
leaderboard = Leaderboards.get_active_leaderboard_by_slug("weekly_kills")
{:ok, record} = Leaderboards.submit_score(leaderboard.id, user_id, 10)
# List records with rank (use integer leaderboard id)
records = Leaderboards.list_records(leaderboard.id, page: 1, limit: 25)
# Get user's record (use integer leaderboard id)
{:ok, record} = Leaderboards.get_user_record(leaderboard.id, user_id)
**Note:** This is an SDK stub. Calling these functions will raise an error.
The actual implementation runs on the GameServer.
"""
@doc """
Gets a leaderboard by its integer ID.
## Examples
iex> get_leaderboard(123)
%Leaderboard{id: 123}
iex> get_leaderboard(999)
nil
"""
@spec get_leaderboard(integer()) :: GameServer.Leaderboards.Leaderboard.t() | nil
def get_leaderboard(_id) do
raise "GameServer.Leaderboards.get_leaderboard/1 is a stub - only available at runtime on GameServer"
end
@doc """
Creates a new leaderboard.
## Attributes
See `t:GameServer.Types.leaderboard_create_attrs/0` for available fields.
## Examples
iex> create_leaderboard(%{slug: "my_lb", title: "My Leaderboard"})
{:ok, %Leaderboard{}}
iex> create_leaderboard(%{slug: "", title: ""})
{:error, %Ecto.Changeset{}}
"""
@spec create_leaderboard(GameServer.Types.leaderboard_create_attrs()) ::
{:ok, GameServer.Leaderboards.Leaderboard.t()} | {:error, Ecto.Changeset.t()}
def create_leaderboard(_attrs) do
raise "GameServer.Leaderboards.create_leaderboard/1 is a stub - only available at runtime on GameServer"
end
@doc """
Updates an existing leaderboard.
Note: `slug`, `sort_order`, and `operator` cannot be changed after creation.
## Attributes
See `t:GameServer.Types.leaderboard_update_attrs/0` for available fields.
"""
@spec update_leaderboard(
GameServer.Leaderboards.Leaderboard.t(),
GameServer.Types.leaderboard_update_attrs()
) :: {:ok, GameServer.Leaderboards.Leaderboard.t()} | {:error, Ecto.Changeset.t()}
def update_leaderboard(_leaderboard, _attrs) do
raise "GameServer.Leaderboards.update_leaderboard/2 is a stub - only available at runtime on GameServer"
end
@doc """
Deletes a leaderboard and all its records.
"""
@spec delete_leaderboard(GameServer.Leaderboards.Leaderboard.t()) ::
{:ok, GameServer.Leaderboards.Leaderboard.t()} | {:error, Ecto.Changeset.t()}
def delete_leaderboard(_leaderboard) do
raise "GameServer.Leaderboards.delete_leaderboard/1 is a stub - only available at runtime on GameServer"
end
@doc """
Lists leaderboards with optional filters.
## Options
* `:slug` - Filter by slug (returns all seasons of that leaderboard)
* `:active` - If `true`, only active leaderboards. If `false`, only ended.
* `:order_by` - Order by field: `:ends_at` or `:inserted_at` (default)
* `:starts_after` - Only leaderboards that started after this DateTime
* `:starts_before` - Only leaderboards that started before this DateTime
* `:ends_after` - Only leaderboards that end after this DateTime
* `:ends_before` - Only leaderboards that end before this DateTime
* `:page` - Page number (default 1)
* `:page_size` - Page size (default 25)
## Examples
iex> list_leaderboards(active: true)
[%Leaderboard{}, ...]
iex> list_leaderboards(slug: "weekly_kills")
[%Leaderboard{}, ...]
iex> list_leaderboards(starts_after: ~U[2025-01-01 00:00:00Z])
[%Leaderboard{}, ...]
"""
@spec list_leaderboards(keyword()) :: [GameServer.Leaderboards.Leaderboard.t()]
def list_leaderboards(_opts) do
raise "GameServer.Leaderboards.list_leaderboards/1 is a stub - only available at runtime on GameServer"
end
@doc """
Submits a score for a user on a leaderboard.
This is a server-only function — there is no public API for score submission.
The score is processed according to the leaderboard's operator:
* `:set` — Always replace with new score
* `:best` — Only update if new score is better (respects sort_order)
* `:incr` — Add to existing score
* `:decr` — Subtract from existing score
To submit to a leaderboard by slug, first get the active leaderboard ID:
leaderboard = Leaderboards.get_active_leaderboard_by_slug("weekly_kills")
Leaderboards.submit_score(leaderboard.id, user_id, 10)
## Examples
iex> submit_score(123, user_id, 10)
{:ok, %Record{score: 10}}
iex> submit_score(123, user_id, 5, %{weapon: "sword"})
{:ok, %Record{score: 15, metadata: %{weapon: "sword"}}}
"""
@spec submit_score(integer(), integer(), integer(), map()) ::
{:ok, GameServer.Leaderboards.Record.t()} | {:error, term()}
def submit_score(_leaderboard_id, _user_id, _score, _metadata) do
raise "GameServer.Leaderboards.submit_score/4 is a stub - only available at runtime on GameServer"
end
@doc """
Lists records for a leaderboard, ordered by rank.
## Options
See `t:GameServer.Types.pagination_opts/0` for available options.
Returns records with `rank` field populated.
"""
@spec list_records(integer(), GameServer.Types.pagination_opts()) :: [
GameServer.Leaderboards.Record.t()
]
def list_records(_leaderboard_id, _opts) do
raise "GameServer.Leaderboards.list_records/2 is a stub - only available at runtime on GameServer"
end
@doc """
Gets a user's record with their rank.
Returns `{:ok, record_with_rank}` or `{:error, :not_found}`.
"""
@spec get_user_record(integer(), integer()) ::
{:ok, GameServer.Leaderboards.Record.t()} | {:error, :not_found}
def get_user_record(_leaderboard_id, _user_id) do
raise "GameServer.Leaderboards.get_user_record/2 is a stub - only available at runtime on GameServer"
end
@doc """
Deletes a user's record from a leaderboard.
Accepts either leaderboard ID (integer) or slug (string).
"""
@spec delete_user_record(integer() | String.t(), integer()) ::
{:ok, GameServer.Leaderboards.Record.t()} | {:error, :not_found}
def delete_user_record(_id_or_slug, _user_id) do
raise "GameServer.Leaderboards.delete_user_record/2 is a stub - only available at runtime on GameServer"
end
end